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

Plsql 为另一个表中的每一行在一个表中插入多行,plsql,oracle11g,Plsql,Oracle11g,我有一个临时表,我想用它来填充另一个表。对于temp表中的每一行,我希望执行一个函数,该函数可能会导致为另一个表生成一个或多个记录 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)

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

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函数是否可以返回类似这样的iterable


我通常会用Perl或Python来实现这一点,但由于所有数据都在Oracle中,如果可以在数据库中完成的话,我不想浪费时间检索数据、计算数据,然后插入数据。临时表将有大约75000行,我预计第二个表将有550000行。

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

现在让我们来谈谈你的情况:

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中?您可以使用如下记录方式从函数中获取多个值:创建或替换类型记录\类型(x1号、x2号、x3号);然后您的函数:创建或替换函数get_rec_value return Record_Type作为My_Record_Type;开始从表2中的My_记录中选择X1、X2、X3,将您的条件置于其中,以获得一个RecResult;返回(我的记录);终止
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;