You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle带GROUP BY的FOR循环插入报ORA-06550/ORA-00984错误求解

问题根因

ORA-00984: column not allowed here错误和你写的GROUP BY逻辑无关,是INSERT语句的VALUES子句中存在拼写错误:你将null误写为nul,Oracle无法识别nul这个关键字,会默认将其当作列名处理,而VALUES子句中不允许直接引用列名,因此触发报错。

修正代码

只需要把插入语句里的nul改为null即可正常运行,完整修正后代码如下:

begin
  FOR R IN (WITH
     bez_oib
          AS
     (SELECT a.EXT_ACCOUNT_ID,
             a.ACCOUNT_ID,
             c.NAME,
             c.ATTRIBUTE_VALUE_1     AS oib3
       FROM MD_ACCOUNTS a, MD_CONTACTS c
      WHERE     a.ACCOUNT_ID = c.REFERENCE_ID
            AND c.REFERENCE_TYPE_ID = 2
            AND c.CONTACT_TYPE_ID = 1
            AND a.EXT_ACCOUNT_ID IN (  SELECT a.EXT_ACCOUNT_ID
                                         FROM MD_ACCOUNTS a
                                     GROUP BY a.EXT_ACCOUNT_ID
                                       HAVING COUNT (DISTINCT a.account_id) > 1)
            AND c.ATTRIBUTE_VALUE_1 IS NULL),
     sa_oib
         AS
     (SELECT a.EXT_ACCOUNT_ID,
             a.ACCOUNT_ID,
             c.NAME,
             c.ATTRIBUTE_VALUE_1     AS oib2
       FROM MD_ACCOUNTS a, MD_CONTACTS c
      WHERE     a.ACCOUNT_ID = c.REFERENCE_ID
            AND c.REFERENCE_TYPE_ID = 2
            AND c.CONTACT_TYPE_ID = 1
            AND a.EXT_ACCOUNT_ID IN (  SELECT a.EXT_ACCOUNT_ID
                                         FROM MD_ACCOUNTS a
                                     GROUP BY a.EXT_ACCOUNT_ID
                                       HAVING COUNT (DISTINCT a.account_id) > 1)
            AND c.ATTRIBUTE_VALUE_1 IS NOT NULL)
SELECT BEZ_OIB.EXT_ACCOUNT_ID as SIFRA_KK,
     BEZ_OIB.ACCOUNT_ID as a,
     BEZ_OIB.NAME as c ,
     BEZ_OIB.oib3 as b ,
     SUM (IH1.REST_TO_PAY)     AS PREOSTALI_DUG_BEZ_OIB,
     SA_OIB.EXT_ACCOUNT_ID as s,
     SA_OIB.ACCOUNT_ID as d,
     SA_OIB.NAME as e,
     SA_OIB.oib2 as f,
     SUM (IH2.REST_TO_PAY)     AS PREOSTALI_DUG_SA_OIB
FROM bez_oib,
     sa_oib,
     CA_INVOICE_HEADERS IH1,
     CA_INVOICE_HEADERS IH2
 WHERE     bez_oib.EXT_ACCOUNT_ID = sa_oib.EXT_ACCOUNT_ID
     AND bez_oib.NAME <> sa_oib.name
     AND BEZ_OIB.ACCOUNT_ID = IH1.ACCOUNT_ID(+)
     AND SA_OIB.ACCOUNT_ID = IH2.ACCOUNT_ID(+)
     AND BEZ_OIB.EXT_ACCOUNT_ID NOT IN ('30150151054',
                                        '33671110205',
                                        '31841000148',
                                        '31840520300',
                                        '30200150216',
                                        '33670011076')
GROUP BY BEZ_OIB.EXT_ACCOUNT_ID,
     BEZ_OIB.ACCOUNT_ID,
     BEZ_OIB.NAME,
     BEZ_OIB.oib3,
     SA_OIB.EXT_ACCOUNT_ID,
     SA_OIB.ACCOUNT_ID,
     SA_OIB.NAME,
     SA_OIB.oib2) 
     LOOP
