【问题标题】:How to duplicate rows with a column change for a list of tables?如何复制表列表的列更改的行?
【发布时间】: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 吗?您只需要使用您想要传递给它的任何内容构建一个字符串。

标签: oracle plsql


【解决方案1】:

您不能创建在解析时不知道该语句的 SQL 语句。因此,您不能将变量作为表名。您要查找的是Dynamic SQL,这是一个相当复杂的主题,但基本上您最终会使用DBMS_SQL 构建SQL 语句,或者使用EXECUTE IMMEDIATE 将语句作为字符串运行。

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多