2015-07-29 3 views
-2

J'essaye de créer un déclencheur qui va insérer l'enregistrement avec plus de données mais ma création de déclencheur lance une erreur de compilationORA-24344: succès avec erreur de compilation 103/9 PL/SQL: ORA-00913: trop de valeurs

[Warning] ORA-24344: success with compilation error 103/9 PL/SQL: ORA-00913: too many values 16/9 PL/SQL: SQL Statement ignored (1: 0): Warning: compiled but with compilation errors

ci-dessous est mon code de déclenchement

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; 

EDIT 1: ci-dessous Interrogation fonctionne bien ce qui signifie out_customer a toutes les colonnes

SELECT 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 , 
BALANCE_DATE , 
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 , 
FATCA_REASON , 
FATCA_FLAG , 
CREATED_BY , 
CREATED_DT , 
UPDATED_BY , 
UPDATED_DT  
from out_customer 

Je ne sais pas si cette erreur est due à l'utilisation de la variable% ROWTYPE pour stocker le résultat de la requête. Aidez-moi, s'il vous plaît. Et même si cela est à cause de% ROWTYPE alors qu'est-ce que je peux utiliser à la place de% ROWTYPE

+0

À quoi sert ce déclencheur? Vous semblez remplacer toutes les valeurs d'une insertion avec un ensemble de valeurs existantes. Cela semble étrange, c'est le moins qu'on puisse dire. – APC

+0

@APC ce déclencheur ajoute toutes les informations dans out_customer sur la base de customer_id ..... –

+0

J'ai sélectionné toutes ces colonnes à partir de la définition de table de out_customer. Je veux dire que je ne les ai pas écrits un par un donc il n'y a pas de marge d'erreur en termes de nombre de colonnes incompatibles .... –

Répondre

0

Embrouillant dans ce cas, l'erreur est parce que votre projection de sélection a trop peu de colonnes, pas trop:

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 

Si vous aviez trop de colonnes dans votre sélection, vous obtiendriez ORA-00947: not enough values. Vraisemblablement, cela est basé sur la variable rowtype ayant trop de colonnes par rapport à la sélection, plutôt que l'inverse comme vous pouvez vous y attendre.

Dans votre cas, il vous manque une virgule. À l'heure actuelle POA_ID est un alias pour le sysdate, pas une colonne séparée. Donc ceci:

'OTHER_INCOME' , 
    sysdate 
    POA_ID , 

devrait être:

'OTHER_INCOME' , 
    sysdate, 
    POA_ID , 

Soit dit en passant, ce processus en deux étapes de sélection tout, y compris les valeurs que vous connaissez déjà dans une variable de type de ligne, puis copiez individuellement certaines de ces valeurs dans la : les nouvelles colonnes de pseudo-tronc, semblent inutilement compliquées, et peuvent se casser si la structure de la table change ou si les colonnes ne sont pas exactement dans l'ordre attendu. (Ce qui peut arriver en se déplaçant entre les environnements, bien que cela puisse être un signe que vous faites quelque chose de mal).

Pourquoi ne pas directement les valeurs fixes:

:new.created_by := user; 
:new.updated_by := user; 
:new.some_column := sysdate; 
:new.some_column := 'EDIT FLAG'; 
... 

et seulement sélectionner les valeurs que vous avez vraiment obtenir d'autres tables directement dans une liste de: nouvelles variables?

Vous ne pouvez également pas valider à l'intérieur d'un déclencheur.

+0

merci Alex, c'était le problème .... J'ai également compris que je devrais sélectionner des valeurs dans des variables distinctes pour éviter les problèmes futurs –

+0

DECLARE CUSTOMER_SUB_TYPE1 OUT_ENTITY.CUSTOMER_SUB_TYPE% TYPE; code ci-dessus est de lancer une erreur '[Avertissement] ORA-24344: succès avec erreur de compilation 7/35 PLS-00302: composante 'CUSTOMER_SUB_TYPE' doit être déclarée' ce qui pourrait être la raison? CUSTOMER_SUB_TYPE est un nom de colonne valide dans out_customer –

+0

@NagendraYadav - qu'est ce que 'out_entity'? Ce n'est pas le nom de la table que vous avez utilisé. Mais ': new.customer_sub_type' est déjà ce type de données - pourquoi mieux utiliser une variable intermédiaire? –