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

Jak uzyskać listy parametrów funkcji (abym mógł usunąć funkcję)

Postgres ma do tego dedykowaną funkcję. Wprowadzony z Postgresem 8.4. Instrukcja:

pg_get_function_identity_arguments(func_oid) ... pobierz listę argumentów do identyfikacji funkcji (bez wartości domyślnych) ...

pg_get_function_identity_arguments zwraca argument listniezbędny do zidentyfikowania funkcji w postaci, w jakiej musiałby pojawić się w ALTER FUNCTION , na przykład. Ten formularz pomija wartości domyślne.

Używając tego (i format() , wprowadzone w Postgresie 9.1), następujące zapytanie generuje instrukcje DDL w celu usunięcia funkcji pasujących do wyszukiwanych haseł:

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;

Katalog systemowy pg_proc zmieniono w Postgres 11 . proisagg został zastąpiony przez prokind , dodano prawdziwe procedury składowane. Musisz się dostosować. Zobacz:

  • Jak usunąć wszystkie moje funkcje w PostgreSQL?

Zwroty:

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

Znaleziono cztery dopasowania w przykładzie, ponieważ dblink używa przeciążonych funkcji.
Uruchom DROP wypowiedzi selektywnie!

Alternatywnie , możesz użyć wygodnego rzutowania na typ identyfikatora obiektu regprocedure który zwraca pełną sygnaturę funkcji, w tym typy argumentów:

-- 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. PostgreSQL:pomiędzy z datetime

  2. Chcę przywrócić bazę danych z innym schematem

  3. użyj polecenia nazwa_bazy_danych w PostgreSQL

  4. Zainstaluj Postgres.app na komputerze Mac

  5. zaktualizuj zapytanie z połączeniem na dwóch stołach