CftClub.ru
Клуб специалистов ЦФТ-Банк

Непонятное со ссылкой this
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
cymtu
Участник - экстремал


Вступление в Клуб: 26.03.2008
СообщениеПн Авг 09, 2010 05:12   Непонятное со ссылкой this Ответить с цитатой
Полезность: Нет оценки
Есть код на вкладке "Проверка"
Цитата:

if p_message = 'DEFAULT' then
-- 1
if [CASE_GRAM].[LIB].get_case(this.[CLIENT].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Заемщик ' || this.[CLIENT].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(this.[CLIENT].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Заемщик ' || this.[CLIENT].[NAME] || ' не имеет дательной формы наименования');
end if;
--2
for z in [ZALOG] where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
end if;
end loop;

excel.init_xls;
end if


пункт №1 отрабатывает нормально, а №2 программа даже не заходит в цикл.
Приходиться проверку осуществлять так
Цитата:

if p_message = 'DEFAULT' then

if [CASE_GRAM].[LIB].get_case(this.[CLIENT].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Заемщик ' || this.[CLIENT].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(this.[CLIENT].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Заемщик ' || this.[CLIENT].[NAME] || ' не имеет дательной формы наименования');
end if;

PR_ZALOGS(this);

excel.init_xls;
end if;

где PR_ZALOGS(this) это процедура в локальных описаниях
Цитата:

procedure PR_ZALOGS(cr ref [PR_CRED]) is

begin
for z in [ZALOG] where z.[PART_TO_LOAN].[PRODUCT]=cr loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
end if;
end loop;
end;

В таком виде проверка осуществляеться нормально.

Почему так?????????????????????????????????????????
Почему первый вариант не работает????????????
В обоих вариантах операция компилируется нормально, никаких ошибок не выдает.
ГлСП
Профи


Вступление в Клуб: 20.09.2007
СообщениеПн Авг 09, 2010 05:42    Ответить с цитатой
Полезность: Нет оценки
Посмотри, что приходит во втором варианте. И еще посмотри в какой запрос в pl/sql транслируется For .
cymtu
Участник - экстремал


Вступление в Клуб: 26.03.2008
СообщениеПн Авг 09, 2010 06:59    Ответить с цитатой
Полезность: Нет оценки
Цитата:

procedure PR_ZALOGS(CR IN number) is
begin
--# 744,6
declare
Z number;
cursor c_obj is
select a1.id
from Z#PART_TO_LOAN a2, Z#ZALOG a1
where a1.COLLECTION_ID is NULL and a1.C_PART_TO_LOAN=a2.collection_id
and (a2.C_PRODUCT = CR);
begin
for plp$c_obj in c_obj loop
Z := plp$c_obj.id;
--# 745,3
if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048150) is NULL then
--# 746,11
MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет родительной формы наименования');
end if;
--# 748,3
if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048151) is NULL then
--# 749,11
MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет дательной формы наименования');
end if;
end loop;
end;
return;
end;
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеПн Авг 09, 2010 07:07    Ответить с цитатой
Полезность: Нет оценки
По-моему, проблемную часть кода нужно поменять так:
Код:

--2
for z in [ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([ code ]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;

cymtu
Участник - экстремал


Вступление в Клуб: 26.03.2008
СообщениеПн Авг 09, 2010 07:13    Ответить с цитатой
Полезность: Нет оценки
prog пишет:
По-моему, проблемную часть кода нужно поменять так:
Код:

--2
for z in [ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([ code ]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;



не помогло
prog
Эксперт


Вступление в Клуб: 03.03.2008
СообщениеПн Авг 09, 2010 08:33    Ответить с цитатой
Полезность: Нет оценки
Отлаживайте...
1) что в this
2) выбирает ли что запрос
3) выполняется ли [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([ code ]='Р')) is null

и т. д.

Элементарный кусок кода. Проблемы как обычно в какой то мелочи Wink
cymtu
Участник - экстремал


Вступление в Клуб: 26.03.2008
СообщениеПн Авг 09, 2010 09:31    Ответить с цитатой
Полезность: Нет оценки
prog пишет:
Отлаживайте...
1) что в this
2) выбирает ли что запрос
3) выполняется ли [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([ code ]='Р')) is null

и т. д.

Элементарный кусок кода. Проблемы как обычно в какой то мелочи Wink


1) в this реальная сылка на кредит debug проверял
2) также debug -ом проверял, программа даже не заходить в цикл, хотя значение this не null.

