2017-03-17 3 views
0
CREATE OR REPLACE TRIGGER sales_trig1 
    before insert on Inventory1 
    for each row 
DECLARE 
    q Inventory1.qty%type; 
    id Inventory1.item_id%type; 
    si Sales.sitem_id%type; 
    tid Sales.trans_id%type; 
    td Sales.trans_dt%type; 
    tq Sales.trans_qty%type; 
BEGIN 
    tid:='t_id111'; 
    si:='&si'; 
    tq:=&tq; 
    select item_id,qty 
    into id,q 
    from Inventory1 
    where id=si; 
    IF tq<=q THEN 
     insert into Sales 
     values(tid,si,date,tq); 
     q:=q-tq; 
    END IF;  
EXCEPTION 
    WHEN no_data_found THEN 
     dbms_output.put_line('EXCEPTION: Invalid item_id'); 

END; 

erreur est la suivanteDans PL/programme SQL Je reçois erreur d'expression manquant comme suit

Errors for TRIGGER SALES_TRIG1: 
- 
LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
17/1  PL/SQL: SQL Statement ignored 
17/33 PL/SQL: ORA-00936: missing expression 
+0

Esperluettes sont pour accepter une entrée utilisateur dans SQL \ * Plus. Les déclencheurs ne sont pas des programmes interactifs: ils s'exécutent automatiquement en arrière-plan, de sorte que les utilisateurs ne peuvent pas interagir directement avec eux. Il semble que vous écrivez un déclencheur lorsque vous devriez vraiment écrire une procédure stockée. – APC

+0

Je veux l'écrire en trigger uniquement. Pouvez-vous s'il vous plaît dites-moi pourquoi je reçois cette erreur d'expression manquante @APC –

Répondre

0

Si vous souhaitez obtenir et modifier les valeurs de newly inserted rows, utilisez :NEW.<column_name> pour répondre nouvelles valeurs.

Voilà comment cela pourrait s'appliquer à votre cas:

CREATE OR REPLACE TRIGGER sales_trig1 
    before insert on Inventory1 
    for each row 
DECLARE 
    q Inventory1.qty%type; 
    id Inventory1.item_id%type; 
    si Sales.sitem_id%type; 
    tid Sales.trans_id%type; 
    td Sales.trans_dt%type; 
    tq Sales.trans_qty%type; 
BEGIN 
    tid :='t_id111'; 
    si := :NEW.sytem_id; 
    tq := :NEW.trans_dt; 
    select item_id, qty into id, q from Inventory1 where id = si; 
    IF tq <= q THEN 
    -- insert in another table 
    insert into Sales values(tid, si, sysdate, tq); 
    -- here change inserted value 
    :NEW.qty := q - tq; 
    END IF;  
EXCEPTION 
    WHEN no_data_found THEN 
    dbms_output.put_line('EXCEPTION: Invalid item_id'); 

END; 
/
+0

Je dois lire 'si' la valeur non seulement prendre une nouvelle valeur @J. Chomel –

+0

Ensuite, vous ne pouvez pas le faire avec un déclencheur. Désolé pour ça. –