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
)我相信在其他语言中也是可能的。