sql - Oracle SQL 中的 FOR 循环或将 SQL 应用于多个 Oracle 表
问题描述
我的 SQL 有点生疏,所以我什至不知道以下是否可行:
我有多个表t_a
,具有相同的列布局t_b
,t_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 中可能吗?或者我需要为此用另一种语言构建一个包装器吗?
解决方案
那么,该操作的结果将是 3 个新表?T_A_AGGREGATE
,T_B_AGGREGATE
和T_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;
好的; 我知道查询并不是那么简单,但没有太大变化——只有CREATE
and中的表名FROM
(也许在其他地方,但这或多或少是“它”)。任何体面的文本编辑器的搜索/替换功能都应该能够快速完成。
如果您想在循环中动态地执行它(阅读:PL/SQL),您可以 - 但动态 SQL 无法扩展,难以维护,调试起来很痛苦。因此,如果您只执行一次,请考虑运行 3 个单独的语句。
如何动态地做到这一点?
您必须创建一个包含整个 DDL 语句的字符串(我们通常将它们放入本地声明的变量中)。为什么?因为否则您无法从 PL/SQL 执行 DDL。
如果涉及多个表和/或列,则必须将语句的“固定”部分(如create table
, select
, from
, order by
)与“动态”部分(如列名)连接起来。请注意,在两者之间您必须连接逗号作为分隔符。注意使用多个单引号,因为您必须转义它们(或使用 q-quoting 机制)。
此外,对于多个列,您可能必须在循环中执行此操作,将每个新列连接到先前组成的字符串。
它(存储在变量中的语句)由EXECUTE IMMEDIATE
. 如果写得正确,它就会成功。否则,它会失败,但它不会告诉你失败的原因(这就是我说“难调试”的原因)。
因此,我们通常不执行它,而是显示该字符串(使用dbms_output.put_line
),以便我们查看它的外观并 - 使用复制/粘贴 - 尝试执行它。
基本上,它可能非常复杂——正如我所说——难以维护和调试。
推荐阅读
- guile - 配置说没有找到 guile-config
- django - 如何进行查询以获取 Django ORM 中每个组的最后一个元素?
- python - 在 Python 中对来自不同类别的 n 长度数组的分类数据进行编码
- heroku - 在 Heroku 上使用 Redis 的服务器端 Flask 会话
- jquery - 如何使用输入文本和选择对数据表应用高级搜索?
- html - CSS:对齐表单选项
- java - 当Api返回响应时,如何以角度显示“登录失败。请重试”消息?
- spring - 将非英文字符存储到mysql数据库
- javascript - JSON.parse(null) 和 JSON.parse(false) 不应该抛出异常吗?
- c++ - 分配长度 char* 参数的 std::regex_search 在 VS2017 中不起作用?