`

EXECUTE IMMEDIATE动态SQL的使用总结

 
阅读更多

EXECUTE IMMEDIATE 在某些情况下代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。

-- 使用技巧


1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交
如果通过EXECUTE IMMEDIATE处理DML命令,
那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分.
如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据

2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.

3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号.

4. 在Oracle手册中,未详细覆盖这些功能。
下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.

5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能.


EXECUTE IMMEDIATE -- 用法例子


1. 在PL/SQL运行DDL语句


begin
   execute immediate 'set role all';
end;


2. 给动态语句传值(USING 子句)


declare
   l_depnam varchar2(20) := 'testing';
   l_loc     varchar2(10) := 'Dubai';
   begin
   execute immediate 'insert into dept values   (:1, :2, :3)'
     using 50, l_depnam, l_loc;
   commit;
end;


3. 从动态语句检索值(INTO子句)


declare
   l_cnt     varchar2(20);
begin
   execute immediate 'select count(1) from emp'
     into l_cnt;
   dbms_output.put_line(l_cnt);
end;


4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.
黓认为IN类型,其它类型必须显式指定


declare
   l_routin    varchar2(100) := 'gen2161.get_rowcnt';
   l_tblnam    varchar2(20) := 'emp';
   l_cnt       number;
   l_status    varchar2(200);
begin
   execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
     using in l_tblnam, out l_cnt, in out l_status;

   if l_status != 'OK' then
      dbms_output.put_line('error');
   end if;
end;


5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量


declare
   type empdtlrec is record (empno   number(4),
                            ename   varchar2(20),
                            deptno   number(2));
   empdtl empdtlrec;
begin
   execute immediate 'select empno, ename, deptno ' ||
                    'from emp where empno = 7934'
     into empdtl;
end;


6. 传递并检索值.INTO子句用在USING子句前


declare
   l_dept     pls_integer := 20;
   l_nam      varchar2(20);
   l_loc      varchar2(20);
begin
   execute immediate 'select dname, loc from dept where deptno = :1'
     into l_nam, l_loc
     using l_dept ;
end;


7. 多行查询选项.对此选项用insert语句填充临时表,
用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.

declare
   l_sal    pls_integer := 2000;
begin
   execute immediate 'insert into temp(empno, ename) ' ||
                    '           select empno, ename from emp ' ||
                    '           where   sal > :1'
     using l_sal;
   commit;
end;

分享到:
评论

相关推荐

    动态SQL之EXECUTE IMMEDIATE

    然而,使用动态SQL时也需要注意一些潜在的风险,比如SQL注入。由于SQL语句是在运行时构建的,如果用户可以控制SQL的一部分,他们可能会试图注入恶意代码。因此,确保对用户输入进行适当的验证和清理至关重要。 在...

    oracle动态sql之EXECUTE IMMEDIATE.docx

    在上面的示例中,我们使用 EXECUTE IMMEDIATE 语句来执行动态 SQL 语句,包括动态 DDL、动态 DML insert 和动态 DML select。这些示例展示了 EXECUTE IMMEDIATE 语句的使用方法和灵活性,使得开发者可以根据需要灵活...

    Oracle中EXECUTE IMMEDIATE用法

    在使用`EXECUTE IMMEDIATE`时,异常处理变得尤为重要,因为动态执行的SQL语句可能会引发各种异常,如数据类型不匹配、SQL语法错误或权限问题。因此,建议在实际应用中使用`EXCEPTION`块来捕获并处理可能出现的异常...

    execute immediate 用法研究

    Execute Immediate 是 Oracle 中的一个功能强大且灵活的语句,它可以解析并马上执行动态的 SQL 语句或非运行时创建的 PL/SQL 块。 Execute Immediate 的目标是减小企业费用并获得较高的性能,较之以前它相当易于编码...

    EXECUTE IMMEDIATE用法小结

    动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 — 使用技巧 ...

    用execute immediate 执行备份恢复SQLSVR数据库

    总的来说,使用动态SQL和存储过程可以在SQL Server中自动化备份和恢复过程,从而提高效率并减少人为错误。不过,务必注意操作的安全性和正确性,尤其是在处理敏感数据时。在执行任何备份和恢复操作之前,确保你有...

    Gbase8s动态sql的介绍

    在 Gbase8s 中,可以使用 execute immediate 语句来执行动态 SQL,execute immediate 需要在存储过程中使用。 例如,创建一个存储过程,可以用来创建表。以下是一个示例代码: create or replace procedure create...

    在Oracle中执行动态SQL

    "Oracle中执行动态SQL" Oracle中执行动态SQL是指在...Oracle中执行动态SQL可以使用动态游标或EXECUTE IMMEDIATE两种方法。动态游标可以实现灵活的SQL语句生成,而EXECUTE IMMEDIATE可以提供高性能的动态SQL执行。

    Oracle动态SQL之本地动态SQL的使用.pdf

    使用动态SQL时还应注意异常处理。当执行动态SQL语句出现问题时,应该捕获异常并处理,比如通过DBMS_OUTPUT包输出错误信息。 总结来说,Oracle本地动态SQL通过提供一种在程序运行时构建和执行SQL语句的能力,极大地...

    静态、动态sql及各种游标

    动态SQL则是指利用EXECUTE IMMEDIATE语句执行的SQL语句,这种方式可以在运行时动态生成SQL语句的内容。 一、静态SQL 静态SQL是指在PL/SQL中直接运行的SQL语句,例如SELECT、INSERT、UPDATE、DELETE等语句。这种...

    oracle关于动态SQL的使用

    本篇文章主要介绍了如何在PL/SQL中使用动态SQL,包括两种主要方法:本地动态SQL和DBMS_SQL包。 首先,让我们了解一下静态SQL与动态SQL的区别。静态SQL是指在编写PL/SQL块时已经明确的SQL语句,它们在编译时就已经...

    oracle 动态SQL

    Oracle 动态SQL是数据库编程中的一个重要概念,它允许在运行时构建和执行SQL语句,从而提高了灵活性和适应性。...正确理解和使用动态SQL可以极大地增强数据库应用程序的功能和适应性,但同时也需要注意安全性和性能。

    PowerBuilder下动态SQL语句的使用.pdf

    "PowerBuilder下动态SQL语句的使用" 本文主要介绍了PowerBuilder下动态SQL语句的使用方法和特点,以及其在数据库前端开发中的应用。 一、动态SQL语句特点 在PowerBuilder下,动态SQL语句有明显的特点和优势。与...

    PB动态SQL语句

    使用动态 SQL 语句可以使程序更加灵活、通用和高效。 三、动态 SQL 语句的应用场景 动态 SQL 语句可以应用于各种场景,例如: * 创建数据库表、索引、视图等数据库对象 * 执行数据操作,例如插入、更新、删除记录...

    oracle动态函数执行[文].pdf

    这段代码中,动态SQL语句`sql_str`被构造出来,然后使用`EXECUTE IMMEDIATE`执行,将结果赋值给变量`vnum`。 另一个例子展示了如何处理带入参的动态SQL,比如调用自定义函数`pubcode.pubgetmaxnum`: ```sql v_sql...

    动态SQL四种类型的语句格式

    1. **动态SQL Format 1: EXECUTE IMMEDIATE** 这是最简单的动态SQL形式,直接在一行中执行SQL语句。例如,`EXECUTE IMMEDIATE`后跟一个字符串变量或直接的SQL语句。在示例中,字符串变量`MysqlMysql`包含了创建...

    本地动态SQL的开发

    `EXECUTE IMMEDIATE`语句是处理动态SQL的主要手段之一。它允许开发者执行动态构建的SQL语句或匿名PL/SQL块。该语句的基本语法如下: ```sql EXECUTE IMMEDIATE dynamic_string [INTO {define_variable[, define_...

    Oracle中动态SQL详解

    2. **批量数据处理**:比如批量更新或插入数据时,可以使用动态SQL来构造合适的SQL语句。 3. **元数据操作**:例如创建表、修改表等DDL语句,这些操作往往需要根据具体情况动态生成。 动态SQL的优点包括: - **灵活...

    6. 动态SQL语句.ppt

    使用动态SQL需要注意安全问题,因为动态SQL通常涉及用户输入,如果不正确处理,可能导致SQL注入攻击。因此,建议使用绑定变量(BIND ARGUMENTS)来防止这类攻击,如: ```sql DECLARE delete_stmt1 VARCHAR2(128)...

Global site tag (gtag.js) - Google Analytics