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

Posted

技术标签:

【中文标题】ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)【英文标题】:ORACLE PL/SQL: Calling stored procedure function with multiple parameters (DML query) 【发布时间】:2017-03-10 17:56:04 【问题描述】:

这里有新的 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 中)。它需要在那里吗?我通过它不正确吗?还是我的add_term 声明有问题?想法?

【问题讨论】:

你在某处提交过吗? 您是否查询过该表以确认它不存在?我注意到您返回 add_term,但从未设置值。同样,您正在返回一行输出,但在您已经因返回而停止执行之后。因此,您的返回值将始终为 NULL,并且控制台中不会显示任何输出。 @HepC 我确实查询了表格。他们正在写信给桌子。傻我。当我之前在表格中搜索它们时,它们没有出现。所以除了控制台输出外一切正常。你能再解释一下吗?我知道我将返回线放在返回之后(我切换了它),但至于将值设置为add_term? @tbone 我没有提交。 要在返回参数中获取值,您只需使用添加到 INSERT 语句末尾的 RETURNING INTO 子句。 @HepC 知道了,谢谢。我会 +1 你,但我还没有。 【参考方案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 ...

【讨论】:

谢谢,我已经这样做了:)。部分问题是我的控制台没有返回任何行,所以我必须SET SERVEROUTPUT ON 才能获得诊断。标记为正确。

以上是关于ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)的主要内容,如果未能解决你的问题,请参考以下文章

oracle-PL/SQL2

带有 PL SQL 表类型参数的 Oracle 存储过程的 JDBC 调用

oracle SQL语句中怎么样调用存储过程

Oracle 存储过程

Oracle 存储过程

Oracle Pl/sql 从多个查询中返回一个游标