Вылаживаю саму операцию можете сами проверить.
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПн Авг 09, 2010 16:30    Ответить с цитатой
Полезность: Нет оценки
а если for поменять на for ( select ?
markoff
Участник - экстремал


Вступление в Клуб: 09.06.2009
СообщениеПн Авг 09, 2010 17:21    Ответить с цитатой
Полезность: 1
Неоднократно попадал в примерную ситуацию, а именно проблема была с вот таким куском кода:
Код:
for x in ::tab loop
   ---
end loop


Лечилось при помощи добавления all.
Код:
for x in ::tab all loop
   ---
end loop


Из документации:
Цитата:
Если опции all или collections не указываются, то выборка осуществляется только по экземплярам, не входящим ни в какие коллекции.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеВт Авг 10, 2010 01:44   Re: Непонятное со сылкой this Ответить с цитатой
Полезность: Нет оценки
cymtu пишет:
prog пишет:

--2
for z in [ZALOG] where z.[PART_TO_LOAN].[PRODUCT]=this loop
null;
end loop;

не помогло


Посмотри какой селект получился в итоге на PL/SQL.
Скорей всего в него добавлена проверка collection_id is null.
В этом случае добавь all перед where

Код:

for z in [ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
    null;
end loop;
cymtu
Участник - экстремал


Вступление в Клуб: 26.03.2008
СообщениеВт Авг 10, 2010 02:21    Ответить с цитатой
Полезность: Нет оценки
markoff пишет:
Неоднократно попадал в примерную ситуацию, а именно проблема была с вот таким куском кода:
Код:
for x in ::tab loop
   ---
end loop


Лечилось при помощи добавления all.
Код:
for x in ::tab all loop
   ---
end loop


Из документации:
Цитата:
Если опции all или collections не указываются, то выборка осуществляется только по экземплярам, не входящим ни в какие коллекции.


Код:

        for z in ::[ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
        if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then   
         pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
        end if;
        if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then   
         pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
        end if;   
        end loop;   

заработало после добавление :: перед таблицей и all перед where.

Но всё равно мне не понятно, почему в локальных описаниях эта задача решаеться прекрасно без всяких :: и all.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеВт Авг 10, 2010 04:35    Ответить с цитатой
Полезность: Нет оценки
Я все таки советую посмотреть какой получается реальный код PL/SQL -е, после компиляции без ::

В каком классе операция? Есть ли в этом типе реквезит с именем ZALOG?

:: Указывают компилятору что выборка делается именно из класса.
cymtu
Участник - экстремал


Вступление в Клуб: 26.03.2008
СообщениеВт Авг 10, 2010 04:48    Ответить с цитатой
Полезность: Нет оценки
Код:

        for z in [ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
        if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then   
         pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
        end if;
        if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then   
         pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
        end if;   
        end loop;



Код:

         declare
            Z   number;
            plp$3$1   number;
            cursor c_obj is
               select  a1.id
               from Z#PART_TO_LOAN a2, Z#ZALOG a1
               where a1.COLLECTION_ID=plp$3$1 and a1.C_PART_TO_LOAN=a2.collection_id
                 and (a2.C_PRODUCT = THIS);
         begin
            plp$3$1 := plp$var$.A#ZALOG;
            for plp$c_obj in c_obj loop
               Z := plp$c_obj.id;
--# 12,5
               if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048150) is NULL then
--# 13,11
                  MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED_1','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет родительной формы наименования');
               end if;
--# 15,5
               if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048151) is NULL then
--# 16,11
                  MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED_1','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет дательной формы наименования');
               end if;
            end loop;
         end;
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеВт Авг 10, 2010 05:53    Ответить с цитатой
Полезность: 1
Интересно, что вот это за условие

a1.COLLECTION_ID=plp$3$1
где plp$3$1 := plp$var$.A#ZALOG;

Оно видать и портит тебе все

И есть ли оно если скомпилировать с :: перед [ZALOG]?
cymtu
Участник - экстремал


Вступление в Клуб: 26.03.2008
СообщениеВт Авг 10, 2010 05:57    Ответить с цитатой
Полезность: Нет оценки
Код:

        for z in ::[ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
        if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then   
         pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
        end if;
        if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then   
         pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
        end if;   
        end loop;   



Код:

         declare
            Z   number;
            cursor c_obj is
               select  a1.id
               from Z#PART_TO_LOAN a2, Z#ZALOG a1
               where a1.C_PART_TO_LOAN=a2.collection_id
                 and (a2.C_PRODUCT = THIS);
         begin
            for plp$c_obj in c_obj loop
               Z := plp$c_obj.id;
--# 12,5
               if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048150) is NULL then
--# 13,11
                  MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED_1','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет родительной формы наименования');
               end if;
--# 15,5
               if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048151) is NULL then
--# 16,11
                  MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED_1','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет дательной формы наименования');
               end if;
            end loop;
         end;


Да так и есть. Question
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru