sql >> Database teknologi >  >> RDS >> Oracle

Sådan opretter du en PL/SQL rækkeudløser, der validerer en kolonne fra en anden tabel

Der er flere problemer med din trigger. Lad os begynde med 'forholdet' mellem et udvalgt udsagn og den resterende kode. I dette særlige tilfælde select.. og if...end_if (antag i øjeblikket, at dit udvalg faktisk virker, det gør det ikke, men antager bare). Koncentrer dig nu om WHERE-sætningen.

SELECT SUPPLIER.TRUSTED_SUPPLIER
    INTO TRUST
    ...
    WHERE SUPPLIER.TRUSTED_SUPPLIER = 'YES';

IF TRUST = 'NO' THEN ...

Da dit valg KUN returnerer JA, vil if-sætningen aldrig være Sand. Ansøgningsundtagelsen kan derfor aldrig rejses. Hvad er problemerne med select .
Nå, først får du adgang til bordet, som udløseren er udløst på. Mens du i nogle tilfælde kan slippe af sted med det, men normalt resulterer det i en ORA -04091:tabel muterer, trigger/funktion ser den muligvis ikke . Det er bust altid at undgå at referere til udløsningstabellen helt. Du refererer til tabeldataene med :NEW og/eller :OLD pseudo-posterne. For det andet gør din forespørgsel ikke, hvad du tror, ​​den er. Det siger

INTO-sætningen kræver dog, at sætningen returnerer nøjagtig 1 række . Mere end 1 række resulterer i undtagelsen, og 0 rækker resulterer i en no data found undtagelse.
Endelig er der et problem med raise_application_error statement . Hvis det blev udført, ville det rejse et talargument...er uden for rækkevidde undtagelse. Den første parameter skal være mellem -20999 til -20000 (negativt tal). Så hvordan ser resultatet ud:

create or replace trigger verify_supplier_trust
before insert or update on product
for each row 
declare 
    trust varchar2(3);

begin
    select supplier.trusted_supplier
      into trust
      from supplier 
     where supplier.company_name = :new.supplier_name
       and supplier.trusted_supplier = 'YES';
exception
   when no_data_found then 
        raise_application_error(-20001, 'supplier not trusted');
end;
/

BEMÆRKNINGER:
Brug ikke datatypen VARCHAR. Det er tilladt, men Oracle fraråder det. Betyder, at de forbeholder sig retten til at ændre, hvad den gør til enhver tid. Brug den anbefalede VARCHAR2 i stedet.
Jeg ændrer triggeren til at aktiveres på enten Indsæt eller Opdater. Hvis den udløses på Indsæt, KAN kun nogen ændre leverandørnavnet for at referere til en ikke-pålidelig leverandør, og alt ville være i orden.



  1. Sådan fjerner du uønskede ledende tegn fra en streng i MySQL

  2. MySql Amazon RDS:'Innodb funktion deaktiveret' fejl fra applikationen

  3. Hvordan man bruger mysqlimport til at læse resultatet af mysqldump --databases

  4. Find aktuelle jobåbninger til Oracle Forms &Reports