Oracle动态执行语句(Execute Immediate)

转载 2014年03月03日 16:27:10

一。为什么要使用动态执行语句?

       由于在PL/SQL 块或者存储过程中只支持DML语句及控制流语句,并不支持DDL语句,所以Oracle动态执行语句便应允而生了。关于DDL与DML的区别,请参见:DDL语句与DML语句及DCL和TCL

二。动态执行语句怎么用?     

     动态执行语句代替了Oracle 8i中的DBMS_SQL Package包。

     1)在PL/SQL中运行SQL语句,例如:

       示例一:

        BEGIN 
              EXECUTE IMMEDIATE 'select count(username) from user_users';     --DML每条语句必须以分号结尾
       END;

       示例二:

       BEGIN
               EXECUTE IMMEDIATE  'ALTER TABLE a RENAME TO EXAMPLE';    --DDL
        END;

        你可能会问不是只DDL语句需要用动态语句执行吗?是的,你说的完全正确。但是DML语句用动态语句执行也可以。

        即:DDL语句只能用动态执行语句来执行,DML语句亦可用动态语句来执行。

    2)使用using给动态语句传值,例如:

         DECLARE
                e_name VARCHAR2(10); --声明变量e_name
                e_age INT;                        --声明变量e_age
         BEGIN
                e_name :=  'sillylaura';      --给变量e_name赋值
                e_age := 21;                     --给变量e_age 赋值
                EXECUTE IMMEDIATE 'insert into Example values(seq_add_by_one.nextval,:2,:3)' using e_name,e_age;  --DML             END;

    3)使用动态语句赋值(select 列名 into 变量 from ……)

         DECLARE
                        temp INT;
         BEGIN
                        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM dual'  INTO temp; --DML

                        dbms_output.put_line(temp);
         END;

     4)传递并检索值:into用在using之前。

         DECLARE
                   temp INT;
                   test VARCHAR2(10);
         BEGIN
                 test := 'ok';
                 EXECUTE immediate 'SELECT COUNT(*) FROM dual where dummy = :1 GROUP BY dummy' INTO temp USING test;
                 dbms_output.put_line(temp ||'  '|| test);
         EXCEPTION WHEN OTHERS  THEN 
                 dbms_output.put_line('It has no data!');
         END;

三。动态语句小结

  1. DDL语句只能用动态执行语句来执行,DML语句亦可用动态语句来执行。
  2. 在使用select……into子句为变量赋值时,into字句必须写在单引号外面。
  3. 在同时使用select……into子句和using时,注意二者的顺序:into用在using之前,且都在单引号外面。
  4. 注意写上必要的异常错误处理。

oracle 动态sql执行-EXECUTE IMMEDIATE

转载:http://www.cnblogs.com/huanghai223/archive/2011/06/29/2093660.html -- 使用技巧 1. EXECUTE IMMED...
  • An342647823
  • An342647823
  • 2012年11月29日 10:32
  • 2926

oracle execute immediate 动态执行SQL存储过程

oracle execute immediate(转)(   2011-05-08 17:43:38|  分类: oracle|举报|字号 订阅 当我们碰到有一类存...
  • chengyingmingcheng
  • chengyingmingcheng
  • 2014年07月08日 22:55
  • 5131

oracle EXECUTE IMMEDIATE动态执行sql及异常信息打印

oracle内置的EXECUTE IMMEDIATE可以用来解析并执行动态sql语句,动态拼写的sql中可以使用USING 参数1,参数2....来绑定变量。当拼写比较复杂的sql时,可能会出现一些脚...
  • zz_cl
  • zz_cl
  • 2017年06月06日 21:51
  • 1094

Oracle 动态SQL execute immediate写法

Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者。试验步骤如下: 1. DDL 和 DML /*** DDL ***/ ...
  • suntimv
  • suntimv
  • 2017年02月14日 14:22
  • 310

Oracle 用Execute执行带有参数的字符串语句。

//A代表表,aa,bb,cc代表3个列,para1,para2代表你想要使用的参数 (1)  v_sqlStr       VARCHAR2(4000); (2)  sqlStr :='selec...
  • qq416647781
  • qq416647781
  • 2014年11月26日 17:45
  • 2433

Oracle (触发器)execute immediate 'sql语句'

create or replace trigger 名 before or after DML(Insert ,uodate ,delete)on 表名 begin 执行语句 end; /...
  • sd8089730
  • sd8089730
  • 2013年08月24日 13:09
  • 890

oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题

--问题描述:  用户在存储过程中调用execute immediate 执行 create table语句报错 ORA-01031,  并且反映直接执行该语句无报错。 --原因 根据问题...
  • royzhang7
  • royzhang7
  • 2016年04月17日 11:31
  • 4034

动态SQL(nds语句)中的execute immediate语句

使用原生动态SQL(NDS)时,可以使用EXCUTE IMMEDIATE语句来立即执行指定的SQL语句,语法如下:                 EXECUTEIMMEDIATE SQL_st...
  • keven2840
  • keven2840
  • 2017年09月05日 19:37
  • 205

ORACLE 执行EXECUTE IMMEDIATE没反应

在用oracle的时候,我写了个存储过程,如下:create or replace procedure pro_table_create(tableName in varchar2, ...
  • czmchen
  • czmchen
  • 2010年11月12日 10:26
  • 2548

Oracle中的动态SQL的execute immediate 的各种语法

查询语句: 单条记录: execute immediate  'select a.dummy from dual' into v_dummy; 多条记录: execute immedia...
  • u011497426
  • u011497426
  • 2014年05月25日 19:12
  • 705
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle动态执行语句(Execute Immediate)
举报原因:
原因补充:

(最多只允许输入30个字)