例如,在MS-SQL中,您可以打开查询窗口并运行以下命令:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
这是如何在PostgreSQL中完成的?可以吗?
答案 0 :(得分:118)
完整答案位于official PostgreSQL documentation。
您可以使用新的PG9.0匿名代码块功能(http://www.postgresql.org/docs/9.1/static/sql-do.html)
DO $$
DECLARE v_List TEXT;
BEGIN
v_List := 'foobar' ;
SELECT *
FROM dbo.PubLists
WHERE Name = v_List;
-- ...
END $$;
您还可以获取最后一个insert ID:
DO $$
DECLARE lastid bigint;
BEGIN
INSERT INTO test (name) VALUES ('Test Name')
RETURNING id INTO lastid;
SELECT * FROM test WHERE id = lastid;
END $$;
答案 1 :(得分:27)
DO $$
DECLARE
a integer := 10;
b integer := 20;
c integer;
BEGIN
c := a + b;
RAISE NOTICE'Value of c: %', c;
END $$;
答案 2 :(得分:23)
您可以使用:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
那样做
答案 3 :(得分:9)
以下是在plpgsql中使用变量的示例:
create table test (id int);
insert into test values (1);
insert into test values (2);
insert into test values (3);
create function test_fn() returns int as $$
declare val int := 2;
begin
return (SELECT id FROM test WHERE id = val);
end;
$$ LANGUAGE plpgsql;
SELECT * FROM test_fn();
test_fn
---------
2
有关详细信息,请查看plpgsql docs。
答案 4 :(得分:3)
我遇到了一些其他文件,他们使用\set
来声明脚本变量,但是值似乎是常量值,我找到的方式可以像变量一样不是常数变量
例如:
\set Comm 150
select sal, sal+:Comm from emp
此处sal
是表'emp'中存在的值,comm
是常量值。
答案 5 :(得分:2)
基于@ nad2000的答案和@Pavel's answer here,这是我最终完成Flyway迁移脚本的地方。处理手动修改数据库架构的方案。
DO $$
BEGIN
IF NOT EXISTS(
SELECT TRUE FROM pg_attribute
WHERE attrelid = (
SELECT c.oid
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE
n.nspname = CURRENT_SCHEMA()
AND c.relname = 'device_ip_lookups'
)
AND attname = 'active_date'
AND NOT attisdropped
AND attnum > 0
)
THEN
RAISE NOTICE 'ADDING COLUMN';
ALTER TABLE device_ip_lookups
ADD COLUMN active_date TIMESTAMP;
ELSE
RAISE NOTICE 'SKIPPING, COLUMN ALREADY EXISTS';
END IF;
END $$;
答案 6 :(得分:1)
我必须做这样的事情
CREATE OR REPLACE FUNCTION MYFUNC()
RETURNS VOID AS $$
DO
$do$
BEGIN
DECLARE
myvar int;
...
END
$do$
$$ LANGUAGE SQL;
答案 7 :(得分:1)
例如在alter table中使用变量:
DO $$
DECLARE name_pk VARCHAR(200);
BEGIN
select constraint_name
from information_schema.table_constraints
where table_schema = 'schema_name'
and table_name = 'table_name'
and constraint_type = 'PRIMARY KEY' INTO name_pk;
IF (name_pk := '') THEN
EXECUTE 'ALTER TABLE schema_name.table_name DROP CONSTRAINT ' || name_pk;
答案 8 :(得分:0)
答案 9 :(得分:0)
Postgresql没有裸变量,你可以使用临时表。 变量仅在代码块中或作为用户界面功能提供。
如果您需要裸变量,可以使用临时表:
CREATE TEMP TABLE list AS VALUES ('foobar');
SELECT dbo.PubLists.*
FROM dbo.PubLists,list
WHERE Name = list.column1;