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

Откуда: Нижний Новгород
Сообщений: 1639
Добрый день.
Первый раз встречаю такое за 9 лет практики, затрудняюсь понять причину, вроде вещь такая, базовая, а причины не понимаю, и что читать в документации - тоже.

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

Связываю две таблицы по текстовому полю. Описание таблиц, тест в SQL-сессии и тестовый пакадж во вложении.

В SQL-окне все работает, как ожидается.

select count(1) from ... дает некое число записей.
for c in cursor loop (по тому же запросу, тем же таблицам, с теми же условиями) дает то же число записей.

В пакадже:
select count(1) from ... дает некое число записей.
for c in cursor loop (по тому же запросу, тем же таблицам, с теми же условиями) дает 0 проходов курсора.

Может, есть какая-то особенность передачи параметра в процедуру? Т.е. утверждение "(по тому же запросу, тем же таблицам, с теми же условиями)" для пакаджа ложно?

Если пример сложен для понимания без доступа к БД, могу написать какой-нить скрипт, генерирующий тестовые таблицы. Или, если есть желание помочь, обращайтесь в почту maslov.d@sandy.ru, подскажу параметры соединения с БД.

К сообщению приложен файл (1.zip - 1Kb) cкачать
7 апр 10, 11:30    [8590763]     Ответить | Цитировать Сообщить модератору
 Re: разное поведение кода в курсоре и в запросе, в SQL и в пакадже  [new]
juras
Member

Откуда: Прага
Сообщений: 257
dmdmdm,

Неявное преобразование даты в вархар зависит от НЛС настроек.
Обявляете в процедуре датовый тип, а посылаете вархар .

П.С. как то не вяжется утверждение "9 лет практики" с непониманием основ Оракла.
7 апр 10, 11:47    [8590960]     Ответить | Цитировать Сообщить модератору
 Re: разное поведение кода в курсоре и в запросе, в SQL и в пакадже  [new]
juras
Member

Откуда: Прага
Сообщений: 257
dmdmdm,

Много раз обсуждалось:
procedure analyze(dat1 date, dat2 date) is
  
cnt1 number := 0;
cnt2 number := 0;
 
cursor test is
select h2.ab_ust
  from h_bill_ats h2, pers_bill p
 where h2.data between dat1 and dat2 
   and h2.ab_ust = 2104
   and trim(p.tel1) = trim(h2.ab_ust);

  
begin
  select count(1) into cnt1
    from h_bill_ats h2
   where h2.data between dat1 and dat2 
     and h2.ab_ust = 2104;
   
  select count(1) into cnt2
    from h_bill_ats h2, pers_bill p
   where h2.data between dat1 and dat2 
     and h2.ab_ust = 2104
     and p.tel1 = h2.ab_ust;

  dbms_output.put_line('cnt1 = '||cnt1||', cnt2 = '||cnt2);   

  cnt1 := 0;
  for t in test loop
    cnt1 := cnt1 + 1;
  end loop;
  dbms_output.put_line('cnt1 = '||cnt1);   
  return;
end;

desc pers_bill;
Name              Type          Nullable Default Comments                              
----------------- ------------- -------- ------- ------------------------------------- 
ID_PERS_BILL      NUMBER                                                               
FIO_PERS_BILL     VARCHAR2(400) Y                ÔČÎ ńîňđóäíčęŕ                        
PRIM              VARCHAR2(100) Y                                                      
ID_DEP            NUMBER        Y                ęîä ďîäđŕçäĺëĺíč˙                     
SUM_LIMIT         NUMBER        Y                ńóěěŕ ëčěčňŕ đŕçăîâîđŕ                
PERS_ID_PERS_BILL NUMBER        Y                ńńűëęŕ íŕ đîäčň. ăđóďďó               
FLAG              NUMBER        Y        0       ďđčçíŕę (ŕáîíĺíň - 0  čëč ăđóďďŕ - 1) 
TEL1              VARCHAR2(20)  Y                đŕáî÷čé ňĺëĺôîí                       
CODE              VARCHAR2(100) Y                                                      
DAT1              DATE          Y                                                      
DAT2              DATE          Y         
7 апр 10, 12:06    [8591169]     Ответить | Цитировать Сообщить модератору
 Re: разное поведение кода в курсоре и в запросе, в SQL и в пакадже  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
desc pers_bill;
Name              Type          Nullable Default Comments                              
----------------- ------------- -------- ------- ------------------------------------- 
ID_PERS_BILL      NUMBER                                                               
...
DAT1              DATE          Y                                                      
DAT2              DATE          Y                                                      

create or replace package body test is

procedure analyze(dat1 date, dat2 date) is
...
cursor test is
select h2.ab_ust
  from h_bill_ats h2, pers_bill p
 where h2.data between dat1 and dat2 
   and h2.ab_ust = 2104
   and trim(p.tel1) = trim(h2.ab_ust);

  
begin
...
  select count(1) into cnt2
    from h_bill_ats h2, pers_bill p
   where h2.data between dat1 and dat2 
     and h2.ab_ust = 2104
     and p.tel1 = h2.ab_ust;
...
end test;
/
То есть в вашем пакете
  select count(1) into cnt2
    from h_bill_ats h2, pers_bill p
   where h2.data between dat1 and dat2 
эквивалентно
  select count(1) into cnt2
    from h_bill_ats h2, pers_bill p
   where h2.data between P.dat1 and P.dat2 
Типичная ошибка.

Почитайте тему "Чего следует избегать при использовании Oracle SQL и PL/SQL"
Может быть это поможет вам найти еще какие-то ошибки у себя и коллег,
а главное - избежать их повторения в будущем! :-)
7 апр 10, 12:07    [8591182]     Ответить | Цитировать Сообщить модератору
 Re: разное поведение кода в курсоре и в запросе, в SQL и в пакадже  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
Спасибо
7 апр 10, 12:24    [8591359]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить