plsql - PL/SQL 在选择中为每个结果插入 1 行

标签 plsql for-loop insert procedure

我正在编写一个 PL/SQL 过程,它根据输入变量执行选择,然后为选择中的每个结果插入一行。由于我对 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”的使用无效。任何帮助深表感谢。

最佳答案

这里不需要动态 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,则不应将值连接到其中,而应使用绑定(bind)变量:
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;

关于plsql - PL/SQL 在选择中为每个结果插入 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9927042/

相关文章:

Java 一个 liner for 循环

oracle - 什么会导致 Oracle 忽略请求它执行直接路径加载的 APPEND 提示?

sql-server-2008 - 使用 WHERE 插入

oracle - PLSQL 将变量传递给外部 .SQL 脚本

sql - 合并 PL/SQL block 中的两个表

windows - 使用 'for' 循环迭代目录中的所有文件

python - 从另一列中的每一行单元格中搜索字符串,如果找到匹配项,则在 pandas 中找到的匹配项下方插入行

sql - 获取乱序 <ora-01002> 回滚

sql - Oracle 语句之间的多个重叠

python - 根据 Python 中的月份列表制作列表