Oracle 取出动态sql 执行的结果的两种方式

6 篇文章 0 订阅

----------------------------以下是怎么取出动态sql执行结果的两种方式---------------------------------------------

第一种:直接  execute   immediate  ‘insert into   newTable  (id,name ) select id,name from dual’; 执行后 放到一个新的表里  

第二种方式:放到REF CURSOR 声明REF游标 

该方式分为两种:

第一种取出整表的所有列(USER_LOG  为我数据库中的表 ,自己测试需替换为自己的表)

create or replace procedure testdesclare1  is
v_sql varchar2(1000);
tp1 varchar2(100);
tp2 varchar2(50);
  
tp8 varchar2(50);
tp9 varchar2(50);
 
begin

    select to_char(sysdate,'yyyy')||'0101' into tp9 from dual; 
    select to_char(sysdate,'yyyyMMdd') into tp8 from dual;
   
    tp1:='select * from USER_LOG where to_char(operate_time,'||'''yyyyMMdd'''||')';
    tp2:=' between '||tp9||' and '||tp8;
    --拼接动态sql语句
    v_sql :=tp1||tp2;
    --declare是执行一个代码块,开始有declare  begin end;为结构体 。 一个存储过程begin end 中只能声明一个declare
    declare
      --声明一个行类型变量USER_LOG%ROWTYPE  其中USER_LOG 与上面动态sql中的 查询表名一致
    r_emp USER_LOG%ROWTYPE;  --声明一个行类型变量
    TYPE c_type IS REF CURSOR; --声明REF游标类型
    cur   c_type; --声明REF游标类型的变量 
    begin   -- 结构体开始
     Open  cur For  v_sql; 
        loop
         fetch cur into r_emp;
         exit when cur%notfound;
         dbms_output.put_line(r_emp.id||'='||r_emp.result);--取出里面的列值
         /*结果是一个list:5175=共成功导入1条数据
                                     5176=共成功导入1条数据
          */
        end loop;
      close cur; 
     end; -- 结构体结束

end testdesclare1;

第一种取出表中的其中几列(USER_LOG  为我数据库中的表 ,自己测试需替换为自己的表)

create or replace procedure testdesclare1  is
v_sql varchar2(1000);
tp1 varchar2(100);
tp2 varchar2(50);
  
tp8 varchar2(50);
tp9 varchar2(50);
 
begin

    select to_char(sysdate,'yyyy')||'0101' into tp9 from dual; 
    select to_char(sysdate,'yyyyMMdd') into tp8 from dual;
   
    tp1:='select  id,result from USER_LOG where to_char(operate_time,'||'''yyyyMMdd'''||')';
    tp2:=' between '||tp9||' and '||tp8;
    --拼接动态sql语句
    v_sql :=tp1||tp2;


    --declare是执行一个代码块,开始有declare  begin end;为结构体 。 -一个存储过程begin end 中只能声明一个declare
    declare
    --声明一个行类型变量USER_LOG%ROWTYPE  其中USER_LOG 与上面动态sql中的 查询表名一致
    r_emp_id USER_LOG.id%TYPE;  --声明一个列类型变量,与上面的整表不一致 

    r_emp_result USER_LOG.result%TYPE;  --声明一个列类型变量,与上面的整表不一致 
    TYPE c_type IS REF CURSOR; --声明REF游标类型
    cur   c_type; --声明REF游标类型的变量 
    begin -- 结构体开始
     Open  cur For  v_sql; 
        loop
         fetch cur into r_emp_id ,r_emp_result ;
         exit when cur%notfound;
         dbms_output.put_line(r_emp_id||'='||r_emp_result);--取出里面的列值
         /*结果是一个list:5175=共成功导入1条数据
                                     5176=共成功导入1条数据
          */
        end loop;
      close cur; 
     end; -- 结构体结束

end testdesclare1;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值