[转]ORACLE 动态执行SQL语句

本文转自:http://zhaisx.iteye.com/blog/856472

Oracle 动态SQL
Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者。试验步骤如下:

1. DDL 和 DML

  1. /*** DDL ***/
  2. begin
  3. EXECUTE IMMEDIATE 'drop table temp_1';
  4. EXECUTE IMMEDIATE 'create table temp_1(name varchar2(8))';
  5. end;
  6. /*** DML ***/
  7. declare
  8. v_1 varchar2(8);
  9. v_2 varchar2(10);
  10. str varchar2(50);
  11. begin
  12. v_1:='测试人员';
  13. v_2:='北京';
  14. str := 'INSERT INTO test (name ,address) VALUES (:1, :2)';
  15. EXECUTE IMMEDIATE str USING v_1, v_2;
  16. commit;
  17. end;

2. 返回单条结果

  1. declare
  2. str varchar2(500);
  3. c_1 varchar2(10);
  4. r_1 test%rowtype;
  5. begin
  6. c_1:='测试人员';
  7. str:='select * from test where name=:c WHERE ROWNUM=1';
  8. execute immediate str into r_1 using c_1;
  9. DBMS_OUTPUT.PUT_LINE(R_1.NAME||R_1.ADDRESS);
  10. end ;

3. 返回结果集

    1. CREATE OR REPLACE package pkg_test as
    2. /* 定义ref cursor类型
    3. 不加return类型,为弱类型,允许动态sql查询,
    4. 否则为强类型,无法使用动态sql查询;
    5. */
    6. type myrctype is ref cursor;
    7. --函数申明
    8. function get(intID number) return myrctype;
    9. end pkg_test;
    10. /
    11. CREATE OR REPLACE package body pkg_test as
    12. --函数体
    13. function get(intID number) return myrctype is
    14. rc myrctype; --定义ref cursor变量
    15. sqlstr varchar2(500);
    16. begin
    17. if intID=0 then
    18. --静态测试,直接用select语句直接返回结果
    19. open rc for select id,name,sex,address,postcode,birthday from
    20. student;
    21. else
    22. --动态sql赋值,用:w_id来申明该变量从外部获得
    23. sqlstr := 'select id,name,sex,address,postcode,birthday from student
    24. where id=:w_id';
    25. --动态测试,用sqlstr字符串返回结果,用using关键词传递参数
    26. open rc for sqlstr using intid;
    27. end if;
    28. return rc;
    29. end get;
    30. end pkg_test;
    31. /
上一篇:JSP如何在servlet将一个数据模型对象传递给jsp页面


下一篇:语句调优基础知识-set statistics io on