Por exemplo, no MS-SQL, você pode abrir uma janela de consulta e executar o seguinte:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
Como isso é feito no PostgreSQL? Isso pode ser feito?
Por exemplo, no MS-SQL, você pode abrir uma janela de consulta e executar o seguinte:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
Como isso é feito no PostgreSQL? Isso pode ser feito?
Respostas:
A resposta completa está localizada na documentação oficial do PostgreSQL .
Você pode usar o novo recurso de bloqueio de código anônimo 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 $$;
Além disso, você pode obter o último id de inserção :
DO $$
DECLARE lastid bigint;
BEGIN
INSERT INTO test (name) VALUES ('Test Name')
RETURNING id INTO lastid;
SELECT * FROM test WHERE id = lastid;
END $$;
;
depois END $$
, assim:. END $$;
)
ERROR: query has no destination for result data HINT: If you want to discard the results of a SELECT, use PERFORM instead. CONTEXT: PL/pgSQL function inline_code_block line 7 at SQL statement
DO $$
DECLARE
a integer := 10;
b integer := 20;
c integer;
BEGIN
c := a + b;
RAISE NOTICE'Value of c: %', c;
END $$;
:
como com outras variáveis. @ achilles-ram-nakirekanti você poderia adicionar um exemplo usando isso em uma select
declaração para tornar isso mais claro?
Você pode usar:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
Que vai fazer
psql
console. Você não poderá escrever isso no SQL do seu aplicativo.
postgresql
e é a alternativa menos-pior. geralmente postgresql
Aqui está um exemplo de uso de uma variável em 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
Dê uma olhada na documentação do plpgsql para mais informações.
Eu encontrei alguns outros documentos que eles usam \set
para declarar a variável de script, mas o valor parece ser como um valor constante e estou descobrindo uma maneira que pode atuar como uma variável, não uma variável constante.
Ex:
\set Comm 150
select sal, sal+:Comm from emp
Aqui sal
está o valor que está presente na tabela 'emp' e comm
é o valor constante.
Postgresql não tem variáveis nuas, você pode usar uma tabela temporária. as variáveis estão disponíveis apenas em blocos de código ou como um recurso de interface do usuário.
Se você precisar de uma variável simples, poderá usar uma tabela temporária:
CREATE TEMP TABLE list AS VALUES ('foobar');
SELECT dbo.PubLists.*
FROM dbo.PubLists,list
WHERE Name = list.column1;
Com base na resposta de @ nad2000 e na resposta de @Pavel aqui , foi aqui que acabei meus scripts de migração do Flyway. Tratamento de cenários em que o esquema do banco de dados foi modificado manualmente.
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 $$;
Para usar variáveis em, por exemplo, 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;