【问题标题】:select the union of several tables together in a single step一步选择多个表的并集
【发布时间】:2015-02-18 22:52:30
【问题描述】:

我是 Oracle 11g 的新手,我正在尝试通过在 select 语句中为每一列附加文本并使用游标来存储结果来生成一个大字符串。但是,我希望最后一条语句不包含所有联合。最终结果我想构建生成的每一行的大字符串,或者尽可能简单地执行结果。

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

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

这里 column1 是架构,column2 是表名。

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

最终目标实际上只是将联合执行到结果游标中。

【问题讨论】:

  • 你是如何构建字符串的 - 将结果附加到游标循环中?最后的字符串可能有多长?大于 varchar2 的大小限制?
  • 我正在构建一个 varchar2 用于测试目的。它比 32k 小得多。

标签: oracle11g oracle10g


【解决方案1】:

如果您在循环中查询,我根本不会尝试将字符串构造为选择的一部分;我会在循环中完成这一切。类似(未经测试):

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;

rn检查不是将union all添加到除最后一行之外的每一行的末尾,而是将其添加到除第一行之外的每一行的开始,这样更容易检测。

我还将模式和表名用双引号括起来,以防您必须处理任何带引号的标识符。但是,如果您存储的值与 all_tables 中所有者和表名的大小写不匹配,这将导致问题而不是解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2013-02-24
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多