plsql EXECUTE IMMEDIATE .

PLSQL中 EXECUTE IMMEDIATE语句
  
    先说说绑定变量
   ":"称绑定变量指示符,解释如下:
   它是用户放入查询中的占位符,它会告诉Oracle" 现在生成一个方案框架,实际执
   行语句的时候,会提供应该使用的实际值"。
   例子如下:
   select * from emp where dep='sale'; //不使用绑定变量
   select * from emp where dep=:sale //使用绑定变量
   一般在 procedure or function 中使用,可以优化共享池的使用。
    两句的区别很明显,后者多一个占位符,这个以冒号开始的变量可以灵活地执行不
   同条件的where语句,这是动态SQL语句。
  1、 语法:
  
    EXECUTE IMMEDIATE dynamic_string
    [INTO {define_variable[,define_variable]…| record}]
    [USING [IN | OUT | IN OUT] bind_argument[,[IN | OUT \ IN OUT] bind_argumnet]…]
    [{RETURNING | RETURN} INTO bing_argument[,bind_argument]…];
  2、 用法
    处理DDL操作(CREATE,ALTER,DROP)
    CREATE OR REPLACE PROCEDURE drop_table(table_name VARCHAR2)
    IS
     Sql_statemet VARCHAR2(100);
    BEGIN
     Sql_statement:=’DROP TABLE’ || table_name;
     EXECUTE IMMEDIATE sql_statement;
    END;
    /
    建立过程drop_table后,调用如下:
    SQL> exec drop_table(‘worker’)
    处理DCL操作(GRANT REVOKE)
    SQL> conn system/manager
    CREATE OR REPLACE PROCEDURE grant_sys_priv(priv VARCHAR2,username VARCHAR2)
    IS
     Sql_stat VARCHAR2(100);
    BEGIN
     Sql_stat:=’GRANT “ || priv|| ’ TO ’|| username;
    EXECUTE IMMEDIATE sql_stat;
    END;
    /
    调用
    SQL> exec grant_sys_priv(‘CREATE SESSION’,’SCOTT’)
    处理DML操作(INSERT UPDATE DELETE)
    如果DML语句带有占位符,那么在E I语句中则要带USING子句
    如果DML语句带有RETURNING子句,那么E I语句中要带有RETURNINGINTO子句
    例子,处理单行查询:
    DECLARE
     sql_stat VARCHAR2(100);
     emp_record tbl%ROWTYPE;
    BEGIN
     sql-stat:='SELECT * FROM tbl WHERE tblno=:no';
     EXECUTE IMMEDIATE sql_stat INTO emp_record USING &1;
     dbms_output.put_line(emp_record.ename||emp_record.sal);
    END;
    /

转至:http://blog.tianya.cn/blogger/post_read.asp?BlogID=1789305&PostID=14628638

猜你喜欢

转载自alwarse.iteye.com/blog/1740003