【发布时间】:2015-12-05 16:14:44
【问题描述】:
我的任务是构建一个过程,该过程根据另一个表中的值将值插入到新表中,包括包含不同 SELECT 语句的字符串的列。
我正在使用的表有一个ID 列,一个ITEM1 和ITEM2 列,以及一个SRC_CODE 列,其中包含例如。 (SELECT KEY FROM FACT_TABLE WHERE DAY_ID = V_DAY_ID AND some other condition)。因此,此过程必须在执行之前填充 V_DAY_ID 变量。将插入到新表中的值将是来自ITEM1 和ITEM2 列的值,以及来自SRC_CODE 列中的select 语句的关联KEYs(数千个结果)。我是 PL/SQL 的新手,所以我在构建这个过程时有点迷茫。
以下是我整理的内容,即使它不正确,但它应该让您了解我想要完成的工作:
CREATE OR REPLACE PROCEDURE METRICS (DAY_ID IN NUMBER)
IS
CURSOR CUR_ITEMS IS
SELECT ID, ITEM1, ITEM2 FROM METRICSTABLE;
CURSOR CUR_SRC_CODE IS
SELECT ID, SRC_CODE FROM METRICSTABLE;
VDAY_ID NUMBER;
V_KEY INTEGER;
BEGIN
VDAY_ID := DAY_ID;
FOR i IN CUR_SRC_CODE LOOP
EXECUTE IMMEDIATE SRC_CODE INTO V_KEY;
END LOOP;
FOR REC IN CUR_ITEM LOOP
INSERT INTO KEY_METRICS (KEY, ITEM1, ITEM2, CRE_DT)
VALUES (V_KEY, ITEM1, ITEM2, SYSDATE);
COMMIT;
END LOOP;
END;
【问题讨论】:
-
使用“using”子句读取执行立即数以传入参数值。
-
不需要光标:
insert into key_metrics (key, item1, item2, cre_dt) select ...将更加更有效率。此外,除了最后一个之外,您还抛出了来自CUR_SRC_CODE光标的所有结果。我很确定这也不是你想要的。 -
感谢您的意见。如何在 insert into select 语句中处理来自
execute immediate SRC_CODE的结果集?我有数千个由SRC_CODE选择语句字符串产生的键,它们需要与ITEM1和ITEM2与SRC_CODE列成行的值相关联。 -
你想如何将结果存储在
V_KEY,逗号分隔值? (例如ID, SRC_CODE,ID, SRC_CODE,ID, SRC_CODE, .... etc)。 -
我认为游标是最好的选择的原因是,我可以在循环执行时从
SRC_CODE语句的执行中提取每个单独的KEY,附加相应的ITEM1和ITEM2值,然后将记录插入到目标表中。这不能与嵌套循环一起使用吗?
标签: oracle stored-procedures plsql dynamic-sql