我是Oracle 11g的新手,我试图通过在select语句中为每一列附加文本并使用游标存储结果来生成一个大字符串。但是,我希望最后一个声明没有包含所有联合。最后的结果我想构建每行生成的大字符串,或者只是在可能的情况下执行结果。
注意:column1有一个我感兴趣的模式列表。
select 'select * from ' || column1 || '.' || column2 || ' union all ' from mytable
这是column1是架构的地方,column2是表名。
在不使用rtrim删除最后一个字符串的情况下生成最终字符串的最简单方法是什么。是否有一种简单的方法可以自动将所有这些行追加到字符串中?
最终目标是实际将联合执行到生成的游标中。
答案 0 :(得分:1)
如果你在循环中查询,我不会尝试将字符串构造为select的一部分;我会在循环中完成所有操作。像(未经测试)的东西:
declare
str varchar2(32768);
begin
for rec in (select column1, column2, rownum as rn from mytable)
loop
if rec.rn > 1 then
str := str || ' union all ';
end if;
str := str || 'select * from "' || rec.column[ || '"."' || rec.column2 ||'"';
end loop;
-- do something with str e.g. display to verify the syntax
-- before using in a cursor
dbms_output.put_line(str);
end;
union all
检查意味着它被添加到除第一行之外的每一行的 start ,而不是将rn
添加到除最后一行之外的每一行的末尾,这更容易被发现。
我还将模式和表名包装在双引号中,以防您必须处理任何带引号的标识符。但是,如果您的存储值与all_tables
中的所有者和表名称的情况不匹配,则会导致问题而不是解决问题。