2016-10-22 3 views
0

Ich schreibe einen Trigger in SQL zum ersten Mal. Kann mir bitte jemand sagen, was schreibe ich falsch in diesem Code?SQL TRIGGER (Kompilierungsfehler)

SQL> CREATE OR REPLACE TRIGGER Course_Allocation_After_Update 
2 AFTER UPDATE 
3 ON COURSE_ALLOCATION 
4 FOR EACH ROW 
5 DECLARE 
6 v_user_id varchar2(20); 
7 BEGIN 
8 --Finding User who is performing the update in the table 
9 SELECT USER 
10 INTO v_user_id 
11 FROM dual; 
12 --Inserting Information Into Staging Table (Log Table) 
13 IF UPDATING(STU_ID) 
14 THEN 
15 INSERT INTO STAGING_TABLE 
16 (user_id,old_value,new_value,date_when_updated,time_when_udated) 
17 VALUES 
18 (v_user_id,:old.STU_ID,:new.STU_ID,sysdate,systime) 
19 END IF; 
20 END; 
21/
Warning: Trigger created with compilation errors. 

Dies sind die Fehler:
11/1 PL/SQL: SQL-Anweisung ignoriert 14/53 PL/SQL: ORA-00933: SQL-Befehl nicht richtig 16/4 PLS-00103 beendet: Fand das Symbol ";" wenn einer der erwarten folgende: wenn

+1

fyi, es ist ein PL/SQL-Trigger. PL/SQL ist die Programmiersprache. Und es gibt kein Gesetz, das besagt, dass Sie CODE IN GROSSBUCHSTABEN schreiben müssen. Persönlich finde ich es schwer zu lesen. –

Antwort

2
  1. Ihr Semikolon nach Einsatz Klausel vergessen;
  2. systime - nicht in Oracle vorhanden. SYSDATE - enthalten bereits Informationen über die Zeit. Wenn Sie es trennen möchten, können Sie trunc(sysdate) verwenden - nur Datum zurückgeben und to_char (sysdate, 'HH24: MI: SS') - String mit der Zeit zurückgeben. Oder können Sie meine systimestamp
  3. (optional) warum müssen Sie Benutzer in Variable auswählen? Verwenden Sie sie einfach als Wert

Meine Version Code des Triggers:

CREATE OR REPLACE TRIGGER Course_Allocation_After_Update 
AFTER UPDATE 
ON COURSE_ALLOCATION 
FOR EACH ROW 
DECLARE 
v_user_id varchar2(20); 
BEGIN 
--Inserting Information Into Staging Table (Log Table) 
IF UPDATING(STU_ID) 
THEN 
INSERT INTO STAGING_TABLE 
(user_id,old_value,new_value,date_when_updated) 
VALUES 
(USER,:old.STU_ID,:new.STU_ID,sysdate); 
END IF; 
END; 
/
+0

Vielen Dank, dass Sie diese Fehler behoben haben. Ich habe einige Änderungen vorgenommen. Aber immer noch gibt es Fehler. – Anya

+0

CREATE OR REPLACE TRIGGER Course_Allocation_After_Update AFTER UPDATE ON COURSE_ALLOCATION FÜR JEDE ZEILE DECLARE- v_STU_ID varchar2 (20); BEGIN --Finding Benutzer, der das Update in der Tabelle ausführt SELECT STU_ID INTO v_STU_ID FROM COURSE_ALLOCATION; --Inserting Informationen in Staging-Tabelle (Log Table) IF AKTUALISIERUNG (STU_ID) THEN INSERT INTO STAGING_TABLE (user_id, old_value, new_value, date_when_updated) VALUES (USER,: old.v_STU_ID,: new.v_STU_ID, sysdate); ENDE IF; ENDE; / – Anya

1

versuchen diese:

CREATE OR REPLACE TRIGGER Course_Allocation_After_Update 
AFTER UPDATE ON COURSE_ALLOCATION 
referencing old as old new as new 
FOR EACH ROW 

DECLARE 
    v_STU_ID varchar2(20); 

BEGIN --Finding User who is performing the update in the table 
    SELECT STU_ID 
    INTO v_STU_ID 
    FROM COURSE_ALLOCATION; 

    --Inserting Information Into Staging Table (Log Table) 
    IF UPDATING('STU_ID') 
    THEN 
     INSERT INTO STAGING_TABLE (user_id,old_value,new_value,date_when_updated) 
     VALUES (USER,:old.v_STU_ID,:new.v_STU_ID,sysdate); 
    END IF; 
END; 
/

Futher es, dass mir scheint:

SELECT STU_ID 
INTO v_STU_ID 
FROM COURSE_ALLOCATION; 

können nicht gut, weil Sie alle Stu_id-Datensätze aus der Tabelle Course_allocation auswählen werden . Und das wird Ihnen einen "too_many_rows" Fehler geben. Wie sieht die Tabelle course_allocation aus?