2012-03-31 5 views
3

Wenn ich dieses Skript ausführen es Fehler in dieser Aussage no1:=(no1+no2)-(no2:=no1);Wie wird der Variablen im Ausdruck für einen PL/SQL-Block ein Wert zugewiesen?

declare 
    no1 number(3):=31; 
    no2 number(3):=34; 
begin 
    dbms_output.put_line('Before swap'); 
    dbms_output.put_line('No1 : '||no1||' No2 : '||no2); 
-- no1:=(no1+no2)-(no2:=no1); generate error 
    dbms_output.put_line('After swap'); 
    dbms_output.put_line('No1 : '||no1||' No2 : '||no2); 
end; 
+0

Sie können keinen Wert in der Mitte einer anderen Zuweisung zuweisen. Sie haben 2 ': =' in dieser Zeile. Entfernen Sie einen von ihnen ... – Ben

+0

Warum Oracle bietet solche Möglichkeit für die Zuordnung keine Idee? –

+4

Weil es wahrscheinlich nicht nötig ist. Sie können eine Zuweisung in der obigen Zeile ausführen und diesen Wert dann in der neuen Zeile verwenden. – Ben

Antwort

9

Zusätzlich in PL/SQL die xor Trick verwenden, können Sie kann einfach eine SQL-Anweisung

DECLARE 
    a number := 17; 
    b number := 42; 
BEGIN 
    SELECT a, b 
    INTO b, a 
    FROM dual; 
    dbms_output.put_line('a = ' || a); 
    dbms_output.put_line('b = ' || b); 
END; 

verwenden, die ohne Verwendung einer temporären Variable

die beiden Variablen austauscht
SQL> ed 
Wrote file afiedt.buf 

    1 DECLARE 
    2 a number := 17; 
    3 b number := 42; 
    4 BEGIN 
    5 SELECT a, b 
    6  INTO b, a 
    7  FROM dual; 
    8 dbms_output.put_line('a = ' || a); 
    9 dbms_output.put_line('b = ' || b); 
10* END; 
SQL>/
a = 42 
b = 17 

PL/SQL procedure successfully completed. 
2

Sie mehrere Zuweisungsoperationen in einer einzigen Anweisung machen kann nicht zurückkehrt, so dass Fehler generieren halten. Stattdessen empfehle ich Ihnen eine temporäre Variable zu definieren und diese für Ihre Swap-Operation, wie die folgenden:

declare 
    no1 number(3):=31; 
    no2 number(3):=34; 
    temp number; 
begin 
    dbms_output.put_line('Before swap'); 
    dbms_output.put_line('No1 : '||no1||' No2 : '||no2); 
    -- no1:=(no1+no2)-(no2:=no1); generate error 
    temp := no1; 
    no1 := no2; 
    no2 : temp; 
    dbms_output.put_line('After swap'); 
    dbms_output.put_line('No1 : '||no1||' No2 : '||no2); 
end; 
+0

Ok ich habe es aber ich möchte Werte ohne Temp-Variable austauschen und das ist no1: = no1 + no2; no2: = no1-no2; no1: = no1-no2; –

+2

Leider scheint dies nicht möglich zu sein, da es gegen die Natur der variablen Zuweisung ist. Ich denke also nicht, dass es in irgendeiner Programmiersprache möglich ist. Vielleicht möchten Sie [PL/SQL Fundamentals] (http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/02_funds.htm#3796) für weitere Details überprüfen. –

+0

Es funktioniert in C/C++ und hoffe, in modernen Programmiersprachen zu arbeiten. –

3

Eigentlich kann man auch tauschen zwei Zahlen ohne temporäre Nummer, durch die Swap XOR Algorithm mit (aber Sie‘ ll noch 3 Befehle haben):

declare 
    no1 number(3):=31; 
    no2 number(3):=34; 
begin 
    dbms_output.put_line('Before swap'); 
    dbms_output.put_line('No1 : '||no1||' No2 : '||no2); 

    n1 := (n1 + n2) - bitand(n1,n2) * 2; 
    n2 := (n2 + n1) - bitand(n2,n1) * 2; 
    n1 := (n1 + n2) - bitand(n1,n2) * 2; 

    dbms_output.put_line('After swap'); 
    dbms_output.put_line('No1 : '||no1||' No2 : '||no2); 
end; 

Was wie bitweise xor tun in plsql here

IMHO zu sehen, sollte man Einzeiler in realen Programmen zu vermeiden, es macht Spaß, sie zu schreiben, aber die Hölle, sie zu pflegen ...

1

Sie können ein zusätzliches Verfahren mit in-out-Parameter wie folgt erklären:

PROCEDURE swap(a IN OUT NUMBER, b IN OUT NUMBER) is 
    buff NUMBER; 
BEGIN 
    buff := a; 
    a := b; 
    b := buff; 
END swap; 

und es wie folgt verwendet werden:

swap(a, b); 
Verwandte Themen