我正在从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()
我认为的那个)
答案 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命令为已知语言安装要使用的语言。虽然你可以使用其他语言。
您必须创建一个使用它的函数。如果你不想在db中创建一个永久函数,那么另一种选择是使用python中的脚本或者使用postgresql驱动程序连接到db并执行查询。然后,您可以操作或查看脚本中的数据。例如在python中你会安装pygresql库并在你的脚本中导入pgdb,你可以使用它来连接数据库。
答案 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;