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

Oracle 如何为PL/SQL块的表达式中的变量赋值?,oracle,plsql,Oracle,Plsql,当我运行这个脚本时,它在以下语句中返回错误no1:=(no1+no2)-(no2:=no1) 不能在一条语句中执行多个赋值操作,这样会不断产生错误。相反,我建议您定义一个临时变量并将其用于交换操作,如下所示: declare no1 number(3):=31; no2 number(3):=34; temp number; begin dbms_output.put_line('Before swap'); dbms_output.put_line('No1 : '||no

当我运行这个脚本时,它在以下语句中返回错误
no1:=(no1+no2)-(no2:=no1)


不能在一条语句中执行多个赋值操作,这样会不断产生错误。相反,我建议您定义一个临时变量并将其用于交换操作,如下所示:

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个命令):

关于plsql中的按位异或,请参见


总之,在实际程序中应该避免使用单行程序,编写它们很有趣,但维护它们却很困难……

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

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);
然后像这样使用它:

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);

除了在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.

不能在另一个赋值中间分配值。那一行中有2个
:=
。删除其中一个…为什么oracle不提供这样的分配工具?有什么想法吗?因为没有必要这样做。你可以在上面的一行上做一个赋值,然后在新行中使用这个值;no2:=no1-no2;no1:=no1-no2;不幸的是,这似乎不可能,因为这违背了变量赋值概念的本质。所以我认为这在任何编程语言中都是不可能的。您可能需要查看更多详细信息。它在c/c++中工作,希望在现代编程语言中也能工作。@KorhanÖztürk,在python@KorhanOzturk这是可能的。(简单地说就是
no1,no2=no1+no2,no1-no2
)我相信在其他语言中也是可能的。