:: Visual Foxpro, Foxpro for DOS
Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Добрый день!

В недобрый час для одного проекта у нас выбрали Postgres.

Если на SQL Server я создавал процедуры с OUT-параметрами и вызывал их из программы таким образом
EXEC процедура ?@m.par1, ?@m.par2, ?m.par3, ?m.par4
при этом мои фоксовские переменные m.par1 и m.par2 изменялись и принимали нужное значение,
то Postgres, по моим наблюдениям, вообще не требует передачи переменных, которые надо изменить в процедуре. То есть, в моём случае в процедуру, вроде, надо передавать два параметра.
Подскажите, пожалуйста, если кто-нибудь работает в Postgres, как, для примера, создать и вызвать из фокса простейшую процедуру получения нового уникального кода с использованием OUT-параметра типа SQL SERVERовской

CREATE PROCEDURE dbo.new_id
@nRetVal int OUTPUT
AS
BEGIN
UPDATE id_counter SET @nRetVal = id_counter.id, id_counter.id = id_counter.id + 1
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
А занадлячего нужна такая функция на постгресе? Обычного Sequence не хватает? Там есть NextVal и CurrVal для работы с Sequence.

Вызов какой-нибудь такой возможен:
SELECT currval('study_study_id_seq'::regclass);



Исправлено 1 раз(а). Последнее : pasha_usue, 31.10.18 16:16
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Для общего развития - так:
CREATE OR REPLACE FUNCTION tstfunc(
IN tiarg1 integer,
INOUT tiarg2 integer,
OUT tiarg3 integer)
RETURNS record AS
$BODY$BEGIN
tiArg3 := tiArg2 + tiArg1;
tiArg2 := tiArg1 + 1;
END;$BODY$
LANGUAGE plpgsql VOLATILE;

Вызвать так:
select * from tstfunc(10, 20);



Исправлено 1 раз(а). Последнее : pasha_usue, 31.10.18 16:28
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Я плохо понимаю суть написанного, т. к. впервые столкнулся с Postgres.
К тому же у меня к Postgres есть только жалкая оболочка DBeaver, в которой я не могу по-человечески даже запустить набор команд.
Например, есть несколько различных типов объектов/субъектов, имеющих адреса, телефоны, паспорта, электропочту и прочую одинаковую ерунду, которую я храню в единых для всех таблицах. Поэтому хочется вести у них (в таблицах с этими объектами/субъектами) общую уникальную кодировку. Для этого я завёл свой счётчик.
Конечно, я могу из фокса писать явный UPDATE и SELECT, брать значение из полученного курсора, но уже привык получать значение кода из процедуры сразу в переменную и использовать её.
Я рассчитывал, что такие свойства процедур едины и присущи всем СУБД, и я смогу всюду использовать свои базовые классы с подобными процедуринами.
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Попробую вторую конструкцию
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Аркадий
Я плохо понимаю суть написанного, т. к. впервые столкнулся с Postgres.
Просто ваша процедура работает неправильно в любом версионнике. Даже в MsSQL, когда он в режиме версионника.

Аркадий
К тому же у меня к Postgres есть только жалкая оболочка DBeaver, в которой я не могу по-человечески даже запустить набор команд.
PgAdmin3 и не жужжу. Тупо потому что он цепляется через родную либу, и при этом OpenSource.

Аркадий
Например, есть несколько различных типов объектов/субъектов, имеющих адреса, телефоны, паспорта, электропочту и прочую одинаковую ерунду, которую я храню в единых для всех таблицах. Поэтому хочется вести у них (в таблицах с этими объектами/субъектами) общую уникальную кодировку. Для этого я завёл свой счётчик.
Для этого заводится один Sequence и явно прописывается всем таблицам, подходящим под описание. А если таблицы к тому же ещё и одинаковые в части полей, то я бы ещё и унаследовал таблицы от общего предка.

Аркадий
Конечно, я могу из фокса писать явный UPDATE и SELECT, брать значение из полученного курсора, но уже привык получать значение кода из процедуры сразу в переменную и использовать её.
Я рассчитывал, что такие свойства процедур едины и присущи всем СУБД, и я смогу всюду использовать свои базовые классы с подобными процедуринами.
Везде свои нюансы: и в Oracle, и в FireBird, и в MySQL. Это ж не голый стандарт ANSI SQL. Тем более, что MsSQL от стандарта ушёл несколько дальше других СУБД.



Исправлено 1 раз(а). Последнее : pasha_usue, 31.10.18 16:55
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Вообще-то я хотел в фоксе объявить переменную, например, pp, в процедурине иметь out-параметр, запускать процедуру типа EXEC ?@pp и получить в pp значение.

Таким образом
SQLEXEC(nStatementHandle, 'select * from tstfunc(?@pp, ?qq);' )
можно реализовать моё желание?
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Аркадий
можно реализовать моё желание?
Так попробуйте. Вернулся INOUT параметр вместе с рекордсетом в примере с tstfunc?



Исправлено 1 раз(а). Последнее : pasha_usue, 31.10.18 17:05
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Таблицы не одинаковые в части полей, это всё дочерние таблицы, т. к. адресов, телефонов и пр. у каждой записи может же быть произвольное количество, а все прочие реквизиты совершенно разные.
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Спасибо, попробую. Надо ещё переделать свою, как казалось, универсальную процедурину для этого случая.
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Аркадий
Таблицы не одинаковые в части полей, это всё дочерние таблицы, т. к. адресов, телефонов и пр. у каждой записи может же быть произвольное количество, а все прочие реквизиты совершенно разные.
Ну, значит, не наследуйте. Просто используйте общую последовательность.

