Plsql PL/SQL如何从循环中的查询进行迭代和更新

Plsql PL/SQL如何从循环中的查询进行迭代和更新,plsql,Plsql,我不知道如何从循环中的查询结果进行迭代和更新。可以从我的第一个循环中的查询再次循环吗?这是我的密码: CREATE OR REPLACE PROCEDURE "myTEST" (sp_type in char) IS CURSOR c1 IS SELECT SP_ID FROM CI_SP WHERE SP_TYPE_CD = sp_type; sp_id char(10); item_id_eq CI_SP_EQ.ITEM_ID_EQ%type; BE

我不知道如何从循环中的查询结果进行迭代和更新。可以从我的第一个循环中的查询再次循环吗?这是我的密码:

CREATE OR REPLACE PROCEDURE "myTEST" (sp_type in char)

IS
CURSOR c1 IS  

    SELECT SP_ID FROM CI_SP
    WHERE SP_TYPE_CD = sp_type;

    sp_id char(10);
    item_id_eq CI_SP_EQ.ITEM_ID_EQ%type;
BEGIN

FOR sp_rec in c1
LOOP
  DBMS_OUTPUT.PUT_LINE(sp_rec.sp_id); 

  SELECT ITEM_ID_EQ INTO item_id_eq FROM CI_SP_EQ
  WHERE SP_ID = sp_rec.sp_id;      
  DBMS_OUTPUT.PUT_LINE('item id eq :' || item_id_eq); 

  -- iterate here for each item_id_eq
  -- execute update for each item_id_eq also
END LOOP;

END myTEST;

您可以在
CI_SP
CI_SP_EQ
之间进行连接,而不是循环两次,然后一次性完成:

CREATE OR REPLACE PROCEDURE "myTEST"(sp_type IN CHAR) IS
BEGIN
  FOR item IN (SELECT item_id_eq
                 FROM ci_sp_eq JOIN ci_sp USING (sp_id)
                WHERE sp_type_cd = sp_type) LOOP
    -- do your stuff.
    NULL;
  END LOOP;
END mytest;
我认为您甚至不需要PL/SQL块,只需要一个简单的更新就可以了,但我不知道您到底想做什么

其他一些评论:

  • 不要创建包含在“引号”中的对象,对象名称现在区分大小写。在您的情况下,编译将失败,因为您已将过程名称创建为“myTEST”,并以myTEST结束,Oracle将其视为“myTEST”,您将由于语法检查失败而获得编译错误
  • 使用VARCHAR2代替CHAR,如果输入与长度说明符不匹配,CHAR将填充空格,并将导致进一步的问题

我赞同这样的想法,即这可能可以在一个UPDATE语句中完成。无需逐行(又名慢对慢)处理!