【Oracle】存储过程中将动态SQL的多行结果进行循环遍历

【Oracle】存储过程中将动态SQL的多行结果进行循环遍历

需求背景:
有一段拼接出来的动态SQL,结果为多行,需要在函数或者存储过程中将其结果作为游标中的数据循环遍历出来以便后续数据操作

使用动态SQL和隐式游标

隐式游标不支持动态SQL的直接使用,但是可以通过EXECUTE IMMEDIATE来执行动态SQL并将结果存储在一个集合中,然后遍历这个集合,以实现这个需求

示例:

直接执行动态sql得到的结果是

image

使用隐式游标+EXECUTE IMMEDIATE组成的测试文件


declare
    dynamic_sql varchar2(4000);
    type temp_table_type is table of table1%rowtype;--此处表名要与动态SQL中的一致,视图也可以
    temp_data temp_table_type;
begin
    -- 动态拼接sql语句
    dynamic_sql := 'select a.* from table1 a where 1=1';

    -- 执行动态sql并将结果存储在集合中
    execute immediate dynamic_sql bulk collect into temp_data;

    -- 遍历集合
    for i in temp_data.first .. temp_data.last loop
        dbms_output.put_line('kindcode: ' || temp_data(i).kindcode || ', activecode: ' || temp_data(i).activecode);
    end loop;
end;

执行后输出

image

这样就能实现要求了

PS:如果表名是动态查询SQL中的变量,那么可以创建一个临时表名tableXXX,将其中的字段设置成你要输出的字段名,同时动态SQL中的查询结构也用这个临时表的字段名来起别名,这样一样可以达到查询内容的效果

例如

    --此处表名要与动态SQL中的一致,视图也可以,制作一个临时表
    --create table tableXXX (value1 varchar2(200))
    type temp_table_type is table of tableXXX%rowtype;
    temp_data temp_table_type;
	
	...
	
        --根据表名查询组织
        p_sql1 := 'select distinct ' || p_colname || ' as value1 from ' ||
                  p_tablename ||
                  ' tableXXX where id = ' ||
                  p_id || ' and ' || p_colname || ' is not null';
	 
	 ...

posted @ 2024-08-21 10:30  DbWong_0918  阅读(587)  评论(0)    收藏  举报