在PostgreSQL中声明临时变量

时间:2009-12-21 16:46:43

标签: sql-server postgresql variables compatibility

我正在从SQL Server迁移到PostgreSQL。我从How to declare a variable in a PostgreSQL query看到在本机sql查询中没有临时变量这样的东西。

好吧,我非常需要一些......我怎么会在plpgsql混音?我必须创建一个函数,然后删除该函数才能访问某种语言吗?这似乎很容易让我感到错误,我害怕我错过了什么。

编辑:

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 个答案:

答案 0 :(得分:3)

您要插入的表的架构是什么?我将尝试基于这种模式假设来回答:

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 :(得分:1)

如果您正在使用语言绑定,则可以在那里保存变量。

例如使用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;

答案 2 :(得分:1)

  

我必须创建一个函数然后   删除该功能以获取   访问语言?

是的,但这个缺点将在PostgreSQL 8.5,with the addition of DO command中删除。 8.5将于2010年发布。

答案 3 :(得分:0)

您还可以使用plperl声明会话变量 - http://www.postgresql.org/docs/8.4/static/plperl-global.html

答案 4 :(得分:0)

使用CREATE LANGUAGE命令为已知语言安装要使用的语言。虽然你可以使用其他语言。

Language installation docs

CREATE LANGUAGE usage doc

您必须创建一个使用它的函数。如果你不想在db中创建一个永久函数,那么另一种选择是使用python中的脚本或者使用postgresql驱动程序连接到db并执行查询。然后,您可以操作或查看脚本中的数据。例如在python中你会安装pygresql库并在你的脚本中导入pgdb,你可以使用它来连接数据库。

PyGreSQL Info

答案 5 :(得分:-1)

我认为PostgreSQL的row-type variable将是最接近的东西:

  

复合类型的变量是   称为行变量(或行型)   变量)。这样的变量可以容纳一个   SELECT或FOR查询的整行   结果,只要该查询的列   set匹配声明的类型   变量

答案 6 :(得分:-1)

您提到了帖子(How to declare a variable in a PostgreSQL query)。

如果使用psql和\ set命令,我相信在解决方案链的下方有一个合适的答案:

my_db=> \set myvar 5
my_db=> SELECT :myvar  + 1 AS my_var_plus_1;