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';
...