一步选择几个表的并集

时间:2015-02-18 22:52:30

标签: oracle11g oracle10g

我是Oracle 11g的新手,我试图通过在select语句中为每一列附加文本并使用游标存储结果来生成一个大字符串。但是,我希望最后一个声明没有包含所有联合。最后的结果我想构建每行生成的大字符串,或者只是在可能的情况下执行结果。

注意:column1有一个我感兴趣的模式列表。

select 'select * from ' || column1 || '.' || column2 || ' union all ' from mytable

这是column1是架构的地方,column2是表名。

在不使用rtrim删除最后一个字符串的情况下生成最终字符串的最简单方法是什么。是否有一种简单的方法可以自动将所有这些行追加到字符串中?

最终目标是实际将联合执行到生成的游标中。

1 个答案:

答案 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中的所有者和表名称的情况不匹配,则会导致问题而不是解决问题。