2017-03-10 60 views
0

這裏有新的PL/SQL人員。我有一個(成功編譯)PL/SQL的功能塊,通過添加一個新的名詞,以它操縱在我的數據庫中的表:ORACLE PL/SQL:使用多個參數調用存儲過程函數(DML查詢)

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; 

我調用這個函數就像調用存儲過程:

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

SQLDeveloper告訴我該過程已成功完成,但該術語尚未添加到表中。我獨立創建了序列cv_terms_pk(它不在表CV_TERMS'SQL中)。它需要在那裏嗎?我是否通過不正確?或者我的add_term聲明有問題?想法?

+3

你犯什麼地方? – tbone

+0

您是否查詢表格以驗證它不在那裏?我注意到你正在返回'add_term',但從來沒有設置一個值。同樣,您正在返回一行輸出,但是在您返回後已經停止執行之後。所以你的返回值將始終爲NULL,並且控制檯中不會顯示任何輸出。 –

+0

@HepC我的確在查詢表格。他們正在寫信給桌子。傻我。當我在桌子前搜索他們時,他們沒有出現。所以除了控制檯輸出外,所有東西都可以工你能再解釋一下嗎?我知道我在返回之後放置了返回行(我將其切換),但是將值設置爲'add_term'? @tbone我沒有提交。 – snl330

回答

1

在DML INSERT之後,您必須提交事務。

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

謝謝,我已經做到了:)。部分問題是我的控制檯沒有返回任何行,所以我不得不'SET SERVEROUTPUT ON'來獲取診斷信息。標記爲正確。 – snl330