PLS-00201:标识符必须在过程中声明
Posted
技术标签:
【中文标题】PLS-00201:标识符必须在过程中声明【英文标题】:PLS-00201: identifier must be declared in Procedure 【发布时间】:2017-08-30 05:33:43 【问题描述】:我有一个 PL/SQL 过程代码,它在 /
时运行,但在执行时不运行。我得到的错误信息是
SQL> EXECUTE MAXINUM;
BEGIN MAXINUM; END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'MAXINUM' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
我正在处理的代码是:
DECLARE
N NUMBER;
M NUMBER;
O NUMBER;
P NUMBER;
X NUMBER;
PROCEDURE MAXINUM(N IN NUMBER, M IN NUMBER, O IN NUMBER, P IN NUMBER, X OUT NUMBER) IS
BEGIN
IF N>M AND N>O AND N>P THEN
X:=N;
ELSIF M>N AND M>O AND M>P THEN
X:=M;
ELSIF O>N AND O>M AND O>P THEN
X:=O;
ELSIF P>N AND P>M AND P>O THEN
X:=P;
END IF;
END;
BEGIN
N:=&NUMBER;
M:=&NUMBER;
O:=&NUMBER;
P:=&NUMBER;
MAXINUM(N,M,O,P,X);
DBMS_OUTPUT.PUT_LINE('HIGHEST NUMBER = '||X);
END;
/
当它给出“标识符错误”时,我尝试删除此过程,但出现错误:
SQL> DROP PROCEDURE MAXINUM;
DROP PROCEDURE MAXINUM
*
ERROR at line 1:
ORA-04043: object MAXINUM does not exist
到目前为止,我已经阅读了this、this、this 解决方案和其他一些与此错误相关的解决方案。
【问题讨论】:
郑重声明,这是the Oracle built-in functiongreatest()
的半熟实现
【参考方案1】:
您已经使用本地过程MAXINUM()
编写了一个匿名块。该过程可以在该块内调用,但在该块外不存在。因此,您不能独立调用它。
如果您想在其他地方使用该过程,您需要将其创建为一流的数据库对象:
create or replace procedure MAXINUM
(N IN NUMBER, M IN NUMBER, O IN NUMBER, P IN NUMBER, X OUT NUMBER)
is
BEGIN
IF N>M AND N>O AND N>P THEN
X:=N;
ELSIF M>N AND M>O AND M>P THEN
X:=M;
ELSIF O>N AND O>M AND O>P THEN
X:=O;
ELSIF P>N AND P>M AND P>O THEN
X:=P;
END IF;
END;
/
现在您可以在代码中调用它,如下所示:
DECLARE
N NUMBER;
M NUMBER;
O NUMBER;
P NUMBER;
X NUMBER;
BEGIN
N:=&NUMBER;
M:=&NUMBER;
O:=&NUMBER;
P:=&NUMBER;
MAXINUM(N,M,O,P,X);
DBMS_OUTPUT.PUT_LINE('HIGHEST NUMBER = '||X);
END;
/
注意事项:
-
如果参数为空怎么办?
如果两个参数的值相同会怎样?
约定是将其声明为函数并返回最大值,而不是设置 OUT 参数。
顺便说一句,我假设您将其作为练习,因为它是an existing Oracle built-in function, greatest()
的重新实现。
【讨论】:
是的,我正在做这个练习,你的回答在理论上是有道理的,但是当我尝试应用CREATE OR REPLACE PROCEDURE MAXINUM(N IN NUMBER, M IN NUMBER, O IN NUMBER, P IN NUMBER, X OUT NUMBER) AS
时,我收到一条错误消息,指出 PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: begin function pragma procedure subtype type <an identifier> <a double-quoted delimited-identifier> current cursor delete exists prior
也许描述性的答案可能对我有帮助?
我认为您仍在尝试在匿名块内定义过程。您需要先在一个单独的独立 DDL 中创建它。我已经扩展了我的答案以澄清这一点。以上是关于PLS-00201:标识符必须在过程中声明的主要内容,如果未能解决你的问题,请参考以下文章
c# 调用Oracle存储过程 PLS-00201:必须声明标识符
PL SQL,错误(32,43):PLS-00201:必须声明标识符“HR”
oracle运行存储过程报PLS-00201: 必须声明标识符