2016-06-21 5 views
-2

was ich tun muss, ist ich möchte einen Trigger erstellen, der einen Fehler auslöst, wenn beide die Fähigkeiten des Programmierers gleich sind. Bitte sagen Sie mir die Fehler, die ich gemacht habe.Progblem mit Triggern in pl/sql

SQL> get f:/sqlprog/trigger_3; 
    1 create or replace trigger t2 before insert or update on programmer for   each 
row 
    2 declare 
    3 cursor c1 is select prof1, prof2 from programmer; 
    4 begin 
    5 for r1 in c1 loop 
    6 if r1.pname=:new.pname then 
    7 if :new.prof1=: new.prof2 then 
    8 raise_application_error(-20091,'prof1 and prof2 should not be same'); 
    9 end if; 
    10 end if; 
    11 end loop; 
    12* end; 
SQL>/

Warnung: Auslöser mit Kompilierungsfehlern erstellt.

SQL> show errors 
Errors for TRIGGER T2: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
4/1  PLS-00103: Encountered the symbol "FOR" when expecting one of the 
      following: 
      constant exception <an identifier> 
      <a double-quoted delimited-identifier> table long double ref 
      char time timestamp interval date binary national character 
      nchar 

6/15  PLS-00103: Encountered the symbol ":" when expecting one of the 
      following: 
      (- + all case mod new null <an identifier> 
      <a double-quoted delimited-identifier> <a bind variable> 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
     continue any avg count current max min prior some sql stddev 
     sum variance execute forall merge time timestamp interval 
     date <a string literal with character set specification> 
     <a number> <a single-quoted SQL string> pipe 
     <an alternatively-quoted string literal with character set 
     specification> 
     <an alternative 

das sind die Fehler, die ich festgestellt und die Tabelle in Bezug auf Programmierer unter PROF1 gegeben = proficieny 1 prof2 = proficieny 2

SQL> desc programmer; 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 

PNAME            VARCHAR2(20) 
DOB            DATE 
DOJ            DATE 
SEX            CHAR(1) 
PROF1            VARCHAR2(10) 
PROF2            VARCHAR2(10) 
SALARY            NUMBER(5) 

i habe keine Ahnung, warum ich sie bin immer pls helfen Sie mir danke im Voraus.

+0

Was möchten Sie erreichen? Meine Vermutung ist, dass Sie eine Check-Bedingung anstelle eines Triggers wollen. Wenn Sie ineffizient sein und einen Trigger anstelle einer Einschränkung haben wollen, dann schätze ich, dass Sie nur 'if: new.prof1 =: new.prof2' überprüfen und die Schleife und die erste if-Anweisung loswerden wollen. –

+0

Sir ich bin neu und ich bin ein langsamer Lerner Könnten Sie bitte genauer sein, was ich tun soll? –

+0

Zuerst erklären Sie genau, was Sie erreichen möchten. Ich versuche zu raten, basierend auf dem, was ich denke, dass dein Code deiner Meinung nach funktioniert. Aber es ist durchaus möglich, dass meine Vermutung falsch ist. Warum benutzt du einen Auslöser? Warum haben Sie zwei Proficiency-Spalten in der Tabelle anstatt eine Eins-zu-viele-Mapping-Tabelle? Hat jeder Programmierer wirklich genau zwei Fähigkeiten? Niemand hat 1 oder 3? –

Antwort

0

Entfernen Sie den Cursor, verlieren Sie die Schleife, und loswerden der ersten if Anweisung. Nur die innerste if Aussage Sinn macht

create or replace trigger t2 
    before insert or update on programmer 
    for each row 
begin 
    if :new.prof1 = :new.prof2 
    then 
    raise_application_error(-20091,'prof1 and prof2 should not be same'); 
    end if; 
end; 

In einem Trigger auf Zeilenebene, Sie in der Regel nicht in die Tabelle abfragen können, dass der Trigger auf definiert. Sie können Entscheidungen nur aufgrund der Daten in den Pseudoaufzeichnungen :new und :old treffen.

+0

können Sie pls geben Sie mir Ihre Gmail-ID Sir ich werde direkt an Sie mailen, wenn es Zweifel gibt und geben Sie mir nur, wenn Sie sich mit dieser –

+0

können Sie pls sagen mir jede nette Referenz für dieses Thema, Herr –