为另一个表中的每一行在1个表中插入多行

时间:2014-03-11 04:41:59

标签: plsql oracle11g

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

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行。

1 个答案:

答案 0 :(得分:0)

仅在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;