惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
博客园 - Franky
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
博客园 - 司徒正美
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
博客园_首页
S
SegmentFault 最新的问题
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
H
Help Net Security
MongoDB | Blog
MongoDB | Blog

博客园 - 简单男人!

rowid 删除重复记录!!! 十条“金玉良言” Oracle优化器(Optimizer)! ORACLE 纯粹行列转换!! oracle 行列统计转换!!! 鱼和水的故事!!! oracle日期函数2! oracle中case语句 别人的语录! oracle优化,hint的使用! 几米语录 oracle的游标和例子! 几米经典语录! - 简单男人! - 博客园 oracle数据库导入导出命令! 如何完全卸载oracle linux系统下oracle计划任务脚本 oracle表的操作! oracle数据库select的学习! Oracle 条件语句和循环语句的学习(1)
动态SQL--灵活操作各种数据!
简单男人! · 2007-10-19 · via 博客园 - 简单男人!

静态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子句,暂时没用到,以后遇到在好好研究!