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

Změnit schéma více funkcí PostgreSQL v jedné operaci?

Smyčku byste mohli ještě upřesnit (ukázat pouze druhý dotaz ):

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$;

Hlavní body

  • Operátor přiřazení v plpgsql je := . = funguje, ale je nezdokumentovaný.

  • Odstraňte nepotřebné tabulky z FROM .

  • concat() může být přehnané, ale format() zjednodušuje syntaxi.

Lepší alternativa založená na sadě

Přetypování problému jako operace založená na množinách je efektivnější. Jeden SELECT s string_agg() dělá svou práci:

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. Co jsou výpisy připravené na straně klienta?

  2. Jak přidat časový dotaz v Oracle?

  3. SQL dotaz pro výběr dat mezi dvěma daty

  4. Odstranění více řádků z databáze pomocí zaškrtávacích políček