2017-08-30 105 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の組み込み関数 'greatest()'](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. パラメータがnullの場合はどうなりますか?
  2. 2つの引数の値が同じ場合はどうなりますか?
  3. 慣例では、これを関数として宣言し、OUTパラメータを設定する代わりに最高値を返します。ちなみに

それはan existing Oracle built-in function, greatest()の再実装であるように私は、あなたが練習としてこれをやっていると仮定します。

+0

はい、私はこのエクササイズをしていますが、あなたの答えは理にかなっていますが、私は 'CREATE OR REPLACE PROCEDURE MAXINUM(数字ではM、数字では、数字でP、数字ではX、 )AS' PLS-00103:以下のいずれかが予想されるときにシンボル "CREATE"を検出しました。 begin関数pragma手続きサブタイプタイプ<識別子> 現在のカーソル削除 が存在する 'おそらく説明的な答えが私を助けてくれるだろうか? –

関連する問題