2017-08-30 291 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過程子類型類型<標識符> 當前光標刪除 存在之前'也許一個描述性的答案可能會幫助我? –

相關問題