----------------------------以下是怎么取出动态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;