Ran*_*guy 1 oracle plsql oracle11g
我有一个包含 specs 和 body 的包。
它的规格是
CREATE OR REPLACE PACKAGE OT.PK_TEST IS
FUNCTION PRNT_STRNG RETURN VARCHAR2;
PROCEDURE PR_SUPERHERO(F_NAME VARCHAR2,L_NAME VARCHAR2);
PROCEDURE PR_new(full_name VARCHAR2);
END PK_TEST;
/
Run Code Online (Sandbox Code Playgroud)
它的身体是:
CREATE OR REPLACE PACKAGE BODY OT.PK_TEST IS
FUNCTION PRNT_STRNG
RETURN VARCHAR2
IS
BEGIN
RETURN 'SUMAN';
END PRNT_STRNG;
PROCEDURE PR_SUPERHERO(F_NAME VARCHAR2,L_NAME VARCHAR2)
IS
OLD_NAME VARCHAR2(255);
BEGIN
DBMS_OUTPUT.PUT_LINE(F_NAME);
DBMS_OUTPUT.PUT_LINE(L_NAME);
OT.PR_new(f_name||L_NAME);
DBMS_OUTPUT.PUT_LINE('----------');
OLD_NAME :=OT.PRNT_STRNG;
DBMS_OUTPUT.PUT_LINE(OLD_NAME);
END PR_SUPERHERO;
PROCEDURE PR_new(full_name VARCHAR2)
IS
V_NAME VARCHAR2(255) :=FULL_NAME;
BEGIN
DBMS_OUTPUT.PUT_LINE(V_NAME);
END PR_new;
END PK_TEST;
/
Run Code Online (Sandbox Code Playgroud)
但是当我编译 body 时,我得到的错误是:
[Warning] ORA-24344: success with compilation error
14/1 PLS-00201: identifier 'OT.PR_NEW' must be declared
14/1 PL/SQL: Statement ignored
16/12 PLS-00201: identifier 'OT.PRNT_STRNG' must be declared
16/1 PL/SQL: Statement ignored
(1: 0): Warning: compiled but with compilation errors
Run Code Online (Sandbox Code Playgroud)
为什么会出现这个错误?我犯了什么错误?
通常,如果要从同一包中的不同方法调用包中的方法,则无需限定方法名称。如果你只是打电话
PR_new(f_name||L_NAME);
Run Code Online (Sandbox Code Playgroud)
默认为模式中包中的pr_new过程。如果您确实想要限定过程名称,您可以这样做或。所以要么pk_testotpackage.methodschema.package.method
pk_test.PR_new(f_name||L_NAME);
Run Code Online (Sandbox Code Playgroud)
或者
ot.pk_test.PR_new(f_name||L_NAME);
Run Code Online (Sandbox Code Playgroud)
将是合法的。