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

Откуда: MO
Сообщений: 424
День добрый!
Вот возникла такая ситуация....
Есть запрос - нормально отрабатывает, возвращает нужные данные.
select * from eee where eee.id = 60
делаю
declare
x number := 0;
begin
x := 60;
for t in (select id from eee where eee.id = x)
loop
распечатываю t.id
end loop;
совсем не те данные (((
делаю
declare
x number := 0;
begin
x := 60;
for t in (select id from eee where eee.id = 60)
loop
распечатываю t.id
end loop;
опять все работает (((
Селект сам сложнее, именно приведенный вариант та работает... но может есть подводные камни?
В чем дело?
Oracle 8.1.7
11 апр 07, 15:12    [4007054]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
посмотрите, нет ли у Вас в таблице eee поля с именем x
11 апр 07, 15:15    [4007073]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116174
for t in (select id from eee where eee.id = x)

Нет ли у Вас в таблице eee колонки с именем х ?
11 апр 07, 15:16    [4007077]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116174
2Jannny
Кнопка !
11 апр 07, 15:16    [4007079]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Jannny
посмотрите, нет ли у Вас в таблице eee поля с именем x

да.. тоже сначала на это подумал.. ((( переименовал переменную назвал уникально.. не помогло.
В этом же модуле с другими запросами все прокатывает и с этой же переменной (((
вот тело самого запроса
select e.emp_id from t_empe, t_ss ss, t_pos p
                 where e.ss_id = ss.ss_id
                   and ss.pos_id = p.pos_id
                   and p.pos_id in (
                                         select p.pos_id from t_pos p
                                         start with p.parent_id = (select p.pos_id from t_ss s,t_emp emp,t_pos p
                                                                    where s.ss_id = emp.ss_id
                                                                      and s.pos_id = p.pos_id
                                                                      and emp.emp_id = X
                                                                  )
                                         connect by prior p.position_id = p.parent_id
                                        )
                   or ss.dep_id in (
                                      select d.dep_id from t_dep d
                                      start with d.dep_id = (select s.dep_id from t_ss s,t_emp emp
                                                             where s.ss_id = emp.ss_id
                                                              and emp.emp_id = X
                                                            )
                                      connect by prior d.dep_id = d.parent_id
                                      ) 
Вот какраз X я и подставляю...
Его или другую любую переменную...
Не получается чет найти глюк (((
11 апр 07, 15:26    [4007140]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
это опять фрагмент запроса или он таки картезианский?
from [color=red]t_empe[/color], t_ss ss, t_pos p
11 апр 07, 15:38    [4007220]     Ответить | Цитировать Сообщить модератору
 запрос возвращает одно, а тот же запрос из for..in другое  [new]
ananax
Member

Откуда: MO
Сообщений: 424
)))
orawish
это опять фрагмент запроса или он таки картезианский?
from t_empe, t_ss ss, t_pos p

Это полностью запрос.. просто имена почикал.. ((( ну и вкралась описка (((
11 апр 07, 15:43    [4007253]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
?
                 where ..
                   and  ..
                   and (p.pos_id in ( )
                   or ss.dep_id in (  ) 
                   )
11 апр 07, 15:54    [4007318]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
ananax
Member

Откуда: MO
Сообщений: 424
orawish
?
                 where ..
                   and  ..
                   and (p.pos_id in ( )
                   or ss.dep_id in (  ) 
                   )

ух.. не догнал где у меня тут проблема... сам запрос отрабатывает правильно.. если я ручками ставлю Х.
а если через переменную, какой - то глюк.. пробую, через
execute immediate
11 апр 07, 16:02    [4007365]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
skropotov
Member

Откуда:
Сообщений: 186
а в трейсе посмотреть какие параметры действительно подставляются?
11 апр 07, 16:03    [4007367]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
ananax
Member

Откуда: MO
Сообщений: 424
skropotov
а в трейсе посмотреть какие параметры действительно подставляются?

ты прав, можно (( но, честно говоря, еще ниразу не юзал трассировку...
думаешь самое время начать?
11 апр 07, 16:19    [4007502]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ananax
orawish
?
                 where ..
                   and  ..
                   and (p.pos_id in ( )
                   or ss.dep_id in (  ) 
                   )

ух.. не догнал где у меня тут проблема... сам запрос отрабатывает правильно.. если я ручками ставлю Х.
а если через переменную, какой - то глюк.. пробую, через
execute immediate

Я просто спросил - нет ли тут ошибки..
SQL>  select deptno,ename from emp
  2  where deptno=10
  3    and job='CLERK'
  4     or job='MANAGER';

    DEPTNO ENAME
---------- ----------
        20 JONES
        30 BLAKE
        10 CLARK
        10 MILLER

SQL> 
SQL> select deptno,ename from emp
  2  where deptno=10
  3    and (job='CLERK'
  4     or  job='MANAGER');

    DEPTNO ENAME
---------- ----------
        10 CLARK
        10 MILLER

PS За каждый OR без явных скобок карал бы..
11 апр 07, 16:32    [4007604]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
skropotov
Member

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

ты прав, можно (( но, честно говоря, еще ниразу не юзал трассировку...
думаешь самое время начать?

ну а как еще узнать что действительно выполняет сервер?
тынц
в книге Миллсап К., Хольт Д. Oracle. Оптимизация производительности. хорошо описана структура трейса
11 апр 07, 17:46    [4008191]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
ananax
Jannny
посмотрите, нет ли у Вас в таблице eee поля с именем x
да.. тоже сначала на это подумал.. ((( переименовал переменную назвал уникально.. не помогло.
И все же я думаю, что Вы просто недостаточно уникально переименовали...
11 апр 07, 17:48    [4008207]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
Jannny
ananax
Jannny
посмотрите, нет ли у Вас в таблице eee поля с именем x
да.. тоже сначала на это подумал.. ((( переименовал переменную назвал уникально.. не помогло.
И все же я думаю, что Вы просто недостаточно уникально переименовали...


To test if достаточно уникально переименовали. In SQL*Plus:

variable X number
begin
for v_rec in (select e.emp_id from t_emp e, t_ss ss, t_pos p
                 where e.ss_id = ss.ss_id
                   and ss.pos_id = p.pos_id
                   and p.pos_id in (
                                         select p.pos_id from t_pos p
                                         start with p.parent_id = (select p.pos_id from t_ss s,t_emp emp,t_pos p
                                                                    where s.ss_id = emp.ss_id
                                                                      and s.pos_id = p.pos_id
                                                                      and emp.emp_id = 60
                                                                  )
                                         connect by prior p.position_id = p.parent_id
                                        )
                   or ss.dep_id in (
                                      select d.dep_id from t_dep d
                                      start with d.dep_id = (select s.dep_id from t_ss s,t_emp emp
                                                             where s.ss_id = emp.ss_id
                                                              and emp.emp_id = 60
                                                            )
                                      connect by prior d.dep_id = d.parent_id
                                      )
) loop
dbms_output.put_line(v_rec.emp_id);
end loop;
:X := 60;
for v_rec in (select e.emp_id from t_emp e, t_ss ss, t_pos p
                 where e.ss_id = ss.ss_id
                   and ss.pos_id = p.pos_id
                   and p.pos_id in (
                                         select p.pos_id from t_pos p
                                         start with p.parent_id = (select p.pos_id from t_ss s,t_emp emp,t_pos p
                                                                    where s.ss_id = emp.ss_id
                                                                      and s.pos_id = p.pos_id
                                                                      and emp.emp_id = :X
                                                                  )
                                         connect by prior p.position_id = p.parent_id
                                        )
                   or ss.dep_id in (
                                      select d.dep_id from t_dep d
                                      start with d.dep_id = (select s.dep_id from t_ss s,t_emp emp
                                                             where s.ss_id = emp.ss_id
                                                              and emp.emp_id = :X
                                                            )
                                      connect by prior d.dep_id = d.parent_id
                                      )
) loop
dbms_output.put_line(v_rec.emp_id);
end loop;
end;
/

SY.
P.S. Things like ananax is describing are possible with char column and varchar2 bind variable:

SQL> create table ananax(emp_id char(10));

Table created.

SQL> insert into ananax values('60');

1 row created.

SQL> declare
  2      x varchar2(10) := '60';
  3  begin
  4      for v_rec in (select * from ananax where emp_id = '60') loop
  5        dbms_output.put_line(v_rec.emp_id);
  6      end loop;
  7      dbms_output.put_line(lpad('-',10,'-'));
  8      for v_rec in (select * from ananax where emp_id = x) loop
  9        dbms_output.put_line(v_rec.emp_id);
 10      end loop;
 11  end;
 12  /
60
----------

PL/SQL procedure successfully completed.

but not with numbers.

Сообщение было отредактировано: 11 апр 07, 18:21
11 апр 07, 18:19    [4008488]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
ananax
Member

Откуда: MO
Сообщений: 424
ВСЕ еще хуже!!!
дописал в начало скрипта
execute immediate 'alter session set sql_trace=true';
ну и в конец
execute immediate 'alter session set sql_trace=false';
получил файл трассировки, пропарсил его.. там где надо стоит :d1
вот.. но скрпт вернул нужные данные (((( те 91 строку! так, как если писать вместо Х сразу 60
(((
11 апр 07, 19:59    [4009021]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Кометирую эти строки все так же фигово работает.
Как я понял SY у меня переменные разного типа...
попробую исправиться
11 апр 07, 20:07    [4009036]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
ananax
Member

Откуда: MO
Сообщений: 424
сделал
declare
x t_emp.emp_id%type;
begin
...
не помогло....
Может я не правильно понял SY?
11 апр 07, 20:30    [4009071]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
ananax
сделал
declare
x t_emp.emp_id%type;
begin
...
не помогло....
Может я не правильно понял SY?


Да, неправильно (пишится слитно). Я сказал что такое возможно в случае колонки char и связаной переменной varchar2.

SY.
11 апр 07, 20:54    [4009113]     Ответить | Цитировать Сообщить модератору
 Re: запрос возвращает одно, а тот же запрос из for..in другое  [new]
ananax
Member

Откуда: MO
Сообщений: 424
SY
вроде твой совет сработал )))
были разного типа - это точно
12 апр 07, 10:51    [4010607]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить