首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PL/SQL为select中的每个结果插入一行

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

Stack Overflow用户
提问于 2012-03-29 22:06:11
回答 1查看 61.3K关注 0票数 21

我正在编写一个PL/SQL过程,该过程根据输入变量执行select操作,然后为select中的每个结果插入一行。由于我是PL/SQL的新手,我在调试我的查询错误时遇到了问题。我知道这一定很容易,但我被困在这里是出于某种原因。谢谢你的帮忙!

代码语言:javascript
复制
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‘的使用无效。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-29 22:13:24

这里不需要动态SQL:

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
BEGIN
    INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID)
    SELECT NAME_ID, ranking_id FROM PRODUCT_NAMES
    WHERE NAME = class_string;
END;

如果您确实需要动态SQL,则不应将值连接到其中,而应使用绑定变量:

代码语言:javascript
复制
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;
票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9927042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档