从同一包的过程中调用函数时出错

时间:2019-10-10 05:54:05

标签: database oracle plsql oracle11g

我是oracle的新手。我创建了一个包含spec和body的软件包。

它的标题是:

CREATE OR REPLACE PACKAGE OT.PK_TEST IS
FUNCTION PRNT_STRNG RETURN VARCHAR2;
PROCEDURE PR_SUPERHERO(F_NAME VARCHAR2,L_NAME VARCHAR2);
END PK_TEST;
/

它的身体是:

CREATE OR REPLACE PACKAGE BODY OT.PK_TEST IS
FUNCTION PRNT_STRNG 
RETURN VARCHAR2
IS
BEGIN
RETURN 'ASHWIN';
END PRNT_STRNG;
PROCEDURE PR_SUPERHERO(F_NAME VARCHAR2,L_NAME VARCHAR2) 
IS
BEGIN
OT.PK_TEST.PRNT_STRNG;
DBMS_OUTPUT.PUT_LINE(F_NAME);
DBMS_OUTPUT.PUT_LINE(L_NAME);
END PR_SUPERHERO;
END PK_TEST;
/

我想测试该函数是否可以从过程主体中调用。所以,我补充道:

OT.PK_TEST.PRNT_STRNG;

调用返回varchar的函数。但是,我得到了错误:

[Warning] ORA-24344: success with compilation error
11/1    PLS-00221: 'PRNT_STRNG' is not a procedure or is undefined
11/1    PL/SQL: Statement ignored
 (1: 0): Warning: compiled but with compilation errors

我可以从同一包的过程中调用函数吗?另外,我可以调用其他程序包的功能吗?

2 个答案:

答案 0 :(得分:3)

调用函数将返回输出。您需要将函数分配给变量,例如:

some_var = OT.PK_TEST.PRNT_STRNG;

您只能直接调用过程

答案 1 :(得分:1)

是的,您可以在同一程序包中调用函数/过程。您也可以从其他程序包或其他架构中调用其他函数,只需引用它即可。您唯一缺少的就是为您调用的函数的返回值分配一个变量。

您应该这样做:

v_temp VARCHAR2(32 CHAR);

BEGIN
    v_temp := OT.PK_TEST.PRNT_STRNG;
    DBMS_OUTPUT.PUT_LINE(v_temp );
    DBMS_OUTPUT.PUT_LINE(F_NAME);
    DBMS_OUTPUT.PUT_LINE(L_NAME);
END PR_SUPERHERO;