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

Вызов удаленной процедуры через синоним

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


Вступление в Клуб: 09.08.2012
СообщениеПт Авг 10, 2012 05:24   Вызов удаленной процедуры через синоним Ответить с цитатой
Полезность: Нет оценки
Необходимо позвать процедуру из пакета на удаленной схеме (РБС). Чтобы не пользоваться всякой ересью типа --begin pl/sql, а писать на pl/plus, создал синоним к этому пакету (кстати так же можно делать для таблиц)

CREATE OR REPLACE SYNONYM IBS.IMPORT_DOC_GC_P_OUTDOC FOR GC.P_OUTDOC@RBS_LINK

Теперь в операции зову необходимую процедуру из этого пакета напрямую (в Свойства -> Компиляция включен расширенный синтаксис). Поскольку в процедуре больше 20 параметров и большая часть не обязательная, а мне нужно заполнять всего 7, включая последние 2 - использую синтаксис с указанием имен параметров:
Код:

IMPORT_DOC_GC_P_OUTDOC.INIT(
       2
       ,AUNO == null
       ,AFILIAL == P_FILIAL
       ,ADT_BEG == P_DATE_BEGIN
       ,ADT_END == P_DATE_END
       ,ACHECKCODE == ACHECKCODE
       ,ACHECKVALUE == ACHECKVALUE);

PL/Plus-овая часть компилируется нормально, но парсер почему-то удаляет перечисленные параметры и в результирующем пакете просто перечисляет значения через запятую
Код:
--# 138,-19
   IMPORT_DOC_GC_P_OUTDOC.INIT(2,null,P_FILIAL,P_DATE_BEGIN,P_DATE_END,ACHECKCODE,ACHECKVALUE);

Естественно такой вызов ведет к ошибке компиляции пакета, так как типы параметров не соответствуют нужным.

Внимание вопрос: есть ли какой то способ заставить парсер нормально обрабатывать такой вызов? Может какая-нибудь прагма есть?

Решением в лоб в данном случае является передача всех параметров процедуры (которые не нужны - передавать null), но хочется понять принципиальную возможность нормального вызова с указанием имен формальных параметров.

P.S. Самое интересное, что вызов функции из пакета на схеме IBS, но отсутствующего в структуре ТБП, например method_mgr с перечислением параметров и пропуском некоторых - обрабатывается нормально
Код:
   method_mgr.copy_method(null,null,null,null,null
                    ,p_copy_bindings == '0'
                  );

Преобразуется в
Код:
--# 142,2
      plp$RESULT_2 := METHOD_MGR.COPY_METHOD(null,null,null,null,null,P_COPY_BINDINGS => '0');
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПт Авг 10, 2012 06:31   Re: Вызов удаленной процедуры через синоним Ответить с цитатой
Полезность: Нет оценки
Dobrojelatel пишет:

Поскольку в процедуре больше 20 параметров и большая часть не обязательная, а мне нужно заполнять всего 7, включая последние 2 - использую синтаксис с указанием имен параметров:
Код:

IMPORT_DOC_GC_P_OUTDOC.INIT(
       2
       ,AUNO == null
       ,AFILIAL == P_FILIAL
       ,ADT_BEG == P_DATE_BEGIN
       ,ADT_END == P_DATE_END
       ,ACHECKCODE == ACHECKCODE
       ,ACHECKVALUE == ACHECKVALUE);

Или глаза меня обманывают, или цифра 2 без указания имени параметра
Dobrojelatel
Участник


Вступление в Клуб: 09.08.2012
СообщениеПт Авг 10, 2012 07:05    Ответить с цитатой
Полезность: Нет оценки
да, без имени... это допускается
Посмотрите мой постскриптум, там аналогичный пример, который компилируется нормально, только там не синоним а пакет в схеме ibs.
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеПт Авг 10, 2012 09:03    Ответить с цитатой
Полезность: Нет оценки
Dobrojelatel пишет:
да, без имени... это допускается
Посмотрите мой постскриптум, там аналогичный пример, который компилируется нормально, только там не синоним а пакет в схеме ibs.


из документации:
Цитата:
Допускается также задание выражений для фактических значений параметров с указанием имени формального параметра, которому должно быть присвоено заданное значение при входе в операцию. При этом указывается имя параметра, как оно определено в операции или процедуре, логическое присвоение == (два знака равенства), затем задается уже само выражение для фактического значения. В последнем случае фактические выражения для значений параметров могут следовать в произвольном порядке, однако если задано хоть одно значение таким образом, то все последующие значения параметров должны быть заданы также с указанием имен формальных параметров.


в данном случае "не формальным" является предыдущий параметрSmile
_________________
всегда есть как минимум 2 выхода
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПт Авг 10, 2012 09:15    Ответить с цитатой
Полезность: Нет оценки
Dobrojelatel пишет:
да, без имени... это допускается
Посмотрите мой постскриптум, там аналогичный пример, который компилируется нормально, только там не синоним а пакет в схеме ibs.

