PL/SQL为select中的每个结果插入1行

Cra*_*aig 18 plsql for-loop procedure insert

我正在编写一个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;
Run Code Online (Sandbox Code Playgroud)

根据Oracle Developer Compiler ...'NAME_ID'是无效的标识符.我试过把它放在引号中,但没有骰子.它还抱怨循环索引变量'REC'的使用无效.任何帮助深表感谢.

Ton*_*ews 49

这里不需要动态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;
Run Code Online (Sandbox Code Playgroud)

更好的是你可以避免像这样的慢行逐行游标方法:

BEGIN
    INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID)
    SELECT NAME_ID, ranking_id FROM PRODUCT_NAMES
    WHERE NAME = class_string;
END;
Run Code Online (Sandbox Code Playgroud)

如果您确实需要动态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;
Run Code Online (Sandbox Code Playgroud)