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

Как да получа списъци с параметри на функции (за да мога да пусна функция)

Postgres има специална функция за тази цел. Въведено с Postgres 8.4. Ръководството:

pg_get_function_identity_arguments(func_oid) ... вземете списък с аргументи за идентифициране на функция (без стойности по подразбиране) ...

pg_get_function_identity_arguments връща аргумента list, необходим за идентифициране на функция, във формата, която трябва да се появи в ALTER FUNCTION , например. Този формуляр пропуска стойностите по подразбиране.

Използвайки това (и format() , въведен с Postgres 9.1), следната заявка генерира DDL изрази за премахване на функции, съответстващи на вашите думи за търсене:

SELECT format('DROP %s %I.%I(%s);'
            , CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , n.nspname
            , p.proname
            , pg_catalog.pg_get_function_identity_arguments(p.oid)
             ) AS stmt
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  p.proname = 'dblink'                     -- function name
-- AND n.nspname = 'public'                     -- schema name (optional)
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user
ORDER  BY 1;

Системният каталог pg_proc променено в Postgres 11 . proisagg беше заменен с prokind , бяха добавени истински съхранени процедури. Трябва да се адаптирате. Вижте:

  • Как да премахна всичките си функции в PostgreSQL?

Връща:

                  stmt
---------------------------------------------------
 DROP FUNCTION public.dblink(text);
 DROP FUNCTION public.dblink(text, boolean);
 DROP FUNCTION public.dblink(text, text);
 DROP FUNCTION public.dblink(text, text, boolean); 

В примера бяха намерени четири съвпадения, защото dblink използва претоварени функции.
Изпълнете DROP изявления избирателно!

Алтернативно , можете да използвате удобното прехвърляне към тип идентификатор на обект regprocedure който връща пълен подпис на функцията, включително типове аргументи:

-- SET LOCAL search_path = '';  -- optional, to get all names schema-qualified
SELECT format('DROP %s %s;'
            , CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , oid::regprocedure
             ) AS stmt
FROM   pg_catalog.pg_proc
WHERE  proname = 'dblink'   -- function name
ORDER  BY 1;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли удар в производителността при използване на десетични типове данни (MySQL / Postgres)

  2. Заявката за избор с ограничение за отместване е твърде бавна

  3. Вземете броя на дните в месеца в PostgreSQL

  4. Как да създадете индекс за елементи от масив в PostgreSQL?

  5. Максимален брой знаци в етикетите (имена на таблици, колони и т.н.)