Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Добрый день!
В недобрый час для одного проекта у нас выбрали Postgres. Если на SQL Server я создавал процедуры с OUT-параметрами и вызывал их из программы таким образом
то Postgres, по моим наблюдениям, вообще не требует передачи переменных, которые надо изменить в процедуре. То есть, в моём случае в процедуру, вроде, надо передавать два параметра. Подскажите, пожалуйста, если кто-нибудь работает в Postgres, как, для примера, создать и вызвать из фокса простейшую процедуру получения нового уникального кода с использованием OUT-параметра типа SQL SERVERовской
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
А занадлячего нужна такая функция на постгресе? Обычного Sequence не хватает? Там есть NextVal и CurrVal для работы с Sequence.
Вызов какой-нибудь такой возможен:
Исправлено 1 раз(а). Последнее : pasha_usue, 31.10.18 16:16 |
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Для общего развития - так:
Вызвать так:
Исправлено 1 раз(а). Последнее : pasha_usue, 31.10.18 16:28 |
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Я плохо понимаю суть написанного, т. к. впервые столкнулся с Postgres.
К тому же у меня к Postgres есть только жалкая оболочка DBeaver, в которой я не могу по-человечески даже запустить набор команд. Например, есть несколько различных типов объектов/субъектов, имеющих адреса, телефоны, паспорта, электропочту и прочую одинаковую ерунду, которую я храню в единых для всех таблицах. Поэтому хочется вести у них (в таблицах с этими объектами/субъектами) общую уникальную кодировку. Для этого я завёл свой счётчик. Конечно, я могу из фокса писать явный UPDATE и SELECT, брать значение из полученного курсора, но уже привык получать значение кода из процедуры сразу в переменную и использовать её. Я рассчитывал, что такие свойства процедур едины и присущи всем СУБД, и я смогу всюду использовать свои базовые классы с подобными процедуринами. |
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Попробую вторую конструкцию
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Просто ваша процедура работает неправильно в любом версионнике. Даже в MsSQL, когда он в режиме версионника. PgAdmin3 и не жужжу. Тупо потому что он цепляется через родную либу, и при этом OpenSource. Для этого заводится один Sequence и явно прописывается всем таблицам, подходящим под описание. А если таблицы к тому же ещё и одинаковые в части полей, то я бы ещё и унаследовал таблицы от общего предка. Везде свои нюансы: и в Oracle, и в FireBird, и в MySQL. Это ж не голый стандарт ANSI SQL. Тем более, что MsSQL от стандарта ушёл несколько дальше других СУБД. Исправлено 1 раз(а). Последнее : pasha_usue, 31.10.18 16:55 |
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Вообще-то я хотел в фоксе объявить переменную, например, pp, в процедурине иметь out-параметр, запускать процедуру типа EXEC ?@pp и получить в pp значение.
Таким образом
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Так попробуйте. Вернулся INOUT параметр вместе с рекордсетом в примере с tstfunc? Исправлено 1 раз(а). Последнее : pasha_usue, 31.10.18 17:05 |
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Таблицы не одинаковые в части полей, это всё дочерние таблицы, т. к. адресов, телефонов и пр. у каждой записи может же быть произвольное количество, а все прочие реквизиты совершенно разные.
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Спасибо, попробую. Надо ещё переделать свою, как казалось, универсальную процедурину для этого случая.
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Ну, значит, не наследуйте. Просто используйте общую последовательность.
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
Честно говоря "напрягла" эта конструкция, в табличке id_counter ВСЕГДА ОДНА запись? ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Меня не это напрягает. Меня напрягает, что функция может выдать два одинаковых значения в конкурирующие транзакции. Блокировок-то не ставится. |
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Разумеется, запись одна, а счётчиков (полей) может быть несколько. И всё это в транзакции, только я не привёл её для краткости. Мне бы код возвратить сначала.
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Я так понимаю, что общую последовательность надо сделать у основных таблиц. Это у людей и организаций разного рода коды не должны пересекаться. А в списках адресов и телефонов - безразлично.
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Уникальную последовательность для таблицы можно задать так:
Кстати, если запрос на INSERT уже содержит значение ключа, DEFAULT не сработает, и последовательность лишний раз не двинется:
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
не работает, как хочется. Переменная pp, объявленная в программе, не меняется, как ни передавай: ?@pp или ?pp. Курсор возвращается с полем с именем INOUT-параметра. Но не хочется получать курсор, запоминать и возвращаться в рабочие области, может, в этот Postgres нельзя передать параметр по ссылке? Неужели стандартный вызов процедуры
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
В постгрес можно. Скорей всего ODBC не поддерживает. Потому что некоторые другие способы соединения возвращают параметры. DotConnect тот же. Я даже больше скажу. В постгресе вообще процедур не существует, не то что их "стандартного" вызова. Кстати, в 11-ой версии процедуры анонсированы. Но не факт, что ODBC в ближайшее время обновят - тоже умирающий коннектор. |
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
Аркадий Автор Сообщений: 252 Откуда: Санкт-Петербург Дата регистрации: 30.11.2005 |
Спасибо! Что-нибудь придумаю.
А можно ли в эту процедуру вставить транзакцию? Конструкция типа
|
Re: Как вызывать процедуру Postgres с OUT-параметрами | |
---|---|
pasha_usue Сообщений: 3649 Откуда: Е-бург Дата регистрации: 06.10.2006 |
Оно и так в транзакции. Требуется вложенная транзакция? Для plpgsql или для sql? |
© 2000-2024 Fox Club  |