Oracle ORA-24344:编译错误103/9 PL/SQL成功:ORA-00913:值太多

Oracle ORA-24344:编译错误103/9 PL/SQL成功:ORA-00913:值太多,oracle,plsql,oracle11g,triggers,rowtype,Oracle,Plsql,Oracle11g,Triggers,Rowtype,我正在尝试创建一个触发器,它将插入包含更多数据的记录,但我的触发器创建引发编译错误 [警告]ORA-24344:编译错误成功 103/9 PL/SQL:ORA-00913:值太多 16/9 PL/SQL:SQL语句被忽略 (1:0):警告:已编译但有编译错误 下面是我的触发代码 CREATE OR REPLACE trigger insert_into_out_customer before insert on out_customer for each row DECLARE v_usern

我正在尝试创建一个触发器,它将插入包含更多数据的记录,但我的触发器创建引发编译错误

[警告]ORA-24344:编译错误成功
103/9 PL/SQL:ORA-00913:值太多
16/9 PL/SQL:SQL语句被忽略
(1:0):警告:已编译但有编译错误

下面是我的触发代码

CREATE OR REPLACE trigger insert_into_out_customer
before insert
on out_customer
for each row

DECLARE
v_username out_customer.created_by%TYPE;
newRow out_customer%ROWTYPE;
cId out_customer.CUSTOMER_ID%TYPE;

begin

SELECT user INTO v_username
FROM dual;

