如何为PL / SQL块的表达式中的变量赋值?

时间:2012-03-31 17:00:13

标签: oracle plsql

当我运行此脚本时,它会在此语句no1:=(no1+no2)-(no2:=no1);

中返回错误
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;

4 个答案:

答案 0 :(得分:11)

除了在PL / SQL中使用xor技巧外,您还可以使用SQL语句

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> 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.

答案 1 :(得分:3)

实际上,您还可以使用Swap XOR Algorithm交换两个没有临时号码的号码(但您仍然有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如何看{4}}

恕我直言,人们应该避免使用实际程序中的单行程序,编写它们很有趣但是很难维护它们......

答案 2 :(得分: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;

答案 3 :(得分:1)

您可以声明一个带有输入输出参数的附加程序,如下所示:

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

并像这样使用它:

swap(a, b);