【发布时间】:2021-11-21 18:09:27
【问题描述】:
举个例子:
BEGIN
FOR r IN (
SELECT * FROM table_one WHERE change_id = 0
) LOOP
r.change_id := -1;
INSERT INTO table_one VALUES r;
END LOOP;
END;
这会向 table_one 插入具有完全相同内容的新行,除了将列 change_id 的预期更改为值 -1。我不必像在 INSERT INTO table_one (change_id, ...) SELECT -1, ... FROM table_one WHERE change_id=0; 中那样指定脚本中的列
它工作得很好。但是如何修改此脚本以使用表列表?这些表的内部结构不同,但都有必要的列change_id。
当然,最简单的解决方案是复制并粘贴此 sn-p x-times 并替换其中的修复表名称。但是是否可以选择使用数组中的表列表?
我的做法是这样的:
DECLARE
TYPE tablenamearray IS VARRAY(30) OF VARCHAR2(30);
tablenames tablenamearray;
BEGIN
tablenames := tablenamearray('TABLE_ONE', 'TABLE_TWO', 'TABLE_THREE'); -- up to table 30...
FOR i IN tablenames.first..tablenames.last LOOP
/* Found no option to use tablenames(i) here with dynamic SQL */
END LOOP;
END;
注意:没有像 id 这样的技术主键,后面有序列。主键由三列构建,包括。 change_id 列。
【问题讨论】:
-
你能用 EXECUTE IMMEDIATE 吗?您只需要使用您想要传递给它的任何内容构建一个字符串。