Вызов удаленной процедуры через синоним
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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. |
из документации:
Цитата: | Допускается также задание выражений для фактических значений параметров с указанием имени формального параметра, которому должно быть присвоено заданное значение при входе в операцию. При этом указывается имя параметра, как оно определено в операции или процедуре, логическое присвоение == (два знака равенства), затем задается уже само выражение для фактического значения. В последнем случае фактические выражения для значений параметров могут следовать в произвольном порядке, однако если задано хоть одно значение таким образом, то все последующие значения параметров должны быть заданы также с указанием имен формальных параметров. |
в данном случае "не формальным" является предыдущий параметр _________________ всегда есть как минимум 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
) |
Если есть принципиальная возможность использовать синтаксис с разыменованием параметров, так зачем мучиться? Хотелось бы узнать как его заставить работать. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|