Это не аналогичные примеры.
Просто попробуйте задать имя параметра и будет нужный результат.
Dobrojelatel
Участник


Вступление в Клуб: 09.08.2012
СообщениеПт Авг 10, 2012 09:30    Ответить с цитатой
Полезность: Нет оценки
Точно, все по документации
Цитата:
В последнем случае фактические выражения для значений параметров могут следовать в произвольном порядке, однако если задано хоть одно значение таким образом, то все последующие значения параметров должны быть заданы также с указанием имен формальных параметров.

Как только я указал название одного из параметров, так все последующие тоже написал с названиями!!

Примеры аналогичные, ну ради спокойствия указал название и первого параметра
Код:
IMPORT_DOC_GC_P_OUTDOC.init(
              AHANDLE   == 2
            , auno        == null
            , afilial   == p_filial
            , adt_beg   == p_date_begin
            , adt_end   == p_date_end
            , aCheckCode   == aCheckCode
            , aCheckValue== aCheckValue
             )

Результат тот же - pl/plus скопилировался, в пакете имен параметров нет, пакет oracle не компилируется. Чего и следовало ожидать.
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеПт Авг 10, 2012 10:02    Ответить с цитатой
Полезность: Нет оценки
Признак расширенного синтаксиса стоит?
_________________
всегда есть как минимум 2 выхода
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПт Авг 10, 2012 10:42    Ответить с цитатой
Полезность: Нет оценки
Dobrojelatel пишет:

Примеры аналогичные, ну ради спокойствия указал название и первого параметра
Код:
IMPORT_DOC_GC_P_OUTDOC.init(
              AHANDLE   == 2
            , auno        == null
            , afilial   == p_filial
            , adt_beg   == p_date_begin
            , adt_end   == p_date_end
            , aCheckCode   == aCheckCode
            , aCheckValue== aCheckValue
             )

Результат тот же - pl/plus скопилировался, в пакете имен параметров нет, пакет oracle не компилируется. Чего и следовало ожидать.

Все же примеры не аналогичные. В первом случае синоним пакета на другой БД по линку, а во втором - функция в пределах модели данных.
Видимо, компилятор не может сделать такой фокус с процедурами вне модели.
Dobrojelatel
Участник


Вступление в Клуб: 09.08.2012
СообщениеПт Авг 10, 2012 12:14    Ответить с цитатой
Полезность: Нет оценки
Кэп, это ты?
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеПт Авг 10, 2012 12:20    Ответить с цитатой
Полезность: Нет оценки
Dobrojelatel пишет:
Кэп, это ты?

Ага, я.
Сообщаю, утверждение
Цитата:
Примеры аналогичные

неверно.

, ваш Кэп.
Dobrojelatel
Участник


Вступление в Клуб: 09.08.2012
СообщениеПт Авг 10, 2012 16:12    Ответить с цитатой
Полезность: Нет оценки
devor пишет:
Или глаза меня обманывают, или цифра 2 без указания имени параметра

Dobrojelatel пишет:
да, без имени... это допускается
Посмотрите мой постскриптум, там аналогичный пример, который компилируется нормально, только там не синоним а пакет в схеме ibs.


Dobrojelatel пишет:
Самое интересное, что вызов функции из пакета на схеме IBS, но отсутствующего в структуре ТБП, например method_mgr с перечислением параметров и пропуском некоторых - обрабатывается нормально


devor пишет:
Все же примеры не аналогичные. В первом случае синоним пакета на другой БД по линку, а во втором - функция в пределах модели данных.


Кэп, вас пора до майора повышать! Функция то не в пределах модели данных, она в каком-то роде тоже внешняя, это не операция и не библиотека.
А по сути: у вас есть ответ на мой первоначальный вопрос?
Dobrojelatel пишет:
Внимание вопрос: есть ли какой то способ заставить парсер нормально обрабатывать такой вызов? Может какая-нибудь прагма есть?


Последний раз редактировалось: Dobrojelatel (Пт Авг 10, 2012 16:17), всего редактировалось 1 раз
Dobrojelatel
Участник


Вступление в Клуб: 09.08.2012
СообщениеПт Авг 10, 2012 16:15    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:
Признак расширенного синтаксиса стоит?


Цитата:
Теперь в операции зову необходимую процедуру из этого пакета напрямую (в Свойства -> Компиляция включен расширенный синтаксис).
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеПн Авг 13, 2012 03:20    Ответить с цитатой
Полезность: Нет оценки
Да перечисли все параметры, заработает ?
Dobrojelatel
Участник


Вступление в Клуб: 09.08.2012
СообщениеПн Авг 13, 2012 04:54    Ответить с цитатой
Полезность: Нет оценки
Да заработает конечно, но это же капец...
Код:
IMPORT_DOC_GC_P_OUTDOC.init(
             2
            , null
            , p_filial
            , p_date_begin
            , p_date_end
            , null,null,null
            , null,null,null,null,null,null
            , null,null,null,null,null,null
            , null,null,null
            , null,null,null,null,null,null
            , aCheckCode
            , aCheckValue
            
             )

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

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