首页 > 解决方案 > Oracle SQL 中的 FOR 循环或将 SQL 应用于多个 Oracle 表

问题描述

我的 SQL 有点生疏,所以我什至不知道以下是否可行:

我有多个表t_a,具有相同的列布局t_bt_c我想对它们应用相同的操作,即将一些聚合输出到另一个表中。对于一个表t_x,它看起来像这样:

CREATE TABLE t_x_aggregate (
    <here the col definitions which are the same for all new tables t_[abc]_aggregate>
);

INSERT INTO t_x_aggregate(id, ...)
SELECT id, SUM(factor*amount)
FROM t_x
WHERE some fixed condition
GROUP BY id;

我现在想围绕这个执行类似于 FOR 循环的东西:

for t_x in t_a, t_b, t_c
    CREATE TABLE ...
    INSERT INTO ...
end for

这在 SQL 中可能吗?或者我需要为此用另一种语言构建一个包装器吗?

标签: sqloracleoracle18c

解决方案


那么,该操作的结果将是 3 个新表?T_A_AGGREGATE,T_B_AGGREGATET_C_AGGREGATE?

我认为最快的方法是编写 3 个单独的CREATE TABLE语句,例如

create table t_a_aggregate as
  select id, sum(factor * amount) suma
  from t_a
  where some_condition
  group by id;

create table t_b_aggregate as
  select id, sum(factor * amount) suma
  from t_b
  where some_condition
  group by id;

create table t_c_aggregate as
  select id, sum(factor * amount) suma
  from t_c
  where some_condition
  group by id;

好的; 我知道查询并不是那么简单,但没有太大变化——只有CREATEand中的表名FROM(也许在其他地方,但这或多或少是“它”)。任何体面的文本编辑器的搜索/替换功能都应该能够快速完成。

如果您想在循环中动态地执行它(阅读:PL/SQL),您可以 - 但动态 SQL 无法扩展,难以维护,调试起来很痛苦。因此,如果您只执行一次,请考虑运行 3 个单独的语句。


如何动态地做到这一点?

您必须创建一个包含整个 DDL 语句的字符串(我们通常将它们放入本地声明的变量中)。为什么?因为否则您无法从 PL/SQL 执行 DDL。

如果涉及多个表和/或列,则必须将语句的“固定”部分(如create table, select, from, order by)与“动态”部分(如列名)连接起来。请注意,在两者之间您必须连接逗号作为分隔符。注意使用多个单引号,因为您必须转义它们(或使用 q-quoting 机制)。

此外,对于多个列,您可能必须在循环中执行此操作,将每个新列连接到先前组成的字符串。

它(存储在变量中的语句)由EXECUTE IMMEDIATE. 如果写得正确,它就会成功。否则,它会失败,但它不会告诉你失败的原因(这就是我说“难调试”的原因)。

因此,我们通常不执行它,而是显示该字符串(使用dbms_output.put_line),以便我们查看它的外观并 - 使用复制/粘贴 - 尝试执行它。

基本上,它可能非常复杂——正如我所说——难以维护和调试。


推荐阅读