execute immediate的语法如下: execute immediate 'sql'; execute immediate 'sql_select' into var_1, var_2; execute immediate 'sql' using [in|out|in out] bind_var_1, [in|out|in out] bind_var_2; execute immediate 'sql_select' into var_1, var_2 using [in|out|in out] bind_var_1, [in|out|in out] bind_var_2; execute immediate 'sql' returning into var_1; execute immediate 'sql' bulk collect into indexed_var;
--动态命令的实用参考一( select ..into) --Execute immediate 命令在使用into关键字时与静态的plsql块中 --into关键字使用方法上的区别。 declare v_result varchar2(20); begin execute immediate 'select dname from scott.dept d where d.deptno=:1' Into v_result --:1这是一个绑定变量 Using 70; commit; dbms_output.put_line('结果为:'||v_result); end; --绑定变量,通俗的讲就是一个占位的参数,而后用using中的常量或者变量去找它的相应 Declare v_result Varchar2(20); Begin Select dname Into v_result From scott.dept d Where d.deptno=10; dbms_output.put_line(v_result); End; declare v_result varchar2(20); begin execute immediate 'select dname from scott.dept d where d.deptno=:1' Into v_result Using 70; commit; dbms_output.put_line('结果为:'||v_result); end; --动态命令的实用参考一( insert ..into) -- Begin Execute Immediate 'insert into scott.dept values (:1,:2,:3) ' Using 70,'IT','Beijing'; Commit; End; declare l_depnam varchar2(20) := 'testing'; l_loc varchar2(10) := 'Dubai'; begin execute immediate 'insert into scott.dept values (:1, :2, :3)' using 60, l_depnam, l_loc; commit; end; ---尽享动态执行sql的execute immediate的命令使用的魅力。 --对比静态的测试,和动态测试。 Declare v_result Varchar2(20); Begin v_result:=mypackage.myfun1(10); dbms_output.put_line(v_result); mypackage.mypro1(20020101,v_result); dbms_output.put_line(v_result); End; --Select * From student s Where s.student_id=20020101; ---Select * From testtable Where recordnumber=10; Declare v_result Varchar2(20); Begin --动态执行函数 Execute Immediate 'begin :1:=mypackage.myfun1(:2); end;' Using Out v_result,In 10; Commit; dbms_output.put_line(v_result); --动态执行存储过程 Execute Immediate 'begin mypro1(:1,:2); end;' Using In 20020101,Out v_result; Commit; dbms_output.put_line(v_result); End; --动态执行update语句实例: create or replace function f_testweekday return integer is v_sql varchar(2000); i_sendcount integer; begin --_' || f_getweekday() || ' v_sql := 'update t_push_smstemp_inform set sendcount=sendcount+1 returning sendcount into :1'; execute immediate v_sql using out i_sendcount; return 0; exception when others then rollback; return 0; end f_testweekday;
http://blog.csdn.net/tanshi/article/details/7083964
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; 对于处理动态语句,EXECUTE IMMEDIATE 比以前可能用到的更容易并且更高效. 当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异