如何在简单的PostgreSQL脚本中使用变量?

时间:2009-04-20 02:28:52

标签: postgresql variables

例如,在MS-SQL中,您可以打开查询窗口并运行以下命令:

DECLARE @List AS VARCHAR(8)

SELECT @List = 'foobar'

SELECT *
FROM   dbo.PubLists
WHERE  Name = @List

这是如何在PostgreSQL中完成的?可以吗?

10 个答案:

答案 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)

对于官方CLI客户端“psql”,请参阅here。而“pgAdmin3”1.10(仍处于测试阶段)有“pgScript”。

答案 9 :(得分:0)

Postgresql没有裸变量,你可以使用临时表。 变量仅在代码块中或作为用户界面功能提供。

如果您需要裸变量,可以使用临时表:

CREATE TEMP TABLE list AS VALUES ('foobar');

SELECT dbo.PubLists.*
FROM   dbo.PubLists,list
WHERE  Name = list.column1;