2017-08-30 252 views
1

我有一个PL/SQL过程代码,它在/时运行,但在执行时不运行。该错误消息我得到的是PLS-00201:必须声明标识符

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 

我至今读thisthisthis解决方案和其他解决方案有些什么与此相关的错误。

+1

为了记录,这是[Oracle的内建函数'maxim()']的一个半熟的实现(http://docs.oracle.com/database/121/SQLRF/functions078.htm#SQLRF00645 ) – APC

回答

4

您已经使用本地过程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; 
/

注意事项:

  1. 如果参数为空,会发生什么情况?
  2. 如果两个参数具有相同的值,会发生什么情况?
  3. 约定将声明这是一个函数并返回最高值而不是设置OUT参数。

顺便说一句我认为你这样做是作为一个练习的,因为它是一个重新实现an existing Oracle built-in function, greatest()

+0

是的,我正在做这个练习,你的回答在理论上是有道理的,但是当我尝试应用'CREATE OR REPLACE PROCEDURE MAXINUM(N为数字,M为数字,O为数字,P为数字,X为数字)AS'我得到一个错误,说明'PLS-00103:在遇到下列其中一个时遇到符号'CREATE': begin函数pragma过程子类型类型<标识符> 当前光标删除 存在之前'也许一个描述性的答案可能会帮助我? –

相关问题