我正在编写一个PL / SQL过程,它根据输入变量执行选择,然后在select中为每个结果插入一行。由于我对PL / SQL的新意,我无法调试查询错误。我知道这一定很容易,但出于某种原因我被困在这里。谢谢你的帮助!
CREATE OR REPLACE PROCEDURE setup_name_map(ranking_id IN NUMBER, class_string IN VARCHAR2)
IS
BEGIN
FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES WHERE NAME = class_string)
LOOP
EXECUTE IMMEDIATE 'INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID) VALUES (' || rec.NAME_ID || ', ' || ranking_id || ')';
END LOOP;
END;
根据Oracle Developer Compiler ...'NAME_ID'是无效的标识符。我试过把它放在引号中,但没有骰子。它还抱怨循环索引变量'REC'的使用无效。非常感谢任何帮助。
答案 0 :(得分:46)
这里不需要动态SQL:
BEGIN
FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES
WHERE NAME = class_string)
LOOP
INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID)
VALUES (rec.NAME_ID, ranking_id);
END LOOP;
END;
更好的是你可以避免像这样的慢行逐行游标:
BEGIN
INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID)
SELECT NAME_ID, ranking_id FROM PRODUCT_NAMES
WHERE NAME = class_string;
END;
如果你真的需要动态SQL,你不应该将值连接到它中,而是使用绑定变量:
BEGIN
FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES
WHERE NAME = class_string)
LOOP
EXECUTE IMMEDIATE 'INSERT INTO NAME_RANKING
(NAME_ID, RANKING_ID) VALUES (:b1, :b2)
USING rec.NAME_ID, ranking_id;
END LOOP;
END;