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

     

  • 相关阅读:
    LeetCode(111) Minimum Depth of Binary Tree
    LeetCode(108) Convert Sorted Array to Binary Search Tree
    LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode(99) Recover Binary Search Tree
    【Android】通过经纬度查询城市信息
    【Android】自定义View
    【OpenStack Cinder】Cinder安装时遇到的一些坑
    【积淀】半夜突然有点想法
    【Android】 HttpClient 发送REST请求
  • 原文地址:https://www.cnblogs.com/softidea/p/4821948.html
Copyright © 2011-2022 走看看