sql >> Database >  >> RDS >> PostgreSQL

Schema van meerdere PostgreSQL-functies in één handeling wijzigen?

Je zou de lus nog wat kunnen verfijnen (waarmee alleen de tweede zoekopdracht wordt getoond) ):

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

Belangrijkste punten

  • Toewijzingsoperator in plpgsql is := . = werkt, maar is niet gedocumenteerd.

  • Verwijder onnodige tabellen uit FROM .

  • concat() is misschien overdreven, maar format() vereenvoudigt de syntaxis.

Beter op set gebaseerd alternatief

Het opnieuw casten van het probleem als op set gebaseerde bewerking is effectiever. Eén SELECT met string_agg() doet het werk:

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. Het invoegen van waarden in een tabel binnen een functie ontvangt een fout, maar wanneer u probeert waarden in de tabel in te voegen buiten een functie, werkt het prima

  2. MySQL-gegevens weergeven aan klanten zodra ze inloggen

  3. XML maken in PHP met SimpleXML met speciale tekens

  4. naam en waarde ophalen van xmltype-attribuut in oracle