Ad esempio, in MS-SQL, puoi aprire una finestra di query ed eseguire quanto segue:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
Come viene fatto in PostgreSQL? Può essere fatto?
Ad esempio, in MS-SQL, puoi aprire una finestra di query ed eseguire quanto segue:
DECLARE @List AS VARCHAR(8)
SELECT @List = 'foobar'
SELECT *
FROM dbo.PubLists
WHERE Name = @List
Come viene fatto in PostgreSQL? Può essere fatto?
Risposte:
La risposta completa si trova nella documentazione ufficiale di PostgreSQL .
È possibile utilizzare la nuova funzione di blocco del codice anonimo 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 $$;
Inoltre puoi ottenere l'ultimo ID di inserimento :
DO $$
DECLARE lastid bigint;
BEGIN
INSERT INTO test (name) VALUES ('Test Name')
RETURNING id INTO lastid;
SELECT * FROM test WHERE id = lastid;
END $$;
;
dopo END $$
, in questo modo:. 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 $$;
:
come con altre variabili. @ achilles-ram-nakirekanti potresti aggiungere un esempio usando questo in una select
dichiarazione per renderlo più chiaro?
Puoi usare:
\set list '''foobar'''
SELECT * FROM dbo.PubLists WHERE name = :list;
Questo funzionerà
psql
console. Non sarai in grado di scrivere questo nell'SQL della tua app.
postgresql
ed è l'alternativa meno peggiore. generalmente sono stato abbastanza soddisfatto postgresql
: ma questo è un fallimento sorprendentemente grande
Ecco un esempio di utilizzo di una variabile in 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
Dai un'occhiata ai documenti plpgsql per maggiori informazioni.
Mi sono imbattuto in alcuni altri documenti che usano \set
per dichiarare la variabile di scripting, ma il valore sembra essere come un valore costante e sto trovando il modo in cui può agire come una variabile non come una variabile costante.
Ex:
\set Comm 150
select sal, sal+:Comm from emp
Ecco sal
il valore che è presente nella tabella 'emp' ed comm
è il valore costante.
Postgresql non ha variabili nude, potresti usare una tabella temporanea. le variabili sono disponibili solo nei blocchi di codice o come funzionalità dell'interfaccia utente.
Se hai bisogno di una variabile nuda, potresti usare una tabella temporanea:
CREATE TEMP TABLE list AS VALUES ('foobar');
SELECT dbo.PubLists.*
FROM dbo.PubLists,list
WHERE Name = list.column1;
Basandosi sulla risposta di @ nad2000 e sulla risposta di @ Pavel qui , è qui che sono finito per i miei script di migrazione Flyway. Gestione di scenari in cui lo schema del database è stato modificato 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 $$;
Per utilizzare le variabili, ad esempio, 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;