ELSE如果不在PL/SQL中工作

MDP*_*MDP 3 oracle plsql

当我尝试ELSE IF在程序中使用a时,我遇到了一个奇怪的错误,我无法理解我做错了什么.我正在用TOAD创建程序.

此代码有效:

CREATE OR REPLACE PROCEDURE findMin(valore1 in integer, valore2 in integer, risultato out integer) IS
BEGIN
    IF(valore1 < valore2) THEN
        risultato:= valore1;
    ELSE
        risultato:= valore2;             
    END IF;
END;   
/  
Run Code Online (Sandbox Code Playgroud)

事实并非如此.我在最后一行代码中得到此错误:Found: ';' - Expecting IF

CREATE OR REPLACE PROCEDURE findMin(valore1 in integer, valore2 in integer, risultato out integer) IS
BEGIN
    IF(valore1 < valore2) THEN
        risultato:= valore1;
    ELSE IF (valore1 > valore2) THEN
        risultato:= valore2;    
    ELSE
        risultato := 0;              
    END IF;
END;  --here I get the error 
/  
Run Code Online (Sandbox Code Playgroud)

我的错误是什么?

谢谢

Ale*_*ole 7

如果你缩进else块,你可以看到你错过了end if:

BEGIN
    IF(valore1 < valore2) THEN
        risultato:= valore1;
    ELSE
        IF (valore1 > valore2) THEN
            risultato:= valore2;    
        ELSE
            risultato := 0;              
        END IF;
    -- missing an END IF
END;
Run Code Online (Sandbox Code Playgroud)

您需要添加:

CREATE OR REPLACE PROCEDURE findMin(valore1 in integer, valore2 in integer,
  risultato out integer) IS
BEGIN
    IF valore1 < valore2 THEN
        risultato:= valore1;
    ELSE
        IF valore1 > valore2 THEN
            risultato:= valore2;    
        ELSE
            risultato := 0;              
        END IF;
    END IF;
END;
/

Procedure FINDMIN compiled
Run Code Online (Sandbox Code Playgroud)

或者更简单地说,改为elsif:

CREATE OR REPLACE PROCEDURE findMin(valore1 in integer, valore2 in integer,
  risultato out integer) IS
BEGIN
    IF valore1 < valore2 THEN
        risultato:= valore1;
    ELSIF valore1 > valore2 THEN
        risultato:= valore2;    
    ELSE
        risultato := 0;              
    END IF;
END;
/

Procedure FINDMIN compiled
Run Code Online (Sandbox Code Playgroud)

你也可以在这里使用case语句:

CREATE OR REPLACE PROCEDURE findMin(valore1 in integer, valore2 in integer, risultato out integer) IS
BEGIN
    CASE
        WHEN valore1 < valore2 THEN
            risultato:= valore1;
        WHEN valore1 > valore2 THEN
            risultato:= valore2;    
        ELSE
            risultato := 0;              
    END CASE;
END;
/

Procedure FINDMIN compiled
Run Code Online (Sandbox Code Playgroud)

或者甚至只是一个case表达式,因为这个例子是一个简单的单一赋值:

CREATE OR REPLACE PROCEDURE findMin(valore1 in integer, valore2 in integer,
  risultato out integer) IS
BEGIN
    risultato := CASE
            WHEN valore1 < valore2 THEN valore1
            WHEN valore1 > valore2 THEN valore2
            ELSE 0
        END;
END;
/

Procedure FINDMIN compiled
Run Code Online (Sandbox Code Playgroud)

阅读有关PL/SQL中条件语句的更多信息.