静态SQL用于完成特定的功能,动态SQL用于灵活的处理各种数据      

PS:执行动态SQL语句,需要将SQL语句存放到字符串变量中,且SQL语句可以包含占位符(以冒号开始)
     占位符例子: select * from test where name=:1; --红色表示占位符  

   1、定义:
          动态SQL是指在运行PL/SQL块的时动态输入的SQL语句。
   2、使用动态SQL的条件:
          1)执行DDL语句 如:create,alter,drop
          2)执行DCL语句  如:grant,revoke
          3)执行更加灵活的SQL语句 如:在select语句中使用不通的where条件
   3、动态SQL的处理方法
          1)使用EXECUTE IMMEDIATE语句 (用的最多)
                    a、处理DDL操作   --在PL/SQL块中只能用动态SQL
                    b、处理DCL操作   --在PL/SQL块中只能用动态SQL
                    c、处理DML操作                  M=manipulation  处理,操作
                    d、处理单行查询操作
          2)使用OPEN-FOR,FETCH和CLOSE语句(会一点
          3)使用批量动态SQL(基本不会
例子:
  (1)带返回值
           declare
          user_number number(3);
          v_sql       varchar2(1000);
        begin
          v_sql := 'update hkb_test3 a
                  set a.age =  :a+15
                 where a.user_id = :b returning a.age into :user_number';
          execute immediate v_sql
            using &a, &b
          returning into user_number; (红色三行是一句SQL语句)
          dbms_output.put_line('user_number :' || user_number);
        end;
  (2)不带返回值
        declare                            
          v_sql varchar2(100);             
        begin                              
          v_sql := 'update hkb_test3 a     
                  set a.age=  :a' || '     
                 where a.user_id= :b';     
          execute immediate v_sql          
            using &a,&b;                   
        end;                                
  (3)游标实现多行查询
           declare
          type agecursor is ref cursor; 
          v_age  agecursor;              --定义游标变量
          v_name hkb_test%rowtype; (继承表的行属性)
          v_sql  varchar2(1000);
        begin
          v_sql := 'select * from hkb_test where age=:a';
          open v_age for v_sql     
            using &a;                  --打开游标变量
          loop
            fetch v_age
              into v_name;
            exit when v_age%notfound;
            dbms_output.put_line(v_name.name || 'age:' || v_name.age);
          end loop;                    --循环提取数据
          close v_age;                --关闭游标变量
        end;
 

PS:在动态SQL中使用BULK子句,暂时没用到,以后遇到在好好研究!

posted on 2007-10-19 17:10  简单男人!  阅读(906)  评论(0编辑  收藏  举报