2017-05-20 6 views
0

私はPL/SQLが初めてです。マークがある範囲でグレードを割り当てる簡単なコードを作成しようとしています。次のように私のコードは次のとおりです。PL/SQLのCASEは論理式によって制御されます

SET SERVEROUTPUT ON ; 
ACCEPT N PROMPT 'ENTER NAME: ' ; 
ACCEPT M PROMPT 'ENTER MARKS: ' ; 
DECLARE 
X CHAR ; 
BEGIN 
CASE TRUE 
WHEN (M BETWEEN 0 AND 40) THEN X := 'E' ; 
WHEN ((M>40)AND (M<=50)) THEN X := 'D' ; 
WHEN ((M>50)AND (M<=60)) THEN X := 'C' ; 
WHEN ((M>60)AND (M<=80)) THEN X := 'B' ; 
WHEN ((M>80)AND (M<=100)) THEN X := 'A' ; 
ELSE X := 'Z' ; 
END CASE ; 
IF(X = Z) THEN 
DBMS_OUTPUT.PUT_LINE('ERROR!!!! MARKS NOT IN RANGE'); 
ELSE 
DBMS_OUTPUT.PUT_LINE(N || ' HAVING GRADE ' || X); 
END IF; 
END; 
/

私は、私はそれを実行しようとすると、次のエラーを得続ける:

私が間違っているつもりです
ENTER NAME: D 
ENTER MARKS: 300 
WHEN (M BETWEEN 0 AND 40) THEN X := 'E' ; 
     * 
ERROR at line 5: 
ORA-06550: line 5, column 7: 
PLS-00201: identifier 'M' must be declared 
ORA-06550: line 4, column 1: 
PL/SQL: Statement ignored 
ORA-06550: line 12, column 8: 
PLS-00306: wrong number or types of arguments in call to 'Z' 
ORA-06550: line 12, column 1: 
PL/SQL: Statement ignored 

?プロンプトを使用してMの値を入力していますが、なぜ使用されていないのですか?

+1

@MatthewMcPeak「ACCEPT」は置換変数を作成します。バインド変数ではありません。 – MT0

答えて

1

あなたのCASE文を使用して、文法的に間違って何もありません。入力を代入変数として参照する必要があるため、エラーが発生します。 ACCEPTは、ユーザーから値を取得するためのSQL * Plusのコマンドです。コード自体では、置換変数の先頭にアンパサンドを付ける必要があります。コードを実行すると、SQL * Plusクライアントは置換変数の各インスタンスに入力値を注入します。

つ注意すべき点:

  1. 置換変数はリテラルです。したがって、文字列変数を一重引用符で囲む必要があります。
  2. デフォルトでは、SQL * Plusは各置換をエコーし​​ます。&Mがコードに頻繁に参照されると、非常に面倒です。 SQL * Plusコマンドset verify offでこの動作を抑制します。

ここには、置換変数が固定されたコードがあります。

DECLARE 
    X CHAR ; 
BEGIN 
    CASE TRUE 
     WHEN (&M BETWEEN 0 AND 40) THEN X := 'E' ; 
     WHEN ((&M>40)AND (&M<=50)) THEN X := 'D' ; 
     WHEN ((&M>50)AND (&M<=60)) THEN X := 'C' ; 
     WHEN ((&M>60)AND (&M<=80)) THEN X := 'B' ; 
     WHEN ((&M>80)AND (&M<=100)) THEN X := 'A' ; 
    ELSE 
     X := 'Z' ; 
    END CASE ; 
    IF(X = 'Z') THEN 
     DBMS_OUTPUT.PUT_LINE('ERROR!!!! MARKS NOT IN RANGE'); 
    ELSE 
     DBMS_OUTPUT.PUT_LINE('&N' || ' HAVING GRADE ' || X); 
    END IF; 
END; 
/
0

ACCEPTは、入力行を読み込み、置換変数に格納します。置換変数を使用する場合は、&variable_nameを使用します。また、CASE文で変数を割り当てることができません。

SET SERVEROUTPUT ON ; 
ACCEPT N CHAR PROMPT 'ENTER NAME: '; 
ACCEPT M NUMBER PROMPT 'ENTER MARKS: '; 

DECLARE 
    X CHAR(1) := CASE 
        WHEN &M BETWEEN 0 AND 40 THEN 'E' 
        WHEN &M BETWEEN 40 AND 50 THEN 'D' 
        WHEN &M BETWEEN 50 AND 60 THEN 'C' 
        WHEN &M BETWEEN 60 AND 80 THEN 'B' 
        WHEN &M BETWEEN 80 AND 100 THEN 'A' 
              ELSE 'Z' 
       END; 
BEGIN 
    IF X = 'Z' THEN 
    DBMS_OUTPUT.PUT_LINE('ERROR!!!! MARKS NOT IN RANGE'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE('&N HAVING GRADE ' || X); 
    END IF; 
END; 
/
+0

"また、CASE文に変数を代入することはできません"本当ですか? – APC

関連する問題