PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zmienić schemat wielu funkcji PostgreSQL w jednej operacji?

Możesz jeszcze bardziej doprecyzować pętlę (pokazując tylko drugie zapytanie ):

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

Główne punkty

  • Operatorem przypisania w plpgsql jest := . = działa, ale jest nieudokumentowany.

  • Usuń niepotrzebne tabele z FROM .

  • concat() może być przesadą, ale format() upraszcza składnię.

Lepsza alternatywa oparta na zestawie

Przekształcenie problemu jako operacji opartej na zbiorach jest bardziej efektywne. Jeden SELECT z string_agg() wykonuje pracę:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapisz zmiany w bazie danych vaadin

  2. heroku run rake db:błąd migracji

  3. ProgrammingError:błąd składni w lub w pobliżu podczas wykonywania zapytania w pythonie przy użyciu psycopg2

  4. Dlaczego instalacja DBD::Pg kończy się niepowodzeniem w DynaLoader?

  5. Rails 3, Heroku:Taps Server Error:PGError:ERROR:nieprawidłowa sekwencja bajtów do kodowania UTF8:0xba