2012-03-31 14 views
3

私はこのスクリプトを実行すると、それはno1:=(no1+no2)-(no2:=no1);PL/SQLブロックの式の変数に値を割り当てる方法は?

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

別の割り当ての途中で値を割り当てることはできません。その行には ':='が2つあります。そのうちの1つを削除してください... – Ben

+0

なぜoracleはそのような機能を割り当てませんか? –

+4

おそらく必要はないからです。上記の行で1つの割り当てを行い、その行の値を使用することができます。 – Ben

答えて

9

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

とこのようにそれを使用します単に

temp変数

0123を使用せずに2つの変数をスワップ
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; 

をSQLステートメントを使用することができます

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

この文でエラーを返すことがエラーを生成していきますので、あなたは、単一のステートメントで複数の割り当て操作を行うことはできません。代わりに、私はあなたが一時変数を定義することをお勧めし、次のように、あなたのスワップ操作のためにそれを使用します(Swap XOR Algorithmを使用することによって、あなたはまた、無一時番号を持つ2つの数字を入れ替えることができます実際に

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

私はそれを持っていますが、一時変数なしで値を入れ替えたいのですが、それは です。 no1:= no1 + no2; no2:= no1-no2; no1:= no1-no2; –

+2

残念ながら、それは変数割り当てのコンセプトの性質に反しているため、可能ではないようです。だから私はそれがどのプログラミング言語でも可能だとは思わない。詳細は[PL/SQL Fundamentals](http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/02_funds.htm#3796)を参照してください。 –

+0

これはc/C++で動作し、現代のプログラミング言語で動作することを願っています。 –

3

います」それらを維持するために

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; 

方法PLSQLでビットごとのXORがhere

私見を参照してくださいかについては、1は実際のプログラムでワンライナーを避ける必要があり、それはそれらを書くために楽しいですが、地獄:まだ)3つのコマンドがあるでしょう...

1

あなたは、このようなインアウトパラメータで追加の手順を宣言することができます:あなたは、PL/SQLでのxorトリックを使用することに加えて

swap(a, b); 
関連する問題