¿Cómo se utilizan las variables en un script PostgreSQL simple?

Respuestas:

131

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 $$;
nad2000
fuente
7
(Y no olvides el ;después END $$, así:. END $$;)
KajMagnus
3
NO FUNCIONA PARA MI ERROR CERCA DE HACER, también tengo algunas funciones entre el comienzo y el final con plpgsql language.
Ash
49
el código de este ejemplo no funciona. 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
Jasen
1
Siendo completamente nuevo en PostgreSQL, esto me confundió por un tiempo, aquí hay algunos consejos más: + ¡Asegúrese de terminar sus declaraciones con un punto y coma! + Debido a que no hay un identificador de variable, es posible que desee utilizar un _ o algo similar para evitar nombres de columna ambiguos. + Puede establecer la variable a un valor en línea usando así DECLARE _accountid INT: = 1;
The Coder
1
no trabaja para mi. Usando ardilla. Error: ERROR: cadena cotizada en dólares sin terminar en o cerca de "$$
Oliver Watkins
39
DO $$
DECLARE  
   a integer := 10;  
   b integer := 20;  
   c integer;  
BEGIN  
   c := a + b;
    RAISE NOTICE'Value of c: %', c;
END $$;
Achilles Ram Nakirekanti
fuente
3
no trabaja para mi. Usando ardilla. Error: ERROR: cadena cotizada en dólares sin terminar en o cerca de "$$
Oliver Watkins
Me tomó un tiempo darme cuenta de que para usar la variable no debe prefijarla :como con otras variables. @ achilles-ram-nakirekanti, ¿podría agregar un ejemplo usando esto en una selectdeclaración para aclararlo ?
exhuma
28

Puedes usar:

\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;

Que hará

Karim de Alba
fuente
3
ERROR: error de sintaxis en o cerca de "\" ¿Qué me estoy perdiendo?
scw
14
@scw Esto solo está disponible desde la psqlconsola. No podrá escribir esto en el SQL de su aplicación.
Owensmartin
@owensmartin Podrá usar esto es cualquier cosa que se transmita a psql ... o cualquier script que lea psql ...
Evan Carroll
4
Esto no responde la pregunta en absoluto. En MS SQL puede definir una var en una consulta y usarla allí mismo, en la misma herramienta. No entiendo por qué la gente sigue proponiendo esto como respuesta, en cada versión de esta pregunta.
piedra
@stone aparentemente porque esta es una gran "falla" postgresqly es la peor alternativa. en general, estoy bastante satisfecho con postgresql: pero este es un fracaso sorprendentemente grande
javadba
10

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.

pensar demasiado
fuente
4

Me encontré con algunos otros documentos que usan \setpara 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í salestá el valor que está presente en la tabla 'emp' y commes el valor constante.

Vinodraj
fuente
2

Tuve que hacer algo como esto

CREATE OR REPLACE FUNCTION MYFUNC()
RETURNS VOID AS $$
DO
$do$
BEGIN
DECLARE
 myvar int;
 ...
END
$do$
$$ LANGUAGE SQL;
Mella
fuente
2

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;
Jasen
fuente
Como beneficio adicional, este enfoque es independiente de la base de datos, lo que hace que sus pruebas sean más portátiles en el backend.
obispo
2

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 $$;
Shane
fuente
1

Para el cliente CLI oficial "psql", consulte aquí . Y "pgAdmin3" 1.10 (todavía en beta) tiene " pgScript ".

Milen A. Radev
fuente
1

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;
David Leon
fuente