zoukankan      html  css  js  c++  java
  • oracle中execute immediate的使用(select/insert/update/delete)(转)

    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 比以前可能用到的更容易并且更高效.
    当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异

     

  • 相关阅读:
    JSP基础(一)JSP介绍,文件结构及执行过程
    使用MyEclipse开发第一个Web程序
    Activity启动模式 Tasks和Back Stack
    XML的DOM解析 Java实现 例子二
    XML 命名空间(Namespace)
    HTTP基础:URL格式、 HTTP请求、响应、消息
    Android Log相关
    Tomcat环境配置
    XML DOM解析(Java)的一个简单实例
    JSP基础(三)JSP内置对象 利用application对象做一个简单的网页计数器
  • 原文地址:https://www.cnblogs.com/softidea/p/4821948.html
Copyright © 2011-2022 走看看