sql >> Databáze >  >> RDS >> PostgreSQL

Použijte proměnnou nastavenou meta-příkazem psql uvnitř bloku DO

Odpověď

DO očekává řetězcový literál s plpgsql kódem. Symboly se uvnitř řetězců v psql nenahrazují.
Můžete zřetězit celý řetězec do proměnné psql a pak provést.

  • Jak zřetězit proměnné psql?

Víceřádkový formát není možný, protože (podle dokumentace):

V žádném případě však argumenty metapříkazu nemohou pokračovat za konec řádku.

Jednoduchý příklad:

test=# \set value foo
test=# \set do 'BEGIN\n   RAISE NOTICE ''v: %'', ' :'value' ';\nEND'
test=# DO :'do';
NOTICE:  v: foo

Konce řádků nahraďte \n (nebo je odstraňte, pokud vás nezajímá pěkný formát). Na základě tohoto upraveného kódu:

DO
'
DECLARE
   _val  text;
   _vals text[] := string_to_array(>>values<<, '','');
BEGIN
   FOREACH _val IN ARRAY _vals
   LOOP
     RAISE NOTICE ''v: %'', _val;
   END LOOP;
END
'

Vypadá to takto:

test=# \set do 'DECLARE\n   _val  text;\n   _vals text[] := string_to_array(' :'values' ', '','');\nBEGIN\n   FOREACH _val IN ARRAY _vals\n   LOOP\n     RAISE NOTICE ''v: %'', _val;\n   END LOOP;\nEND'
test=# DO :'do';
NOTICE:  v: foo
NOTICE:  v: bar
NOTICE:  v: baz
DO

Přidal jsem tučné důraz na proměnnou, aby bylo snazší ji najít.

Související odpověď od @Pavel (ab) pomocí proměnné relace serveru:

  • Odkaz na proměnné relace (\set var='value') z PL/PGSQL

Alternativní řešení

Připravené prohlášení

Vaše současné řešení nevypadá tak špatně. Zjednodušil bych to:

PREPARE get_values AS SELECT * FROM regexp_split_to_table(:'values', ',');

DO
$do$
DECLARE
   _val text;
BEGIN
   FOR _val IN EXECUTE
      'EXECUTE get_values'
   LOOP
      RAISE NOTICE 'v: %', _val;
   END LOOP;
END
$do$;

Dočasný stůl

Podobné řešení s dočasnou tabulkou:

CREATE TEMP TABLE tmp AS SELECT * FROM regexp_split_to_table(:'values', ',') v;

DO
$do$
DECLARE
   _val text;
BEGIN
   FOR _val IN
      TABLE tmp
   LOOP
      RAISE NOTICE 'v: %', _val;
   END LOOP;
END
$do$;


  1. nelze odstranit objekt kvůli omezení cizího klíče

  2. Aktualizujte více hodnot sloupců tabulky pomocí jednoho dotazu

  3. Sestavení 'Microsoft.SqlServer.Types' verze 10 nebo vyšší nelze nalézt

  4. 3 způsoby formátování čísla na 2 desetinná místa v Oracle