CREATE SCHEMA sdadd AUTHORIZATION postgres;
CREATE SEQUENCE sdadd.my_big_sequence;
CREATE TABLE sdadd.email
(
id integer NOT NULL DEFAULT nextval('sdadd.my_big_sequence'::regclass),
email character varying(40),
CONSTRAINT sdadd_email_id PRIMARY KEY (id)
);
CREATE TABLE sdadd.phone
(
id integer NOT NULL DEFAULT nextval('sdadd.my_big_sequence'::regclass),
phone character varying(40),
CONSTRAINT sdadd_phone_id PRIMARY KEY (id)
);
insert into sdadd.phone (phone) values ('123');
insert into sdadd.email (email) values ('abc');
insert into sdadd.phone (phone) values ('456');
insert into sdadd.email (email) values ('def');
select currval('sdadd.my_big_sequence'::regclass);
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Аркадий

UPDATE id_counter SET @nRetVal = id_counter.id, id_counter.id = id_counter.id + 1

Честно говоря "напрягла" эта конструкция, в табличке id_counter ВСЕГДА ОДНА запись?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
PaulWist
Аркадий

UPDATE id_counter SET @nRetVal = id_counter.id, id_counter.id = id_counter.id + 1

Честно говоря "напрягла" эта конструкция, в табличке id_counter ВСЕГДА ОДНА запись?
Меня не это напрягает. Меня напрягает, что функция может выдать два одинаковых значения в конкурирующие транзакции. Блокировок-то не ставится.
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Разумеется, запись одна, а счётчиков (полей) может быть несколько. И всё это в транзакции, только я не привёл её для краткости. Мне бы код возвратить сначала.
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Я так понимаю, что общую последовательность надо сделать у основных таблиц. Это у людей и организаций разного рода коды не должны пересекаться. А в списках адресов и телефонов - безразлично.
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Аркадий
Я так понимаю, что общую последовательность надо сделать у основных таблиц. Это у людей и организаций разного рода коды не должны пересекаться. А в списках адресов и телефонов - безразлично.
Уникальную последовательность для таблицы можно задать так:
CREATE TABLE sdadd.email
(
id serial NOT NULL,
email character varying(40),
CONSTRAINT sdadd_email_id PRIMARY KEY (id)
);
Тогда, сервер автоматом сгенерирует последовательность 'email_id_seq' и привяжет её в DEFAULT таблицы.

Кстати, если запрос на INSERT уже содержит значение ключа, DEFAULT не сработает, и последовательность лишний раз не двинется:
lnNewId := NextVal('email_id_seq'::RegClass);
INSERT INTO Email (Id, Email) VALUES (lnNewId, '''.phorum_html_encode('My@Email.Com').''');
Это в хранимках удобно использовать иногда.
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
SQLEXEC(nStatementHandle, 'select * from tstfunc(?@pp, ?qq);' )

не работает, как хочется. Переменная pp, объявленная в программе, не меняется, как ни передавай: ?@pp или ?pp. Курсор возвращается с полем с именем INOUT-параметра.
Но не хочется получать курсор, запоминать и возвращаться в рабочие области, может, в этот Postgres нельзя передать параметр по ссылке?
Неужели стандартный вызов процедуры
EXECUTE tstfunc ?@pp, ?qq
тут не существует?
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Аркадий
SQLEXEC(nStatementHandle, 'select * from tstfunc(?@pp, ?qq);' )

не работает, как хочется. Переменная pp, объявленная в программе, не меняется, как ни передавай: ?@pp или ?pp. Курсор возвращается с полем с именем INOUT-параметра.
Но не хочется получать курсор, запоминать и возвращаться в рабочие области, может, в этот Postgres нельзя передать параметр по ссылке?
В постгрес можно. Скорей всего ODBC не поддерживает. Потому что некоторые другие способы соединения возвращают параметры. DotConnect тот же.

Аркадий
Неужели стандартный вызов процедуры
EXECUTE tstfunc ?@pp, ?qq
тут не существует?
Я даже больше скажу. В постгресе вообще процедур не существует, не то что их "стандартного" вызова.

Кстати, в 11-ой версии процедуры анонсированы. Но не факт, что ODBC в ближайшее время обновят - тоже умирающий коннектор.
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
Аркадий
Автор

Сообщений: 252
Откуда: Санкт-Петербург
Дата регистрации: 30.11.2005
Спасибо! Что-нибудь придумаю.
А можно ли в эту процедуру вставить транзакцию? Конструкция типа
begin ;
commit;
приведённая на их форуме, выдаёт ошибку о неположенной ';'
Ratings: 0 negative/0 positive
Re: Как вызывать процедуру Postgres с OUT-параметрами
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Аркадий
Спасибо! Что-нибудь придумаю.
А можно ли в эту процедуру вставить транзакцию? Конструкция типа
begin ;
commit;
приведённая на их форуме, выдаёт ошибку о неположенной ';'
Оно и так в транзакции. Требуется вложенная транзакция? Для plpgsql или для sql?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 shumik73 Guest (Гостей: 20)

© 2000-2024 Fox Club 
Яндекс.Метрика