【问题标题】:Insert multiple rows into 1 table for each row in another table对于另一个表中的每一行,将多行插入到 1 个表中
【发布时间】:2014-03-11 13:30:54
【问题描述】:

我有一个临时表,我想用它来填充另一个表。对于临时表中的每一行,我都想执行一个函数,该函数可能会为另一个表生成一条或多条记录。

DECLARE
   CURSOR cur IS SELECT col1, col2, col3 FROM table1;
BEGIN
   FOR rec 
   IN cur
   LOOP
-- Pseudo Code Follows
      FOR result 
        IN somefunction(rec.col1, rec.col2)
        INSERT INTO table2
        (col1, col2, col3, calculated_value)
        VALUES
        (rec.col1, rec.col2, rec.col3, result.calculated_value)
      END LOOP;

   END LOOP;
END;

这样做有意义吗?

Oracle PL/SQL 函数能否返回类似这样的可迭代内容?

我通常会在 Perl 或 Python 中执行此操作,但由于所有数据都在 Oracle 中,我不想浪费时间检索数据、计算数据,然后插入数据,如果这一切都可以在数据库。临时表将有大约 75000 行,我预计第二个表将有 550000 行。

【问题讨论】:

    标签: plsql oracle11g


    【解决方案1】:

    在 Oracle 中只创建一次临时表(ONCE 并且仅 ONCE 不是每个会话) 您插入其中的行仅对您的会话可见,并在您结束会话(或事务结束,取决于您使用的“ON COMMIT”子句)时自动删除。 示例:

    CREATE GLOBAL TEMPORARY TABLE temp_table
    (col1 number,
     col2 DATE,
     col3 varchar2(20)
     )   ON COMMIT DELETE ROWS;
    

    现在来谈谈你的情况:

    CURSOR C
          IS
           SELECT col1, col2, col3 FROM temp_table;
    X_calculated_value VARCHAR2 (1000);
    BEGIN
    --Your temporary table should be filled in the session
    FOR I IN C
          LOOP
             select somefunction(I.col1, I.col2) into X_calculated_value from dual;
             IF calculated_value ..YourCodition
             THEN
                INSERT INTO table2
            (col1, col2, col3, calculated_value)
            VALUES
            (I.col1, I.col2, I.col3, X_calculated_value)
             ELSE
                //do something also
             END IF;
          END LOOP;
    
    END;
    

    【讨论】:

    • 我的问题更多的是关于函数的。一个函数能否返回多个结果?如果可能,如何迭代结果以插入表 2?
    • 您可以通过使用如下记录方式从函数中获取多个值:创建或替换类型 Record_Type(x1 number, x2 number, x3 number);那么你的函数:创建或替换函数 get_rec_value 返回 Record_Type 作为 My_Record Record_Type;开始从 Table2 中选择 X1、X2、X3 到 My_Record where PutYourConditionToHaveOneRecResult ;返回(我的记录);结束;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2020-03-11
    • 2014-02-14
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多