代码之家  ›  专栏  ›  技术社区  ›  baskinsr

SQL with LOOP中的子查询

  •  1
  • baskinsr  · 技术社区  · 8 年前

    尝试在PLSQL循环中运行select语句时出错。我怎样才能让它工作?

    DECLARE 
        v_gsp_cnt number := 0;
    BEGIN
        WHILE v_gsp_cnt > (select max(eachesrem) from salesplan)
        LOOP
            insert into salesplanexp (select SPNUM,ORDNUM,DMDTYPE,ORDSTATUS,ITEM,LOC,ITEMDESCR,FCST,ORDTYPE,DELSERVLVL,SHIPMETHOD,CARRIER,EACHES,SHIPPEDEACHES,EACHESREM,WEIGHT,VOLUME,STARTSHIPDATE,ENDSHIPDATE,ACTSHIPDATE,STARTDELDATE,ENDDELDATE,ACTDELDATE,ORDCREATEDATE,ORDCONFDATE,BILLCUSTNAME,BILLADD1,BILLADD2,BILLCITY,BILLSTATE,BILLCOUNTRY,BILLZIP,SHIPCUSTNAME,SHIPADD1,SHIPADD2,SHIPCITY,SHIPSTATE,SHIPCOUNTRY,SHIPZIP,LOCPHONE,LOCEMAIL,ACTITEMCOST,ACTITEMPRICE,ACTITEMMARGIN,ACTSHIPCOST,ACTSHIPPRICE,ACTSHIPMARGIN,ACTTOTCOST,ACTTOTPRICE,ACTTOTMARGIN,BRAND,CHANNEL,EXTORDID,EXTLINEID,SOURCESYS,CREATEDATE,LASTUPDATEDDATE from salesplan);
            commit;
            select x.new_cnt into v_gsp_cnt from (select v_gsp_cnt+1 from dual) x; 
            commit;
        END LOOP;
    END;
    

    错误是

    ORA-06550: line 4, column 23:
    PLS-00405: subquery not allowed in this context
    ORA-06550: line 4, column 5:
    PL/SQL: Statement ignored
    

    我认为错误来自select语句。但对于循环,我不确定是否有其他方法可以使其正常运行

    1 回复  |  直到 8 年前
        1
  •  2
  •   Ditto    8 年前

    错误来自此行:

    WHILE v_gsp_cnt > (select max(eachesrem) from salesplan)
    

    实际错误有点欺骗性,但这就是来源(注意它说的是“第4行”。.从DECLARE开始计数)。

    这里不能有这样的查询。

    请尝试以下操作:

    select max(eachesrem) into v_max from salesplan;
    
    WHILE v_gsp_cnt > v_max
    

    (JNevill也提到了这一点:您需要将内部的“v\u gsp\u cnt+1”别名为new\u cnt…)但这是一个不同的错误,在您修复上述错误后会显示出来。。)