2016-04-09 6 views
2

Ich versuche, PL/SQL zu lernen. Ich bin betroffen von diesem Code. Bitte benachrichtige mich, wo ich falsch liege. Ich benutze Oracle 10g in einer Befehlszeile.Warum funktioniert PL/SQL nicht?

declare 
grade char(1):='&v_grade'; 
app varchar(15); 
begin 
app:=case v_grade 
when 'a' then 
dbms_output.put_line('Excellent'); 
when 'b' then 
dbms_output.put_line('Good'); 
else 
dbms_output.put_line('Bad'); 
end case; 
dbms_output.put_line('Grade'||grade||' Appraisal:'||app); 
end; 
/

Es zeigt

Enter value for v_grade: a 
old 2: grade char(1):='&v_grade'; 
new 2: grade char(1):='a'; 
dbms_output.put_line('Excellent'); 
           * 
ERROR at line 7: 
ORA-06550: line 7, column 34: 
PLS-00103: Encountered the symbol ";" when expecting one of the following: 
. (* % & = - + </> at else end in is mod remainder not rem 
when <an exponent (**)> <> or != or ~= >= <= <> and or like 
LIKE2_ LIKE4_ LIKEC_ between || multiset member SUBMULTISET_ 
The symbol ";" was ignored. 
ORA-06550: line 9, column 29: 
PLS-00103: Encountered the symbol ";" when expecting one of the following: 
. (* % & = - + </> at else end in is mod remainder not rem 
when <an exponent (**)> <> or != or ~= >= <= <> and or like 
LIKE2_ LIKE4_ LIKEC_ between || 
ORA-06550: line 11, column 28: 
PLS-00103: Encountered the symbol ";" when expecting one of the following: 
. (* % & = - + </> at end in is mod remainder not rem 
<an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_ 
LIKE4_ LIKEC_ between || multiset 

mir bitte mitteilen, wo ich falsch werde.

+1

Ich weiß nichts über PL/SQL, aber ich würde vermuten, dass, da die 'put_line 'in einem' case ... wenn ... dann 'ein' '' ist, nachdem es falsch ist. In SQL beendet '' 'Anweisungen. Sie möchten die Anweisung dort nicht beenden. Die Aussage endet erst nach dem "end case" (und Sie haben ein '' '' '' '', das ist passend). –

Antwort

3

T.J. Crowder hat recht, man sollte innerhalb einer case-Anweisung in SQL kein Semikolon haben, aber das ist die PL/SQL-Version, also ist es etwas anders.

Sie versuchen gerade, die (nicht existierende) Rückmeldung vom dbms_output.put_line-Aufruf (Nicht-Funktion) Ihrer app Variablen zuzuweisen.

Damit die Zuweisung funktioniert, müssen Sie die case zu einer Zeichenfolge auswerten, so dass Sie einfach Textliterale verwenden können; aber die Zuordnung muss in jedem Zweig sein:

declare 
    grade char(1):='&v_grade'; 
    app varchar(15); 
begin 
    case grade 
    when 'a' then app:= 'Excellent'; 
    when 'b' then app:= 'Good'; 
    else app := 'Bad'; 
    end case; 

    dbms_output.put_line('Grade '||grade||' Appraisal: '||app); 
end; 
/

die, wenn sie laufen wird:

Enter value for v_grade: a 
Grade b Appraisal: Excellent 

PL/SQL procedure successfully completed. 

Oder eine Abfrage verwenden, um die Zuordnung zu tun, auch wenn dies nicht ganz so effizient ist:

declare 
    grade char(1):='&v_grade'; 
    app varchar(15); 
begin 
    select case grade 
    when 'a' then 'Excellent' 
    when 'b' then 'Good' 
    else 'Bad' 
    end case 
    into app 
    from dual; 
    dbms_output.put_line('Grade '||grade||' Appraisal: '||app); 
end; 
/

Enter value for v_grade: b 
Grade b Appraisal: Good 

PL/SQL procedure successfully completed. 

Oder Sie können in jedem Zweig die Ausgabe direkt tun:

declare 
    grade char(1):='&v_grade'; 
begin 
    dbms_output.put('Grade '||grade||' Appraisal: '); 
    case grade 
    when 'a' then 
     dbms_output.put_line('Excellent'); 
    when 'b' then 
     dbms_output.put_line('Good'); 
    else 
     dbms_output.put_line('Bad'); 
    end case; 
end; 
/

Enter value for v_grade: c 
Grade c Appraisal: Bad 

PL/SQL procedure successfully completed. 

Der erste Teil Ihrer Ausgabe ist jetzt vor dem Fall.

Sie vermischen die verschiedenen Ansätze im Grunde.

Vielleicht möchten Sie die erste Zeile ändern:

grade char(1):= upper('&v_grade'); 

... und dann den Fall aussehen lassen für A, B, C statt a, b, c - dann wird es keine Rolle In welchem ​​Fall der Eingang ist.

Sie können mehr über die PL/SQL case Statemnt here und here lesen.

+0

Ich vermutete das Bit darüber keinen Wert, aber wie gesagt, ich weiß nichts über PL/SQL, also ... :-) –

+0

Ich bekomme immer noch einen Fehler bei Zeile 9 Spalte 7 'Wert für v_grade eingeben: a alt 2: Note char (1): = '& v_grade'; neu 2: Note char (1): = 'a'; Endfall; * FEHLER bei Zeile 9: ORA-06550: Zeile 9, Spalte 7: PLS-00103: Das Symbol "CASE" wurde gefunden, wenn eines der folgenden Ereignisse erwartet wird: * & = - +; bei in ist Mod Rest nicht rem <> oder!= oder ~ => = <= <> und oder wie LIKE2_ LIKE4_ LIKEC_ zwischen || Multiset-Member SUBMULTISET_ Das Symbol "CASE" wurde ignoriert. ' –

+0

@AravindS - ja, tut mir leid, ich habe deinen Auftrag weitergeführt und nicht registriert, dass du das nicht kannst. Ich habe mit drei Alternativen aktualisiert. –