sql >> Database teknologi >  >> RDS >> PostgreSQL

Ændre skema for flere PostgreSQL-funktioner i én operation?

Du kan forfine løkken noget mere (demonstrerer kun den anden forespørgsel ):

DO
$do$
DECLARE
    r   record;
    sql text = '';
BEGIN
    FOR r IN
        SELECT p.proname, pg_get_function_identity_arguments(p.oid) AS params
        FROM   pg_proc p
        JOIN   pg_namespace n ON n.oid = p.pronamespace
        WHERE  nspname = 'public'
        -- and other conditions, if needed
    LOOP
        sql := sql
          || format(E'\nALTER FUNCTION public.%I(%s) SET SCHEMA new_schema;'
                   ,r.proname, r.params);
    END LOOP;

    RAISE NOTICE '%', sql; -- for viewing the sql before executing it
    -- EXECUTE sql; -- for executing the sql
END
$do$;

Vigtige punkter

  • Tildelingsoperator i plpgsql er := . = virker, men er udokumenteret.

  • Fjern unødvendige tabeller fra FROM .

  • concat() kan være overkill, men format() forenkler syntaksen.

Bedre sætbaseret alternativ

Recasting af problemet som sæt-baseret drift er mere effektivt. En SELECT med string_agg() gør jobbet:

DO
$do$
DECLARE
   sql text;
BEGIN
   SELECT INTO sql
          string_agg(format('ALTER FUNCTION public.%I(%s) SET SCHEMA new_schema;'
                   ,p.proname, pg_get_function_identity_arguments(p.oid)), E'\n')
   FROM   pg_proc p
   JOIN   pg_namespace n ON n.oid = p.pronamespace
   WHERE  nspname = 'public';
      -- and other conditions, if needed

   RAISE NOTICE '%', sql; -- for viewing the sql before executing it
   -- EXECUTE sql; -- for executing the sql
END
$do$;


  1. Postgres holdt lige tilfældigt op med at virke (Rails, PGSQL.5432)

  2. Hvordan får du din database til at tale mange sprog?

  3. mysql forespørgsel vælg gerne med diakritiske tyrkiske bogstaver

  4. Få et array fra MySQL til Android