ORACLE PL/SQL:使用多个参数调用存储过程函数(DML查询)

ORACLE PL/SQL:使用多个参数调用存储过程函数(DML查询),oracle,stored-procedures,plsql,stored-functions,Oracle,Stored Procedures,Plsql,Stored Functions,这里是新的PL/SQL人员。我有一个成功编译的PL/SQL函数块,它通过向数据库中的表添加一个新术语来操作该表: 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 VAR

这里是新的PL/SQL人员。我有一个成功编译的PL/SQL函数块,它通过向数据库中的表添加一个新术语来操作该表:

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中。它需要在那里吗?我是不是传错了?还是我的附加条款声明有问题?想法?

插入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
开始 插入到CV_TERMSTERM_ID中,TERM_NAME,IS_METATERM 值TERM_ID_IN、TERM_IN、IS_METATERM_IN;
承诺--行已添加…

您是否在某处提交?是否查询表以验证它是否不存在?我注意到您正在返回add_term,但从未设置值。同样,您正在返回一行输出,但由于返回已经停止执行。因此,您的返回值将始终为空,并且控制台中不会显示任何输出。@HepC我确实查询了该表。他们正在给桌子写信。我真傻。以前我在桌子里找他们的时候,他们没有出现。因此,除了控制台输出之外,其他一切都正常工作。你能再解释一下吗?我知道我把返回线放在返回后,我切换了它,但至于设置一个值来添加_项@tbone我没有提交。要在返回参数中获取值,只需使用添加到INSERT语句末尾的子句。@HepC获得了,谢谢。我会+1你,但我还没到那里。谢谢,我已经这么做了:。问题的一部分是我的控制台没有返回任何行,因此我必须将SERVEROUTPUT设置为打开才能进行诊断。标记为正确的。