2017-03-10 1 views
0

Neue PL/SQL-Person hier. Ich habe eine (erfolgreich kompiliert) PL/SQL-Funktionsblock, der durch Hinzufügen eines neuen Begriffs es eine Tabelle in meiner Datenbank manipuliert:ORACLE PL/SQL: Gespeicherte Prozedurfunktion mit mehreren Parametern aufrufen (DML-Abfrage)

create or replace FUNCTION add_new_term 
    (TERM_ID_IN IN NUMBER, TERM_IN IN VARCHAR2, IS_METATERM_IN IN NUMBER) 
    RETURN VARCHAR2 
IS 
    add_term CV_TERMS.TERM_NAME%TYPE; --TERM_NAME is VARCHAR2 type 
BEGIN 
    INSERT INTO CV_TERMS (TERM_ID, TERM_NAME, IS_METATERM) 
    VALUES (TERM_ID_IN, TERM_IN, IS_METATERM_IN); 
    dbms_output.put_line('New term successfully added to CV_TERMS table: ' || TERM_IN); 
    RETURN add_term; 
EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN 
     raise_application_error (-20001, 'You have tried to insert a duplicate term.'); 
    WHEN OTHERS THEN  
     raise_application_error (-20002, 'An error has occurred inserting a term - '|| SQLCODE ||' -ERROR- '|| SQLERRM); 
END add_new_term; 

ich diese Funktion aufrufen wie eine gespeicherte Prozedur aufrufen:

DECLARE 
    add_term_success cv_terms.term_name%type; 
BEGIN 
    add_term_success := add_new_term(cv_terms_pk.NEXTVAL, 'TESTTT', 0); 
END; 

SQLDeveloper teilt mir mit, dass die Prozedur erfolgreich abgeschlossen wurde, der Begriff wurde jedoch nicht zur Tabelle hinzugefügt. Ich habe die Sequenz cv_terms_pk unabhängig erstellt (nicht in der Tabelle CV_TERMS 'SQL). Muss es da sein? Übergebe ich es falsch? Oder stimmt etwas nicht mit meiner add_term Deklaration? Ideen?

+3

tun Sie irgendwo begehen? – tbone

+0

Haben Sie die Tabelle abgefragt, um zu verifizieren, dass sie nicht da ist? Ich habe festgestellt, dass Sie 'add_term' zurückgeben, aber niemals einen Wert festlegen. Ebenso geben Sie eine Ausgabezeile zurück, nachdem Sie die Ausführung aufgrund der Rückgabe bereits beendet haben. Der Rückgabewert ist also immer 'NULL' und es wird niemals eine Ausgabe in der Konsole angezeigt. –

+0

@HepC Ich habe tatsächlich den Tisch abgefragt. Sie schreiben auf den Tisch. Wie dumm von mir. Als ich vorher in der Tabelle nach ihnen gesucht habe, sind sie nicht aufgetaucht. So funktioniert alles außer der Konsolenausgabe. Könntest du ein bisschen mehr erklären? Ich verstehe, dass ich die Rückleitung nach der Rückkehr (ich habe es geschaltet), aber so weit wie einen Wert auf "add_term" setzen? @ tbone Ich habe mich nicht verpflichtet. – snl330

Antwort

1

Nach dem DML-INSERT müssen Sie die Transaktion festschreiben.

create or replace FUNCTION add_new_term 
(TERM_ID_IN IN NUMBER, TERM_IN IN VARCHAR2, IS_METATERM_IN IN NUMBER) 
RETURN VARCHAR2 IS 
add_term CV_TERMS.TERM_NAME%TYPE; --TERM_NAME is VARCHAR2 type 

BEGIN INSERT INTO CV_TERMS(TERM_ID, TERM_NAME, IS_METATERM VALUES (TERM_ID_IN, TERM_IN, IS_METATERM_IN); COMMIT; ---LINE ADDED ...

+0

Danke, das habe ich schon gemacht :). Ein Teil des Problems war, dass meine Konsole keine Zeilen zurückgab, also musste ich 'SERVEROUTPUT ON 'setzen, um Diagnose zu bekommen. Als richtig gekennzeichnet. – snl330

Verwandte Themen