2017-01-21 2 views
1

Ich versuche, einfügen Anweisung innerhalb PLSQL einfügen und Rückgabe der ID aus Auslöser für Tabelle erzeugt, die Sequenzen aber Ich bekomme unter Fehler Dosis jemand hat eine Ahnung davon?PLSQL einfügen und zurückgeben ID-Formular-Trigger auf Tabelle

ORA-00905: fehlendes Stichwort

ORA-06512: bei "ADMIN.F_INSERT_ORDER_DATA", Zeile 22

ORA-06512: in Zeile 5

CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA (P_CUSTOMER_ID IN NUMBER, 
                             P_NOTES    IN VARCHAR2) 
     RETURN NUMBER 
    IS 
     vCreated_ON DATE := SYSDATE; 
     vORDER_ID  NUMBER; 
     vSQL   VARCHAR2 (1024); 
    BEGIN 
     vSQL := 'INSERT INTO orders' 
              ||'(ORDER_ID,' 
              || 'CUSTOMER_ID,' 
              || 'NOTES,' 
              || 'CREATED_BY,' 
              || 'CREATED_ON)' 
              || 'VALUES (NULL,'         --ORDER_ID Filled by trigger 
              || P_CUSTOMER_ID|| ','       --CUSTOMER_ID 
              || ''''|| P_NOTES|| ''','        --NOTES 
              || '''SYSTEM'','          --CREATED_BY 
              || ''''|| vCREATED_ON|| ''')'     --CREATED_ON 
       || 'RETURNING ORDER_ID INTO vORDER_ID'; 

     EXECUTE IMMEDIATE vSQL; 
     DBMS_OUTPUT.PUT_LINE(vORDER_ID); 

     RETURN (vORDER_ID); 
    END F_INSERT_ORDER_DATA; 
    /

Berufung die Funktion, wie unten

declare 
    result varchar2(1024); 
begin 
    -- Call the function 
    result := F_INSERT_ORDER_DATA (1000,'----'); 

end; 

-Code-Update

CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA (P_CUSTOMER_ID IN NUMBER, 
               P_NOTES   IN VARCHAR2) 
    RETURN NUMBER 
IS 
    vORDER_ID  NUMBER; 
    vCreated_by VARCHAR2 (128) := 'SYSTEM'; 
    vCreated_ON DATE := SYSDATE; 
    sql_stmt  VARCHAR2 (1024); 
BEGIN 
    sql_stmt := 
     'INSERT INTO orders (ORDER_ID, 
                 CUSTOMER_ID, 
                 NOTES, 
                 CREATED_BY, 
                 CREATED_ON) 
             VALUES (NULL,         --ORDER_ID Filled by trigger 
                 :PCUSTOMER_ID,    --CUSTOMER_ID 
                 :PNOTES,       --NOTES 
                 :PCREATED_BY,     --CREATED_BY 
                 :PCREATED_ON,     --CREATED_ON 
        RETURNING ORDER_ID INTO :vORDER_ID'; 

    EXECUTE IMMEDIATE sql_stmt 
     USING P_CUSTOMER_ID, 
      P_NOTES, 
      VCreated_by, 
      vCreated_ON 
     RETURNING INTO vORDER_ID; 

    DBMS_OUTPUT.PUT_LINE (vORDER_ID); 

    RETURN (vORDER_ID); 
END F_INSERT_ORDER_DATA; 
/

Aufruf Funktion

DECLARE 
    vSQL VARCHAR2 (4000); 
    var  NUMBER; 
BEGIN 
    vSQL := 'F_INSERT_ORDER_DATA(:P_CUSTOMER_ID,:P_NOTES);'; 

    EXECUTE IMMEDIATE vSQL USING 1000, 'TEST' RETURNING INTO var; 

    DBMS_OUTPUT.PUT_LINE (var); 
END; 

Antwort

1

Es gibt nur wenige Probleme mit Ihrem Code. Zum einen ist die Bindung mit Rückgabeklausel nicht korrekt. Siehe unten, wie es bei dem Link funktioniert.

Execute Immediate with returning clause

CREATE OR REPLACE FUNCTION F_INSERT_ORDER_DATA(P_CUSTOMER_ID IN NUMBER, 
               P_NOTES  IN VARCHAR2) 
    RETURN NUMBER IS 
    vCreated_ON DATE := SYSDATE; 
    vORDER_ID NUMBER; 

BEGIN 
    vSQL := 'INSERT INTO orders' || '(ORDER_ID,' || 'CUSTOMER_ID,' || 
      'NOTES,' || 'CREATED_BY,' || 'CREATED_ON)' || 'VALUES (NULL,' --ORDER_ID Filled by trigger 
      || P_CUSTOMER_ID|| ',' --CUSTOMER_ID 
      || P_NOTES || ','--NOTES 
      || '''SYSTEM'',' --CREATED_BY 
      || '''' || vCREATED_ON || ''')' --CREATED_ON 
      || 'RETURNING ORDER_ID INTO :vORDER_ID'; 

    EXECUTE IMMEDIATE vSQL RETURNING INTO vORDER_ID ; 
    DBMS_OUTPUT.PUT_LINE(vORDER_ID); 

    RETURN(vORDER_ID); 
END F_INSERT_ORDER_DATA; 
/

Demo:

SQL> declare 
    2 var varchar2(4000); 
    3 var1 number; 
    4 begin 
    5 
    6 var := 'insert into dummy_emp(empid)values(2) RETURNING empID INTO :var1'; 
    7 
    8 execute immediate var 
    9  RETURNING INTO var1; 
10 commit; 
11  
12 dbms_output.put_line(var1); 
13 
14 end; 
15/

2 

PL/SQL procedure successfully completed. 

SQL> 

Dies ist, wie Sie benötigen, um Ihre Funktion in PLSQL Block zu nennen:

DECLARE  
    var  NUMBER; 
BEGIN 
    var := F_INSERT_ORDER_DATA(1000,'TEST'); 
    DBMS_OUTPUT.PUT_LINE (var); 
END; 

in Simple SQL Sie wie unten anrufen:

Select F_INSERT_ORDER_DATA(1000,'TEST') from dual; 
+0

Ich habe meinen Code entsprechend Ihren angegebenen Link zu aktualisieren und jetzt Fehler bei Aufruf der Funktions Teil erhalte ich ... 'ORA-00900: ungültigen SQL statement' und Fehler' ORA-06512: in Zeile 7' bitte, dass professionelle Art und Weise ist neu für mich, wenn Sie nicht einen Blick .thanks nehmen nichts dagegen meine aktualisiert Post – sam

+0

Überprüfen Sie, wie Sie Ihre Funktion in einem plsql Block – XING

+0

vielen dank für Brillianten mit professionellen Fähigkeiten unterstützen nennen kann ... ich schätze Ihre Freundlichkeit Unterstützung wirklich : – sam

Verwandte Themen