insert into dun_exception (ID, TYPE, VALUE, ACTION, VALID_FROM, VALID_TO, STATE, NOTE, CREATED_BY, CREATE_DATE, MODIFIED_BY, MODIFY_DATE, PROC_NAME, BUYER_ID, REASON) values (DUN_EXCEPTION_SEQ.nextval,'BUYER_ID',r.sifra_kk,null,date'2021-10-26', date'2022-12-31',1,'Jedna ŠK, različit naziv, ima OIB - nema OIB', 'sbelcic',sysdate,null,null,null,null,null);
END LOOP;
END;

可选优化建议

如果没有逐行处理的特殊需求,可以去掉FOR LOOP,直接用INSERT INTO ... SELECT语法完成批量插入,性能会更高:

INSERT INTO dun_exception (ID, TYPE, VALUE, ACTION, VALID_FROM, VALID_TO, STATE, NOTE, CREATED_BY, CREATE_DATE, MODIFIED_BY, MODIFY_DATE, PROC_NAME, BUYER_ID, REASON)
SELECT DUN_EXCEPTION_SEQ.nextval,
       'BUYER_ID',
       BEZ_OIB.EXT_ACCOUNT_ID as SIFRA_KK,
       null,
       date'2021-10-26', 
       date'2022-12-31',
       1,
       'Jedna ŠK, različit naziv, ima OIB - nema OIB', 
       'sbelcic',
       sysdate,
       null,
       null,
       null,
       null,
       null
FROM (WITH
     bez_oib
          AS
     (SELECT a.EXT_ACCOUNT_ID,
             a.ACCOUNT_ID,
             c.NAME,
             c.ATTRIBUTE_VALUE_1     AS oib3
       FROM MD_ACCOUNTS a, MD_CONTACTS c
      WHERE     a.ACCOUNT_ID = c.REFERENCE_ID
            AND c.REFERENCE_TYPE_ID = 2
            AND c.CONTACT_TYPE_ID = 1
            AND a.EXT_ACCOUNT_ID IN (  SELECT a.EXT_ACCOUNT_ID
                                         FROM MD_ACCOUNTS a
                                     GROUP BY a.EXT_ACCOUNT_ID
                                       HAVING COUNT (DISTINCT a.account_id) > 1)
            AND c.ATTRIBUTE_VALUE_1 IS NULL),
     sa_oib
         AS
     (SELECT a.EXT_ACCOUNT_ID,
             a.ACCOUNT_ID,
             c.NAME,
             c.ATTRIBUTE_VALUE_1     AS oib2
       FROM MD_ACCOUNTS a, MD_CONTACTS c
      WHERE     a.ACCOUNT_ID = c.REFERENCE_ID
            AND c.REFERENCE_TYPE_ID = 2
            AND c.CONTACT_TYPE_ID = 1
            AND a.EXT_ACCOUNT_ID IN (  SELECT a.EXT_ACCOUNT_ID
                                         FROM MD_ACCOUNTS a
                                     GROUP BY a.EXT_ACCOUNT_ID
                                       HAVING COUNT (DISTINCT a.account_id) > 1)
            AND c.ATTRIBUTE_VALUE_1 IS NOT NULL)
SELECT BEZ_OIB.EXT_ACCOUNT_ID
FROM bez_oib,
     sa_oib,
     CA_INVOICE_HEADERS IH1,
     CA_INVOICE_HEADERS IH2
 WHERE     bez_oib.EXT_ACCOUNT_ID = sa_oib.EXT_ACCOUNT_ID
     AND bez_oib.NAME <> sa_oib.name
     AND BEZ_OIB.ACCOUNT_ID = IH1.ACCOUNT_ID(+)
     AND SA_OIB.ACCOUNT_ID = IH2.ACCOUNT_ID(+)
     AND BEZ_OIB.EXT_ACCOUNT_ID NOT IN ('30150151054',
                                        '33671110205',
                                        '31841000148',
                                        '31840520300',
                                        '30200150216',
                                        '33670011076')
GROUP BY BEZ_OIB.EXT_ACCOUNT_ID,
     BEZ_OIB.ACCOUNT_ID,
     BEZ_OIB.NAME,
     BEZ_OIB.oib3,
     SA_OIB.EXT_ACCOUNT_ID,
     SA_OIB.ACCOUNT_ID,
     SA_OIB.NAME,
     SA_OIB.oib2);

内容的提问来源于stack exchange,提问作者GodDamnLawyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:15:00