Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 NVL в цикле for ... in  [new]
ananax
Member

Откуда: MO
Сообщений: 424
День добрый!
вот не могу разобраться, почему не работает, и как сделать, чтоб работало?
select 'hello' aaa from dual where 100 = nvl((select null from dual),100)
вот хорошо работает.
Но почему-то вот так не работает (((
declare 
  i integer;
begin
  for x in (select 'hello' aaa from dual where 100 = nvl((select null from dual),100))
  loop
    Dbms_Output.put_line(x.aaa);
  end loop;
end;
Как быть?
25 апр 07, 14:01    [4068523]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
ananax
Как быть?


Перейти на Oracle 10g
25 апр 07, 14:03    [4068547]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116070
ananax
Как быть?


Поднять версию :-)
У меня на 10.2.0.1 все ОК...

PL/SQL - движок в очередной раз не догнал SQL...
На сей раз на скалярных подзапросах ...
25 апр 07, 14:03    [4068548]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
Mikst
Member

Откуда: Москва
Сообщений: 983
очень даже работает:
SQL*Plus: Release 9.2.0.1.0 - Production on Срд Апр 25 14:02:41 2007

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Введите пароль: ********

Присоединен к:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production

SQL> set serveroutput on
SQL> declare 
  2    i integer;
  3  begin
  4    for x in (select 'hello' aaa from dual where 100 = nvl((select null from dual),100))
  5    loop
  6      Dbms_Output.put_line(x.aaa);
  7    end loop;
  8  end;
  9  /
hello

Процедура PL/SQL успешно завершена.

SQL> 
25 апр 07, 14:03    [4068549]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
Mikst
Member

Откуда: Москва
Сообщений: 983
наверное все дело в волшебный пузырьках (serveroutput)
25 апр 07, 14:05    [4068565]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Connected to Oracle8i Enterprise Edition Release 8.1.7.0.1 
Connected as qwerty


SQL> 
SQL> declare
  2    
  3    i integer;
  4  begin
  5    
  6    for x in (select 'hello' aaa from dual where 100 = nvl(select 100 from dual,100))
  7    loop
  8  
  9    Dbms_Output.put_line(x.aaa);
 10    end loop;
 11  end;
 12  /

declare
  
  i integer;
begin
  
  for x in (select 'hello' aaa from dual where 100 = nvl(select 100 from dual,100))
  loop

  Dbms_Output.put_line(x.aaa);
  end loop;
end;

ORA-06550: line 6, column 58:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

   ( ) - + mod not null others <an identifier>
   <a double-quoted delimited-identifier> <a bind variable>
   table avg count current exists max min prior sql stddev sum
   variance execute multiset the both leading trailing forall
   year month DAY_ HOUR_ MINUTE_ second TIMEZONE_HOUR_
   TIMEZONE_MINUTE_ time timestamp interval date
   <a string literal with character set specification>
   <a number> <a single-quoted SQL stri
ORA-06550: line 6, column 79:
PLS-00103: Encountered the symbol "100" when expecting one of the following:

   ( <an identifier> <a double-quoted delimited-identifier>
   table the
The symbol "<an identifier> was inserted before "100" to continue.

SQL> 
25 апр 07, 14:05    [4068568]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
У меня на 10g тоже не работает.
Говорит:

SQL> declare 
  2    i integer;
  3  begin
  4    for x in (select 'hello' aaa from dual where 100 = nvl((select null from dual),100))
  5    loop
  6      Dbms_Output.put_line(x.aaa);
  7    end loop;
  8  end;
  9  /
ERROR:
ORA-03114: not connected to ORACLE


declare
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
25 апр 07, 14:06    [4068572]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
mcureenab

Админа на мыло.
25 апр 07, 14:09    [4068601]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
ananax
ORA-06550: line 6, column 58:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

( ) - + mod not null others <an identifier>


Прально рвёт. Ты сообщение об ошибке то читай, читай. Подапросы то в () положено брать.

nvl((select 100 from dual), ...
25 апр 07, 14:09    [4068605]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
grexhide
mcureenab

Админа на мыло.


Админа я ценю, пусть живёт. ananax на мыло. Пусть правила форума почитает. А то мода пошла, написать на заборе "хрень" и голословно заявлять, что якобы "хрень" не работает.
25 апр 07, 14:12    [4068633]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
ananax
Member

Откуда: MO
Сообщений: 424
mcureenab

Это был крайний вариант... (((
со скобками тоже не работает (((
25 апр 07, 14:12    [4068636]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
mcureenab
Админа я ценю, пусть живёт.


Напрасно. В 10.2.0.x работает и так, и сяк (со скобками и без). Или может у вас какой дикий 10.1.x.y?
25 апр 07, 14:14    [4068649]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
ananax
mcureenab

Это был крайний вариант... (((
со скобками тоже не работает (((


Не верю. Пиши пример. Что что ожидал, что получил.
25 апр 07, 14:15    [4068656]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
grexhide
mcureenab
Админа я ценю, пусть живёт.


Напрасно. В 10.2.0.x работает и так, и сяк (со скобками и без). Или может у вас какой дикий 10.1.x.y?


Да тут всё просто. Комп ночь простоял в коме, вот оракл его и отрубил. А без скобок всё равно совершенно справдливо не работает.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning and Data Mining Scoring Engine options

...

  for x in (select 'hello' aaa from dual where 100 = nvl(select null from dual,100))
                                                        *
ERROR at line 4:
ORA-06550: line 4, column 57:
PL/SQL: ORA-00936: missing expression
ORA-06550: line 4, column 12:
PL/SQL: SQL Statement ignored
25 апр 07, 14:21    [4068708]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
ananax
Member

Откуда: MO
Сообщений: 424
mcureenab

Не верю. Пиши пример. Что что ожидал, что получил.

Connected to Oracle8i Enterprise Edition Release 8.1.7.0.1 
Connected as йцуке


SQL> 
SQL> 
SQL> declare
  2    
  3    i integer;
  4  begin
  5   
  6    for x in (select 'hello' aaa from dual where 100 = nvl((select null from dual),100))
  7    loop
  8  
  9    Dbms_Output.put_line(x.aaa);
 10    end loop;
 11  end;
 12  /

declare
  i integer;
begin
  for x in (select 'hello' aaa from dual where 100 = nvl((select null from dual),100))
  loop

  Dbms_Output.put_line(x.aaa);
  end loop;
end;

ORA-06550: line 6, column 59:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

   ( - + mod not null others <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> avg
   count current exists max min prior sql stddev sum variance
   execute forall time timestamp interval date
   <a string literal with character set specification>
   <a number> <a single-quoted SQL string>
ORA-06550: line 6, column 81:
PLS-00103: Encountered the symbol "," when expecting one of the following:

   ; return returning and or

SQL> 
25 апр 07, 14:29    [4068761]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
ananax
Member

Откуда: MO
Сообщений: 424
вот так работает (((

declare 
  v varchar2(20) := 0;
begin

  execute immediate 'select ''hello'' aaa from dual where 100 = nvl((select null from dual),100)' into v;
    Dbms_Output.put_line(2||' '||v);
end;
но хочется то через for... in
25 апр 07, 14:34    [4068791]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Запихни запрос в представление и натравливай for на простой запрос из этого представления.
ИМХО, запрос можно переписать без подзапроса, если использовать внешнее объединение.
25 апр 07, 14:46    [4068869]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
Goldminer
Member

Откуда:
Сообщений: 553
ananax
вот так работает (((

declare 
  v varchar2(20) := 0;
begin

  execute immediate 'select ''hello'' aaa from dual where 100 = nvl((select null from dual),100)' into v;
    Dbms_Output.put_line(2||' '||v);
end;
но хочется то через for... in

Вот так можно (8.1.7):
DECLARE
  s VARCHAR2(100);
  TYPE SomeCursor IS REF CURSOR;
  c SomeCursor;
BEGIN
  OPEN c FOR 'select ''hello'' aaa from dual where 100 = nvl((select null from dual),100)';
  LOOP
    FETCH c INTO s;
    EXIT WHEN c%NOTFOUND;
    Dbms_Output.put_line(s);
  END LOOP;
END;
25 апр 07, 15:47    [4069380]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Goldminer
Вот так можно (8.1.7):
[src oracle]
OPEN c FOR 'select ''hello'' aaa from dual where 100 = nvl((select null from dual),100)';
[src]

да.. так и делаю ((((
Спасиб большое.
25 апр 07, 16:16    [4069592]     Ответить | Цитировать Сообщить модератору
 Re: NVL в цикле for ... in  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
Мда... Тут 9-ку к десаппорту готовят, а народ еще на 8-ке пашет.
Кстати, о том, что скалярные подзапросы внутри функций - это зло, следует помнить.
Тут это первый аргумент, так что, вроде, пофиг, а вот если речь о втором идет - то уже нехорошо.
Для подобных вещей следует использовать, как минимум, DECODE.
--
Offtop: я умудрился, работая на 8-ке, вообще полтора года не знать, что такое скалярный подзапрос, и ничего, ERP-система успешно без них жила
25 апр 07, 19:48    [4070839]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить