当我运行此脚本时,它会在此语句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;
答案 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);