Объявление временных переменных в PostgreSQL - PullRequest
0 голосов
/ 21 декабря 2009

Я перехожу с SQL Server на PostgreSQL. Из я видел, как объявлять переменную в запросе PostgreSQL , что в нативных sql-запросах не существует временных переменных.

Ну, мне очень нужно немного ... Как бы я начал смешивать в plpgsql? Должен ли я создать функцию, а затем удалить ее, чтобы получить доступ к языку? это просто кажется мне подверженным ошибкам, и я боюсь, что что-то упустил.

EDIT:

cmd.CommandText="insert......" +
"declare @app int; declare @gid int;"+
"set @app=SCOPE_IDENTITY();"+ //select scope_identity will give us our RID that we just inserted
"select @gid=MAX(GROUPID) from HOUSEHOLD; set @gid=@gid+1; "+
"insert into HOUSEHOLD (APPLICANT_RID,GROUPID,ISHOH) values "+
"(@app,@gid,1);"+
"select @app";
rid=cmd.ExecuteScalar();

Прямой разрыв из приложения, в котором он используется. Обратите внимание, что мы находимся в процессе преобразования с сервера SQL на Postgre. (также я понял, что scope_identity() бит, я думаю)

Ответы [ 7 ]

3 голосов
/ 22 декабря 2009

Какая у вас схема для вставляемой таблицы? Я постараюсь ответить на основании этого предположения схемы:

CREATE TABLE HOUSEHOLD (
    APPLICANT_RID SERIAL,  -- PostgreSQL auto-increment
    GROUPID INTEGER,
    ISHOH INTEGER
);

Если я правильно понимаю ваши намерения, в PostgreSQL> = 8.2 запрос будет:

INSERT INTO HOUSEHOLD (GROUPID, ISHOH)
VALUES ((SELECT COALESCE(MAX(GROUPID)+1,1) FROM HOUSEHOLD), 1)
RETURNING APPLICANT_RID;

-- Added call to the COALESCE function to cover the case where HOUSEHOLD 
-- is empty and MAX(GROUPID) returns NULL

В PostgreSQL> = 8.2 любой запрос INSERT / DELETE / UPDATE может иметь предложение RETURNING, которое действует как простой SELECT, выполняемый для набора результатов запроса на изменение.

1 голос
/ 21 декабря 2009

Должен ли я создать функцию, а затем удалить функцию, чтобы получить доступ к языку?

Да, но этот недостаток будет устранен в PostgreSQL 8.5, с добавлением команды DO . 8.5 выйдет в 2010 году.

1 голос
/ 21 декабря 2009

Если вы используете привязку языка, вы можете хранить там переменные.

Например, с помощью SQLAlchemy (python):

my_var = 'Reynardine'
session.query(User.name).filter(User.fullname==my_var)

Если вы находитесь в psql, у вас есть переменные:

\set a 5
SELECT :a;

А если ваша логика в PL / pgSQL:

tax := subtotal * 0.06;
0 голосов
/ 20 августа 2013

Вы упомянули пост ( Как объявить переменную в запросе PostgreSQL ).

Я полагаю, что есть подходящий ответ дальше по цепочке решений, если использовать psql и команду \ set:

my_db=> \set myvar 5
my_db=> SELECT :myvar  + 1 AS my_var_plus_1;
0 голосов
/ 21 декабря 2009

вы устанавливаете язык, который хотите использовать с командой CREATE LANGUAGE для известных языков. Хотя вы можете использовать и другие языки.

Язык установки документов

CREATE LANGUAGE use doc

Вам нужно будет создать функцию, чтобы использовать ее. Если вы не хотите создавать постоянную функцию в базе данных, тогда другим вариантом будет использование скрипта на python или чего-то, что использует драйвер postgresql для подключения к базе данных и выполнения запросов. Затем вы можете манипулировать или просматривать данные в сценарии. Например, в python вы должны установить библиотеку pygresql и в свой скрипт импортировать pgdb, который вы можете использовать для подключения к базе данных.

Информация PyGreSQL

0 голосов
/ 21 декабря 2009

Я думаю, что переменная типа строки PostgreSQL будет самой близкой вещью:

Переменная составного типа называется переменной строки (или тип строки переменная). Такая переменная может содержать вся строка запроса SELECT или FOR результат, пока столбец этого запроса набор соответствует объявленному типу переменная.

0 голосов
/ 21 декабря 2009

Вы также можете объявить переменные сеанса, используя plperl - http://www.postgresql.org/docs/8.4/static/plperl-global.html

...