2008-10-14 12 views
7

To co obecnie mam:Jaka jest składnia użycia instrukcji Select w wyzwalaczu PL/SQL?

CREATE OR REPLACE TRIGGER MYTRIGGER 
AFTER INSERT ON SOMETABLE 
FOR EACH ROW  

DECLARE 
v_emplid varchar2(10);  

BEGIN 
SELECT 
    personnum into v_emplid 
FROM PERSON 
WHERE PERSONID = :new.EMPLOYEEID; 

dbms_output.put(v_emplid); 

/* INSERT INTO SOMEOTHERTABLE USING v_emplid and some of the other values from the trigger table*/ 

END MYTRIGGER;  

DBA_ERRORS ma ten błąd: PL/SQL: ORA-00923: od słowa kluczowego nie znaleziono gdzie oczekuje

+0

W której wierszu jest zgłaszany błąd? –

+0

Pierwszy błąd w sekwencji dotyczy linii "WHERE PERSONID ...". – Equistatic

+0

Zaktualizowałem moją odpowiedź, w twoim przykładzie jest coś jeszcze, co nie zostało opublikowane. Kod jak napisałem działa dla mnie. –

Odpowiedz

6

1) Musi być coś innego na swoim przykładzie, bo to na pewno wydaje się działać dla mnie

SQL> create table someTable(employeeid number); 

Table created. 

SQL> create table person(personid number, personnum varchar2(10)); 

Table created. 

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE TRIGGER MYTRIGGER 
    2 AFTER INSERT ON SOMETABLE 
    3 FOR EACH ROW 
    4 DECLARE 
    5 v_emplid varchar2(10); 
    6 BEGIN 
    7 SELECT personnum 
    8  into v_emplid 
    9  FROM PERSON 
10 WHERE PERSONID = :new.EMPLOYEEID; 
11 dbms_output.put(v_emplid); 
12 /* INSERT INTO SOMEOTHERTABLE USING v_emplid and some of the other values 
from the trigger table*/ 
13* END MYTRIGGER; 
14/

Trigger created. 

SQL> insert into person values(1, '123'); 

1 row created. 

SQL> insert into sometable values(1); 

1 row created. 

2) prawdopodobnie chcesz zadeklarować V_EMPLID jako mający typ Person.PersonNum% Typ dzięki czemu można upewnij się, że typ danych jest poprawny, a jeśli zmienisz typ danych tabeli, nie będziesz musiał zmieniać kodu.

3) Zakładam, że wiesz, że twój wyzwalacz nie może zapytać lub zaktualizować tabeli, w której zdefiniowano wyzwalacz (więc nie ma żadnych zapytań lub wstawia do someTable).

+0

1) Zignorowałem opcję "DLA KAŻDEGO WIERSZA" przy pierwszej edycji, tak to wygląda. Dzięki. – Equistatic

+0

Napisałem ponownie w tej formie i wydaje się, że działa. Mogło to mieć coś wspólnego z wyrównaniem, znakami tabulatora w skrypcie lub różnicą w separacji linii na wyciągu. Dzięki. – Equistatic

-2

nie będę używać wybierz statment w wyzwalacz zawsze. Wstaw do tabeli, a nie wybierz do. Gdy tabela już istnieje, nie działa w większości baz danych.

1

Bawisz się Lava (nie tylko ognia) w spust. DBMS_OUTPUT w wyzwalaczu jest naprawdę, naprawdę zły. Możesz wydmuchać przepełnienie bufora w wyzwalaczu, a cała transakcja zostanie wykonana. Powodzenia w tropieniu tego. Jeśli musisz wykonać zachowanie typu wyjście-do-konsoli, wywołaj procedurę AUTONOMICZNE TRANSAKCJE, które zapisuje do tabeli.

Wyzwalacze są całkiem złe. Lubiłem je, ale są one zbyt trudne do zapamiętania. Mają wpływ na dane często prowadzące do MUTATING danych (przerażające, a nie tylko dlatego, że Halloween jest blisko).

Używamy wyzwalaczy do zmiany wartości kolumn takich jak .new: LAST_MODIFIED: = sysdate i .new: LAST_MODIFIED_BY: = user. to jest to!

Nie pozwól, aby TRIGGER uniemożliwił zakończenie transakcji. Znajdź inną opcję.

+0

Końcowy wyzwalacz nie będzie mieć DBMS_OUTPUT – Equistatic

Powiązane problemy