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

Вызов PLPCALL с параметрами

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


Вступление в Клуб: 10.12.2009
СообщениеСб Фев 20, 2010 18:08   Вызов PLPCALL с параметрами Ответить с цитатой
Полезность: Нет оценки
Товарисчи!...

Есть некое желание вызвать Экранную форму операции через PLPCALL с предустановленными параметрами.. Попросту говоря, что бы эта форма при вызове была не пуста....

Как не старался, при передаче параметров вызов просто проскакивает, и ничего не происходит.. примерно это выглядело вот так:

Код:
stdio.put_line_buf('<%PLPCALL %THIS%.[NEW#AUTO](%PARAM%.P_NAME=>'''||P_PRC_EXP.[NAME]||''',%PARAM%.P_COD=>'''||P_PRC_EXP.[COD]||''',%PARAM%.P_VALUTA=>'''||P_PRC_EXP.[VALUTA]||''',%PARAM%.P_LIST_SCH_PRC=>'''||P_PRC_EXP.[LIST_SCH_PRC]||''',%PARAM%.P_DATE_CREATE=>'''||P_PRC_EXP.[DATE_CREATE]||''',%PARAM%.P_DATE_USE_BEG=>'''||P_PRC_EXP.[DATE_CREATE]||''',%PARAM%.P_GROUP_CODE=>'''||P_PRC_EXP.[GROUP_CODE]||''')%>');


в случае же, если параметры опустить, все замечательно вызывается:

Код:

stdio.put_line_buf('<%PLPCALL %THIS%.[NEW#AUTO]('')%>');


... и экранная форма не заставляет себя долго ждать. но она - пустая. Sad
По сути проблему я обошел, попросту обошелся без PLPCALL'а... однако хотелось бы понять, почему тут не сработало, и что я делаю не так, если, конечно, делаю... В чем могут быть подводные камни?

Жду комментариев. Заранее благодарен.
_________________
Всего должно быть в меру.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеВс Фев 21, 2010 04:18    Ответить с цитатой
Полезность: Нет оценки
В вызываемой операции присвоение значений параметрам происходит в блоке
p_message = 'VALIDATE'
p_info = '%PLPCALL%'
zh
Участник со стажем


Вступление в Клуб: 10.12.2009
СообщениеВс Фев 21, 2010 18:22    Ответить с цитатой
Полезность: Нет оценки
kit83rd пишет:
В вызываемой операции присвоение значений параметрам происходит в блоке
p_message = 'VALIDATE'
p_info = '%PLPCALL%'


это понятно...
но при вызове с параметрами, которые безусловно присвоятся, экранная то форма так и не видна... мне не сложно передать параметры через PLPCALL, но мне необходимо их изменить в процессе передачи посредством вызванной экранной формы.
_________________
Всего должно быть в меру.
r00st
Эксперт


Вступление в Клуб: 14.09.2007
СообщениеВс Фев 21, 2010 18:51    Ответить с цитатой
Полезность: Нет оценки
Стоит попробовать для начала передать все параметры, как null, чтобы убедиться, что проблема не в синтаксисе. А далее по одному параметру заполнять нужными значениями и смотреть, где отвалится.
Смущает то, что даты передаются в ковычках без какого-либо преобразования.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеСр Фев 24, 2010 03:30    Ответить с цитатой
Полезность: Нет оценки
Формат для констант типа дата/время: YYYY/MM/DD HH24:MI:SS.

т.е.
%PARAM%.P_DATE_CREATE=>'''||to_char(P_PRC_EXP.[DATE_CREATE],'YYYY/MM/DD')||'''
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеСр Фев 24, 2010 12:50    Ответить с цитатой
Полезность: Нет оценки
kit83rd пишет:
Формат для констант типа дата/время: YYYY/MM/DD HH24:MI:SS.

т.е.
%PARAM%.P_DATE_CREATE=>'''||to_char(P_PRC_EXP.[DATE_CREATE],'YYYY/MM/DD')||'''


Приведу кусок успешно работающего дистрибутивного кода:
Код:
stdio.put_line_buf('<% PLPCALL %THIS%.[CANC_TERM](P_DATE => '''||P_DATE_CLOSE||''')%>');

Передача даты происходит без всяких проблем.
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеСр Фев 24, 2010 12:54   Re: Вызов PLPCALL с параметрами. Ответить с цитатой
Полезность: Нет оценки
zh пишет:
Как не старался, при передаче параметров вызов просто проскакивает, и ничего не происходит.. примерно это выглядело вот так:

Код:
stdio.put_line_buf('<%PLPCALL %THIS%.[NEW#AUTO](%PARAM%.P_NAME=>'''||P_PRC_EXP.[NAME]||''',%PARAM%.P_COD=>'''||P_PRC_EXP.[COD]||''',%PARAM%.P_VALUTA=>'''||P_PRC_EXP.[VALUTA]||''',%PARAM%.P_LIST_SCH_PRC=>'''||P_PRC_EXP.[LIST_SCH_PRC]||''',%PARAM%.P_DATE_CREATE=>'''||P_PRC_EXP.[DATE_CREATE]||''',%PARAM%.P_DATE_USE_BEG=>'''||P_PRC_EXP.[DATE_CREATE]||''',%PARAM%.P_GROUP_CODE=>'''||P_PRC_EXP.[GROUP_CODE]||''')%>');


А наименование тоже не передается? Ошибка разбора команды не выскакивает? Попробуйте оставить передачу только одного параметра. Что получается?
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеЧт Фев 25, 2010 02:53    Ответить с цитатой
Полезность: Нет оценки
timochev пишет:


Приведу кусок успешно работающего дистрибутивного кода:
Код:
stdio.put_line_buf('<% PLPCALL %THIS%.[CANC_TERM](P_DATE => '''||P_DATE_CLOSE||''')%>');

Передача даты происходит без всяких проблем.



Этот кусок кода может сработать, а может и нет. Срабатывает неявное преобразование типа date -> char. Все зависит от оракловой настройки в каком виде представлять дату по умолчанию. Поэтому уж лучше самому написать to_char.
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеЧт Фев 25, 2010 09:11    Ответить с цитатой
Полезность: Нет оценки
kit83rd пишет:
timochev пишет:


Приведу кусок успешно работающего дистрибутивного кода:
Код:
stdio.put_line_buf('<% PLPCALL %THIS%.[CANC_TERM](P_DATE => '''||P_DATE_CLOSE||''')%>');

Передача даты происходит без всяких проблем.



Этот кусок кода может сработать, а может и нет. Срабатывает неявное преобразование типа date -> char. Все зависит от оракловой настройки в каком виде представлять дату по умолчанию. Поэтому уж лучше самому написать to_char.

Отчасти соглашусь с Вами.

Поставил несколько опытов:
1. Посмотрел, что передается в PLPCALL в вышеописанной реализации
Код:
<% PLPCALL %THIS%.[CANC_TERM](P_DATE => '2010-02-22 08:41:53')%>

2. Модифицировал код по Вашему варианту. Получилось:
Код:
<% PLPCALL %THIS%.[CANC_TERM](P_DATE => '2010/02/22')%>

Параметр передался в обоих случаях.

ИМХО, лучше не переопределять формат преобразования. Ведь последовательно происходит 2 преобразования: DATE -> CHAR, CHAR -> DATE. Если указывать формат в первом преобразовании, то правильнее указывать и во втором. А где это можно сделать? А вот при отсутствии формата и там, и там будет использоваться неявное преобразование, но оно зависит от одной оракловой настройки, что дает право надеяться на успех прямого и обратного преобразований. Сразу скажу, что не понимаю, почему отработали оба варианта.

Цитата из документации к PLPCALL:
Цитата:
Для представления значений типа "Число", "Дата" – применяются заранее определенные фиксированные форматы представления значений.
Формат для констант типа число: разделитель десятичной части ".", не допускается использование разделители тысяч.
Формат для констант типа дата/время: YYYY/MM/DD HH24:MI:SS.
Для логических констант, значения ‘TRUE’/’FALSE’/’NULL’
Получается, что умолчательноу меня подставляется формат не соответствующий документации.

По дистрибутивному коду не нашел ни одного случая передачи даты с явным преобразованием.
kit83rd
Участник со стажем


Вступление в Клуб: 05.02.2010
СообщениеПт Фев 26, 2010 02:44    Ответить с цитатой
Полезность: Нет оценки
timochev пишет:

1.
Код:
<% PLPCALL %THIS%.[CANC_TERM](P_DATE => '2010-02-22 08:41:53')%>

2.
Код:
<% PLPCALL %THIS%.[CANC_TERM](P_DATE => '2010/02/22')%>

Параметр передался в обоих случаях.


Параметр передался в обоих случаях потому что формат YYYY/MM/DD не нарушен. Разделитель не очень важен.
А вот если поменять порядок, то Навигатор не разберет команду.

ИМХО. Второе преобразование char->date происходит именно по формату YYYY/MM/DD. Поэтому он так важен.
timochev
Эксперт


Вступление в Клуб: 02.07.2007
СообщениеПт Фев 26, 2010 09:45    Ответить с цитатой
Полезность: Нет оценки
kit83rd пишет:
Параметр передался в обоих случаях потому что формат YYYY/MM/DD не нарушен. Разделитель не очень важен.
Да, действительно. Shocked Поигрался с to_date и убедился в этом.
И все-таки каково Ваше мнение насчет необходимости преобразования по формату? Вы придерживаетесь необходимости преобразования to_char с явно указанным форматом?
Мое мнение - 50/50. И там, и там свои плюсы и минусы. Это скорее ядерщики из ЦФТ должны установить стандарт (которого сейчас нету Crying or Very sad ).

СЗОТ А куда собственно автор темы исчез? Very Happy
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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