:new.created_by := v_username;
:new.updated_by := v_username;
cId := :new.CUSTOMER_ID;


    SELECT  
    SAS_FATCA_CUSTOMER.CUSTOMER_ID  ,
    CUSTOMER_TYPE   ,
    CUSTOMER_SUB_TYPE   ,
    FIRST_NAME  ,
    MIDDLE_NAME ,
    LAST_NAME   ,
    DOB ,
    PASSPORT_NUMBER ,
    GREEN_CARD_HOLDER   ,
    GREEN_CARD_NUMBER   ,
    TIN ,
    PRIMARY_ADDR_LINE_1 ,
    PRIMARY_ADDR_LINE_2 ,
    PRIMARY_ADDR_CITY   ,
    PRIMARY_ADDR_STATE  ,
    PRIMARY_ADDR_POSTAL_CODE    ,
    PRIMARY_ADDR_COUNTRY    ,
    PRIMARY_ADDR_PHONE_COUNTRY_CD   ,
    PRIMARY_ADDR_PHONE_NUMBER   ,
    PRIMARY_EMAIL   ,
    SECONDARY_ADDR_LINE_1   ,
    SECONDARY_ADDR_LINE_2   ,
    SECONDARY_ADDR_CITY ,
    SECONDARY_ADDR_STATE    ,
    SECONDARY_ADDR_POSTAL_CODE  ,
    SECONDARY_ADDR_COUNTRY  ,
    SECONDARY_ADDR_PHONE_CNTRY_CD   ,
    SECONDARY_ADDR_PHONE_NUMBER ,
    SECONDARY_EMAIL ,
    CITIZENSHIP ,
    COUNTRY_OF_ORIGIN   ,
    NATIONALITY_1   ,
    NATIONALITY_2   ,
    BANK_STAFF_ID   ,
    SELF_CERTIFICATION_RESPONSE ,
    SELF_CERTIFICATION_REASON   ,
    SELF_CERTIFICATION_TIMESTAMP    ,
    'EDIT_FLAG' ,
    POA_EXISTS  ,
    POA_FIRST_NAME  ,
    POA_LAST_NAME   ,
    POA_DOB ,
    POA_ADDR_LINE_1 ,
    POA_ADDR_LINE_2 ,
    POA_CITY    ,
    POA_STATE   ,
    POA_POSTAL_CODE ,
    POA_COUNTRY ,
    POA_COUNTRY_OF_ORIGIN   ,
    POA_PHONE_COUNTRY_CODE  ,
    POA_PHONE_NUMBER    ,
    BENEFICIARY_BANK_ADDRESS_LINE1  ,
    BENEFICIARY_BANK_ADDRESS_LINE2  ,
    BENEFICIARY_BANK_CITY   ,
    BENEFICIARY_BANK_POSTAL_CODE    ,
    BENEFICIARY_BANK_COUNTRY    ,
    BENEFICIARY_BANK_IFSC_CODE  ,
    'ACCOUNT_NUMBER'    ,
    'ACCOUNT_NAME'    ,
    'ACCOUNT_OPEN_DATE'    ,
    'BASE_CURRENCY '   ,
   ' ACCOUNT_BALANCE_BASE_CURRENCY'    ,
   ' ACCOUNT_BALANCE_US_CURRENCY'    ,
    'GROSS_WITHDRAWALS'    ,
   ' GROSS_PROCEEDS'    ,
    'GROSS_DIVIDENDS'    ,
    'GROSS_INTERESTS'   ,
    'OTHER_INCOME'    ,
    sysdate
    POA_ID  ,
    STANDING_INSTRUCTION_ID ,
    BENEFICIARY_ACCOUNT_ID  ,
    BENEFICIARY_ACCOUNT_NUMBER  ,
    BENEFICIARY_ACCOUNT_NAME    ,
    BENEFICIARY_BANK_NAME   ,
    STANDING_INSTRUCTION_START_DT   ,
    STANDING_INSTRUCTION_END_DATE   ,
    STANDING_INS_AMOUNT ,
    STANDING_INSTRC_FREQUENCY   ,
    :new.FATCA_REASON   ,
    :new.fatca_flag ,
    SAS_FATCA_CUSTOMER.CREATED_BY   ,
    SAS_FATCA_CUSTOMER.CREATED_DT   ,
    SAS_FATCA_CUSTOMER.UPDATED_BY   ,
    SAS_FATCA_CUSTOMER.UPDATED_DT   
    into newRow
    FROM SAS_FATCA_CUSTOMER
    LEFT JOIN SAS_FATCA_ATTORNEY  ON SAS_FATCA_CUSTOMER.CUSTOMER_ID = SAS_FATCA_ATTORNEY.CUSTOMER_ID
    LEFT JOIN SAS_FATCA_STANDING_INSTRUCTION ON SAS_FATCA_CUSTOMER.CUSTOMER_ID = SAS_FATCA_STANDING_INSTRUCTION.CUSTOMER_ID
    where SAS_FATCA_CUSTOMER.CUSTOMER_ID= cId and rownum<2;


    :new.CUSTOMER_TYPE :=    newRow.CUSTOMER_TYPE ;
    :new.CUSTOMER_SUB_TYPE :=    newRow.CUSTOMER_SUB_TYPE ;
    :new.FIRST_NAME :=    newRow.FIRST_NAME ;
    :new.MIDDLE_NAME :=    newRow.MIDDLE_NAME ;
    :new.LAST_NAME :=    newRow.LAST_NAME ;
    :new.DOB :=    newRow.DOB ;
    :new.PASSPORT_NUMBER :=    newRow.PASSPORT_NUMBER ;
    :new.GREEN_CARD_HOLDER :=    newRow.GREEN_CARD_HOLDER ;
    :new.GREEN_CARD_NUMBER :=    newRow.GREEN_CARD_NUMBER ;
    :new.TIN :=    newRow.TIN ;
    :new.PRIMARY_ADDR_LINE_1 :=    newRow.PRIMARY_ADDR_LINE_1 ;
    :new.PRIMARY_ADDR_LINE_2 :=    newRow.PRIMARY_ADDR_LINE_2 ;
    :new.PRIMARY_ADDR_CITY :=    newRow.PRIMARY_ADDR_CITY ;
    :new.PRIMARY_ADDR_STATE :=    newRow.PRIMARY_ADDR_STATE ;
    :new.PRIMARY_ADDR_POSTAL_CODE :=    newRow.PRIMARY_ADDR_POSTAL_CODE ;
    :new.PRIMARY_ADDR_COUNTRY :=    newRow.PRIMARY_ADDR_COUNTRY ;
    :new.PRIMARY_ADDR_PHONE_COUNTRY_CD :=    newRow.PRIMARY_ADDR_PHONE_COUNTRY_CD ;
    :new.PRIMARY_ADDR_PHONE_NUMBER :=    newRow.PRIMARY_ADDR_PHONE_NUMBER ;
    :new.PRIMARY_EMAIL :=    newRow.PRIMARY_EMAIL ;
    :new.SECONDARY_ADDR_LINE_1 :=    newRow.SECONDARY_ADDR_LINE_1 ;
    :new.SECONDARY_ADDR_LINE_2 :=    newRow.SECONDARY_ADDR_LINE_2 ;
    :new.SECONDARY_ADDR_CITY :=    newRow.SECONDARY_ADDR_CITY ;
    :new.SECONDARY_ADDR_STATE :=    newRow.SECONDARY_ADDR_STATE ;
    :new.SECONDARY_ADDR_POSTAL_CODE :=    newRow.SECONDARY_ADDR_POSTAL_CODE ;
    :new.SECONDARY_ADDR_COUNTRY :=    newRow.SECONDARY_ADDR_COUNTRY ;
    :new.SECONDARY_ADDR_PHONE_CNTRY_CD :=    newRow.SECONDARY_ADDR_PHONE_CNTRY_CD ;
    :new.SECONDARY_ADDR_PHONE_NUMBER :=    newRow.SECONDARY_ADDR_PHONE_NUMBER ;
    :new.SECONDARY_EMAIL :=    newRow.SECONDARY_EMAIL ;
    :new.CITIZENSHIP :=    newRow.CITIZENSHIP ;
    :new.COUNTRY_OF_ORIGIN :=    newRow.COUNTRY_OF_ORIGIN ;
    :new.NATIONALITY_1 :=    newRow.NATIONALITY_1 ;
    :new.NATIONALITY_2 :=    newRow.NATIONALITY_2 ;
    :new.BANK_STAFF_ID :=    newRow.BANK_STAFF_ID ;
    :new.SELF_CERTIFICATION_RESPONSE :=    newRow.SELF_CERTIFICATION_RESPONSE ;
    :new.SELF_CERTIFICATION_REASON :=    newRow.SELF_CERTIFICATION_REASON ;
    :new.SELF_CERTIFICATION_TIMESTAMP :=    newRow.SELF_CERTIFICATION_TIMESTAMP ;
    :new.POA_EXISTS :=    newRow.POA_EXISTS ;
    :new.POA_FIRST_NAME :=    newRow.POA_FIRST_NAME ;
    :new.POA_LAST_NAME :=    newRow.POA_LAST_NAME ;
    :new.POA_DOB :=    newRow.POA_DOB ;
    :new.POA_ADDR_LINE_1 :=    newRow.POA_ADDR_LINE_1 ;
    :new.POA_ADDR_LINE_2 :=    newRow.POA_ADDR_LINE_2 ;
    :new.POA_CITY :=    newRow.POA_CITY ;
    :new.POA_STATE :=    newRow.POA_STATE ;
    :new.POA_POSTAL_CODE :=    newRow.POA_POSTAL_CODE ;
    :new.POA_COUNTRY :=    newRow.POA_COUNTRY ;
    :new.POA_COUNTRY_OF_ORIGIN :=    newRow.POA_COUNTRY_OF_ORIGIN ;
    :new.POA_PHONE_COUNTRY_CODE :=    newRow.POA_PHONE_COUNTRY_CODE ;
    :new.POA_PHONE_NUMBER :=    newRow.POA_PHONE_NUMBER ;
    :new.BENEFICIARY_BANK_ADDRESS_LINE1 :=    newRow.BENEFICIARY_BANK_ADDRESS_LINE1 ;
    :new.BENEFICIARY_BANK_ADDRESS_LINE2 :=    newRow.BENEFICIARY_BANK_ADDRESS_LINE2 ;
    :new.BENEFICIARY_BANK_CITY :=    newRow.BENEFICIARY_BANK_CITY ;
    :new.BENEFICIARY_BANK_POSTAL_CODE :=    newRow.BENEFICIARY_BANK_POSTAL_CODE ;
    :new.BENEFICIARY_BANK_COUNTRY :=    newRow.BENEFICIARY_BANK_COUNTRY ;
    :new.BENEFICIARY_BANK_IFSC_CODE    :=    newRow.BENEFICIARY_BANK_IFSC_CODE;

    commit;

end;

我不确定此错误是否是因为我正在使用%ROWTYPE变量存储查询结果。请帮帮我。另外,如果这是因为%ROWTYPE,那么我还可以用什么来代替%ROWTYPE呢?令人困惑的是,在这种情况下,错误是因为select的投影的列太少,而不是太多:

create table t42 (col1 number, col2 number);

declare
  x t42%rowtype;
begin
  select 1 into x from dual;
end;
/

Error report -
ORA-06550: line 4, column 19:
PL/SQL: ORA-00913: too many values
如果select中的列太多,则会得到
ORA-00947:值不够
。这可能是因为rowtype变量的列数比select变量的列数多,而不是您所期望的那样

在您的情况下,您缺少一个逗号。目前,
POA_ID
sysdate
的别名,而不是单独的列。因此:

    'OTHER_INCOME'    ,
    sysdate
    POA_ID  ,
应该是:

    'OTHER_INCOME'    ,
    sysdate,
    POA_ID  ,
顺便说一句,将所有内容(包括已知值)选择到rowtype变量中,然后将其中一些值单独复制到:new pseudorow列中的两步过程似乎不必要地复杂,如果表结构更改或列的顺序与您期望的不完全一致,则可能会中断。(这可能发生在环境之间的移动中;尽管这可能是您做错了一些事情的迹象)

为什么不直接设置固定值:

:new.created_by := user;
:new.updated_by := user;
:new.some_column := sysdate;
:new.some_column := 'EDIT FLAG';
...
然后只选择真正需要从其他表中直接获取的值,并将其放入一个新变量列表中


您也不能在触发器内提交。

此触发器的作用是什么?您似乎正在用一组现有值替换插入的所有值。这看起来很奇怪,至少可以这么说。@APC此触发器根据客户id将所有信息附加到out_customer中……我已从out_customer的表定义中选择了所有这些列。我的意思是,我没有一个接一个地编写它们,因此在列数不匹配方面没有错误范围。@APC请查看编辑部分谢谢Alex,这就是问题所在。。。。我也明白我应该在单独的变量中选择值以避免将来的问题声明CUSTOMER\u SUB\u TYPE1 OUT\u ENTITY.CUSTOMER\u SUB\u TYPE%TYPE;上面的代码抛出了一些错误“[警告]ORA-24344:编译成功错误7/35 PLS-00302:必须声明组件“CUSTOMER\u SUB\u TYPE”的原因是什么?CUSTOMER\u SUB\u TYPE是输入输出的有效列名_customer@NagendraYadav-什么是外部实体?这不是您一直使用的表名。但是
:new.customer\u sub\u type
已经是那种数据类型了-为什么使用中间变量更好?问题出在。。。这不是我想用的桌子
:new.created_by := user;
:new.updated_by := user;
:new.some_column := sysdate;
:new.some_column := 'EDIT FLAG';
...