PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ubah skema beberapa fungsi PostgreSQL dalam satu operasi?

Anda dapat memperbaiki loop lagi (menunjukkan hanya kueri kedua ):

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

Poin utama

  • Operator penugasan di plpgsql adalah := . = berfungsi, tetapi tidak berdokumen.

  • Hapus tabel yang tidak diperlukan dari FROM .

  • concat() mungkin berlebihan, tetapi format() menyederhanakan sintaks.

Alternatif berbasis set yang lebih baik

Re-casting masalah sebagai operasi berbasis set lebih efektif. Satu SELECT dengan string_agg() melakukan pekerjaan:

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. ST_DDalam terkadang tidak menggunakan indeks

  2. Hitung Usia dalam Tahun di PostgreSQL

  3. Ukuran database PostgreSQL meningkat

  4. Memahami Kinerja Kueri PostgreSQL

  5. Bagaimana cara memberikan tanggal nol di nativeQuery hibernasi?