我有一个临时表,我想用它来填充另一个表。对于临时表中的每一行,我想执行一个函数,该函数可能导致为另一个表生成一个或多个记录。
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行。
答案 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;