Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PLS-00201:必须在程序中声明标识符_Oracle_Stored Procedures_Plsql - Fatal编程技术网

Oracle PLS-00201:必须在程序中声明标识符

Oracle PLS-00201:必须在程序中声明标识符,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我有一个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 我正在研

我有一个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

到目前为止,我已经阅读了与此错误相关的解决方案和其他解决方案

您已经使用本地过程
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;
/
注意事项:

  • 如果参数为null,会发生什么情况
  • 如果两个参数的值相同,会发生什么情况
  • 约定是将其声明为函数并返回最大值,而不是设置OUT参数

    顺便说一句,我假设您这样做是一种练习,因为这是对的重新实现

    您已经使用本地过程
    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;
    /
    
    注意事项:

  • 如果参数为null,会发生什么情况
  • 如果两个参数的值相同,会发生什么情况
  • 约定是将其声明为函数并返回最大值,而不是设置OUT参数

    顺便说一句,我假设您这样做是一种练习,因为这是对的重新实现

    作为记录,这是一个半熟的实现作为记录,这是一个半熟的实现是的,我做这是一个练习,你的答案在理论上是有意义的,但是当我尝试应用
    创建或替换过程MAXINUM(N在数字中,m在数字中,O在数字中,p在数字中,X在数字中)由于
    我收到一个错误,说明
    PLS-00103:在预期以下情况时遇到符号“CREATE”:开始函数pragma过程子类型current cursor delete exists Previous
    也许一个描述性的答案可以帮到我?我想你仍在尝试在匿名块内定义过程。您需要首先在DDL的一个单独的独立部分中创建它。我扩展了我的答案来澄清这一点。是的,我正在做一个练习,你的答案在理论上是有意义的,但是当我尝试应用
    创建或替换程序MAXINUM(N在数字中,m在数字中,O在数字中,P在数字中,X在数字中)时,
    我得到一个错误,说明
    PLS-00103:遇到了符号“CREATE”当需要以下选项之一时:begin function pragma procedure subtype type current cursor delete exists previouss
    也许一个描述性的答案可以帮助我?我想您仍在尝试在匿名块中定义过程。您需要首先在DDL的一个单独的独立部分中创建它。为了澄清这一点,我扩大了我的答案。