2017-06-28 1 views
0

Je suis nouveau dans Oracle, et je tente d'écrire mon premier déclencheur réel, mais ont quelques erreurs ... :(variables mauvaise bind Oracle, Déclaration ignorée et une autre erreur

ceci est mon code:

create or replace TRIGGER CUSTERP_ABILITYVALUECODES_TRG 
BEFORE INSERT OR UPDATE OF CODE OR DELETE ON ABILITYVALUECODES 
REFERENCING NEW AS newest OLD AS oldest 
FOR EACH ROW 
declare s varchar2(4096); 
BEGIN 
    if :oldest.CODE <> :newest.CODE then 
    if :newest.CODE is null then 
     s := 'NULL'; 
    else 
     s := ASCIISTR(:newest.CODE); 
    end if; 
    s:= utl_url.escape(s); 
    if :newest.CODE is null then 
     CUSTERP_TRG('T_ABILITYVALUECODES', concat('C_CODE;KEY: ABILITYVALUE = ', :oldest.ABILITYVALUE, ',OLD:', :oldest.CODE, ',NEW:', s)); 
    else 
     CUSTERP_TRG('T_ABILITYVALUECODES', concat('C_CODE;KEY: ABILITYVALUE =', :newest.ABILITYVALUE, ',OLD:', :oldest.CODE, ',NEW:', s)); 
    end if; 
end if; 
END; 

Je reçois ces erreurs: erreur (11,13): PL/SQL: Déclaration ignoré (semble comme il se réfère à s: = ...) erreur (11,53): PLS- 00306: mauvais numéro ou types d'arguments dans l'appel à 'CONCAT'

si j'aime:

s := 'NULL'; 

je reçois: Erreur (6,13): PLS-00049: mauvaise variable de liaison 'S'

Merci à l'avance!

Répondre

0

Il est clair dans le message d'erreur. Error is in concat function that you are using to call method- CUSTERP_TRG.
CONCAT La fonction prend seulement deux arguments de chaîne.
Si vous voulez concatuer plus de deux arguments, vous devez utiliser la fonction CONCAT plusieurs fois.
Vous utilisez Oracle si simplement vous devez utiliser des tuyaux - || pour la concaténation.
Je suppose que les colonnes ABILITYVALUE et CODE sont de type CHAR ou VARCHAR ou VARCHAR2. Si elles sont INT, vous devrez peut-être utiliser TO_CHAR.
Remplacez le bloc if-else dans votre TRIGGER par le code ci-dessous.

if :newest.CODE is null then 
    CUSTERP_TRG('T_ABILITYVALUECODES', 'C_CODE;KEY: ABILITYVALUE = ' || :oldest.ABILITYVALUE || ',OLD:' || :oldest.CODE || ',NEW:' || s); 
else 
    CUSTERP_TRG('T_ABILITYVALUECODES', 'C_CODE;KEY: ABILITYVALUE =' || :newest.ABILITYVALUE || ',OLD:' || :oldest.CODE || ',NEW:' || s); 
end if; 
+0

Greate, il a résolu tous !! Un grand merci! – user2992143

+0

Bien sûr. Bienvenue. :) –