PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Промяна на схемата на множество функции на PostgreSQL в една операция?

Можете да прецизирате цикъла още малко (като демонстрирате само втората заявка ):

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

Основни точки

  • Операторът за присвояване в plpgsql е := . = работи, но е недокументиран.

  • Премахнете ненужните таблици от FROM .

  • concat() може да е прекалено, но format() опростява синтаксиса.

По-добра алтернатива, базирана на набор

Повторното преобразуване на проблема като операция, базирана на набор, е по-ефективно. Един SELECT с string_agg() върши работата:

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. Няма достъп до таблица без име на public.table. Има ли начин да се отървем от обществеността?

  2. SQLAlchemy, изолиране на сериализируеми транзакции и повторни опити по идиоматичен начин на Python

  3. Последователността не се нулира след съкращаване на таблицата

  4. Изявление за актуализиране с помощта на клауза WHERE, която съдържа колони с нулеви стойности

  5. Създаване на таблица за стойности на многоъгълник в Postgis и вмъкване