Por ejemplo, en MS-SQL, puede abrir una ventana de consulta y ejecutar lo siguiente:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
¿Cómo se hace esto en PostgreSQL? Se puede hacer?
Por ejemplo, en MS-SQL, puede abrir una ventana de consulta y ejecutar lo siguiente:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
¿Cómo se hace esto en PostgreSQL? Se puede hacer?
Respuestas:
La respuesta completa se encuentra en la documentación oficial de PostgreSQL .
Puede utilizar la nueva función de bloqueo 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 $$;
También puede obtener la última identificación de inserción :
DO $$
DECLARE lastid bigint;
BEGIN
INSERT INTO test (name) VALUES ('Test Name')
RETURNING id INTO lastid;
SELECT * FROM test WHERE id = lastid;
END $$;
;
después END $$
, así:. 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 con otras variables. @ achilles-ram-nakirekanti, ¿podría agregar un ejemplo usando esto en una select
declaración para aclararlo ?
Puedes usar:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
Que hará
psql
consola. No podrá escribir esto en el SQL de su aplicación.
postgresql
y es la peor alternativa. en general, estoy bastante satisfecho con postgresql
: pero este es un fracaso sorprendentemente grande
Aquí hay un ejemplo del uso de una variable en 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
Eche un vistazo a los documentos plpgsql para obtener más información.
Me encontré con algunos otros documentos que usan \set
para declarar la variable de secuencia de comandos, pero el valor parece ser un valor constante y estoy encontrando una forma en que puede actuar como una variable, no como una variable constante.
Ex:
\set Comm 150
select sal, sal+:Comm from emp
Aquí sal
está el valor que está presente en la tabla 'emp' y comm
es el valor constante.
Postgresql no tiene variables desnudas, podría usar una tabla temporal. las variables solo están disponibles en bloques de código o como una función de interfaz de usuario.
Si necesita una variable simple, puede usar una tabla temporal:
CREATE TEMP TABLE list AS VALUES ('foobar');
SELECT dbo.PubLists.*
FROM dbo.PubLists,list
WHERE Name = list.column1;
Sobre la base de la respuesta de @ nad2000 y la respuesta de @ Pavel aquí , aquí es donde terminé para mis scripts de migración de Flyway. Manejo de escenarios donde el esquema de la base de datos se modificó 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 variables en, por ejemplo, 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;