Как присвоить значение переменной в выражении для блока PL / SQL? - PullRequest
3 голосов
/ 31 марта 2012

Когда я запускаю этот скрипт, он возвращает ошибку в этом утверждении 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 ]

11 голосов
/ 01 апреля 2012

В дополнение к использованию трюка xor в PL / SQL, вы можете просто использовать оператор 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.
3 голосов
/ 01 апреля 2012

На самом деле, вы также можете поменять местами два числа без временного числа, используя Алгоритм обмена XOR (но у вас все равно будет 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;

Относительно того, как сделать битовый xor в plsql, см. здесь

ИМХО, в реальных программах следует избегать однострочников, писать их забавно, но поддерживать их чертовски ...

2 голосов
/ 31 марта 2012

Вы не можете выполнить несколько операций присваивания в одном операторе, что будет приводить к возникновению ошибок.Вместо этого я предлагаю вам определить временную переменную и использовать ее для операции подкачки, например:

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;
1 голос
/ 01 апреля 2012

Вы можете объявить дополнительную процедуру с параметрами ввода-вывода, например:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...