http://database.ctocio.com.cn/38/12238038.shtml

EXECUTE IMMEDIATE代替了以前Oracle中DBMS_SQL package包. 下面就为您介绍Oracle中EXECUTE IMMEDIATE的使用技巧,供您参考……

  EXECUTE IMMEDIATE代替了以前Oracle中DBMS_SQL package包. 下面就为您介绍Oracle中EXECUTE IMMEDIATE的使用技巧,供您参考。

  它解析并马上执行动态的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;

====

http://space.itpub.net/756652/viewspace-700456

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;

用法实例:
Declare
        v_table varchar2(20);
        v_sql Varchar2(100);
        Begin
             v_table:='hqf.testtable';
             v_sql:='select * from '||v_table;
             dbms_output.put_line(v_table);
             dbms_output.put_line(v_sql);
           Execute Immediate v_sql;
        End;

Declare
       v_sid Integer:=20020101;
       v_sql Varchar2(100);
       v_result Varchar2(50);
Begin
     --v_sid:=12;
     v_sql:='Select loc into v_result from scott.dept d where d.deptno=:1 ';

dbms_output.put_line(v_sql);
     --dbms_output.put_line(v_result);
     Execute Immediate v_sql
     Using 10 ;
     Commit;

End;

--动态命令的实用参考一( 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;

Oracle中EXECUTE IMMEDIATE的使用技巧相关推荐

  1. oracle中execute是什么意思,oracle中EXECUTEIMMEDIATE是什么意思?如何使用,请用自己......

    导航:网站首页 > oracle中EXECUTEIMMEDIATE是什么意思?如何使用,请用自己... oracle中EXECUTEIMMEDIATE是什么意思?如何使用,请用自己... 匿名网 ...

  2. oracle中execute函数,Oracle 动态SQL execute immediate写法 zt

    Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者.试验步骤如下: 1. DDL 和 DML/*** DDL ***/ begin EXEC ...

  3. oracle execute immediate 报错,oracle中execute immediate的使用(select/insert/update/delete)...

    execute immediate的语法如下: execute immediate 'sql'; execute immediate 'sql_select' into var_1, var_2; e ...

  4. oracle中execute函数,oracle Execute Immediate(sql语句)

    慕尼黑的夜晚无繁华 Example 1:Output:ABCDECLARE TYPE var_typ IS TABLE OF VARCHAR2(4000); cVars var_typ; cVar V ...

  5. Oracle中删除数据的一个小技巧

    在我带的某个Project中,在开发阶段需要Reload相同的Data到Oracle中来进行测试,因此需要不断的删除数据,简单的Delete操作似乎就OK了,但其实不然.我们到知道建表的时候需要Tab ...

  6. mysql execute immediate_PostgreSQL中function中实现类似Oracle的execute immediate的功能

    PostgreSQL中function中实现类似Oracle的execute immediate和dbms_output_putline的功能 首先需要说明的是,PostgreSQL中没有像Oracl ...

  7. [转]JDBC中日期时间的处理技巧

    Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等. java.uti ...

  8. jdbc读取mysql时分秒yyyy-mm-dd hh:_[转]JDBC中日期时间的处理技巧

    Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等. java.uti ...

  9. Oracle中动态SQL详解

    1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一 ...

最新文章

  1. printf格式化输出几点注记
  2. 关于pyecharts 地图显示添加数据的问题
  3. 【机器学习】特征工程概述
  4. 华山论剑之iOStableView的双剑合璧
  5. 在Eclipse中制作SSH配置文件提示插件
  6. SharePoint Foundation和SharePoint Server的区别
  7. 成功解决Exception unhandled ImportError DLL load failed: 找不到指定的程序。 lib\imp.py, Line: 343
  8. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - A. 组队
  9. 【大话Hibernate】Hibernate两种实体关系映射详解
  10. TCP为什么是四次挥手
  11. ElasticSearch wildcard查询(英文检索)
  12. B - 简单暴力(计算今年第几天)
  13. cmd换行 windows_键盘键位修改及管理(Windows篇)
  14. 总结命令行05:Kafka
  15. 【微信小游戏】微信小游戏开发设置竖屏
  16. 推荐4个方便实用的软件神器,非常适合程序员
  17. sql语句中case when和as用法
  18. 组装台式计算机需要哪些硬件,电脑硬件有哪些?组装一台电脑需要哪些配件详解...
  19. python用matplotlib作图时,x轴为时间轴,如何让x轴每隔几个点显示一次?
  20. DELPHI 控件的相对坐标与屏幕坐标转换

热门文章

  1. HarmonyOS之常用布局PositionLayout的使用
  2. SQL开发技巧 join从句
  3. 【Linux】一步一步学Linux——yes命令(248)
  4. [Ubuntu] Ubuntu系统环境变量详解
  5. 2011年全国软件大赛模拟题及参考答案(Java高职组)
  6. 录制出来的是黑屏_打开好哈录屏或者OBS直播软件黑屏问题解决,亲测有效!
  7. 每天一道LeetCode-----将数值数组按一定顺序拼接,使得拼接的结果最大
  8. IA-32 Intel手册学习笔记(三)任务切换
  9. 每天一道LeetCode-----平面木桶最大容量,以较小的纵坐标为高,横坐标差为底
  10. mysql providername,c#访问各数据库的providerName各驱动