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

FUNKCJA DROP bez znajomości liczby/rodzaju parametrów?

Podstawowe zapytanie

To zapytanie tworzy wszystkie niezbędne instrukcje DDL:

SELECT 'DROP FUNCTION ' || oid::regprocedure
FROM   pg_proc
WHERE  proname = 'my_function_name'  -- name without schema-qualification
AND    pg_function_is_visible(oid);  -- restrict to current search_path

Wyjście:

DROP FUNCTION my_function_name(string text, form text, maxlen integer);
DROP FUNCTION my_function_name(string text, form text);
DROP FUNCTION my_function_name(string text);

Wykonaj polecenia po sprawdzeniu poprawności.

Przekaż nazwę funkcji z uwzględnieniem wielkości liter i bez dodawania podwójnych cudzysłowów do dopasowania do pg_proc.proname .

Rzutowanie na identyfikator obiektu typu regprocedure (oid::regprocedure ), a następnie do text niejawnie, tworzy nazwy funkcji z typami argumentów, automatycznie w cudzysłowie i kwalifikowane według schematu zgodnie z bieżącą search_path w razie potrzeby. Brak wstrzykiwania SQL możliwe.

pg_function_is_visible(oid) ogranicza wybór do funkcji w bieżącej search_path ("widoczny"). Możesz tego chcieć lub nie.

Jeśli masz wiele funkcji o tej samej nazwie w wielu schematach lub funkcje przeciążone różnymi argumentami funkcji, wszystkie z nich zostaną wymienione osobno. Możesz chcieć ograniczyć się do określonych schematów lub określonych parametrów funkcji.

Powiązane:

  • Kiedy/jak są powiązane funkcje wyrażeń wartości domyślnej w odniesieniu do ścieżki_wyszukiwania?

Funkcja

Możesz zbudować plpgsql funkcja wokół tego, aby natychmiast wykonać instrukcje za pomocą EXECUTE . Dla Postgresa 9.1 lub później:Uważaj! Porzuca twoje funkcje!

CREATE OR REPLACE FUNCTION f_delfunc(_name text, OUT functions_dropped int)
   LANGUAGE plpgsql AS
$func$
-- drop all functions with given _name in the current search_path, regardless of function parameters
DECLARE
   _sql text;
BEGIN
   SELECT count(*)::int
        , 'DROP FUNCTION ' || string_agg(oid::regprocedure::text, '; DROP FUNCTION ')
   FROM   pg_catalog.pg_proc
   WHERE  proname = _name
   AND    pg_function_is_visible(oid)  -- restrict to current search_path
   INTO   functions_dropped, _sql;     -- count only returned if subsequent DROPs succeed

   IF functions_dropped > 0 THEN       -- only if function(s) found
     EXECUTE _sql;
   END IF;
END
$func$;

Zadzwoń:

SELECT f_delfunc('my_function_name');

Funkcja zwraca liczbę znalezionych i usuniętych funkcji, jeśli nie zgłoszono żadnych wyjątków. 0 jeśli nie znaleziono żadnego.

Dalsza lektura:

  • W jaki sposób search_path wpływa na rozpoznawanie identyfikatora i „bieżący schemat”
  • Obcinanie wszystkich tabel w bazie danych Postgres
  • Sparametryzowana PostgreSQL funkcja Order By / Limit w tabeli

Dla wersji Postgres starszych niż 9.1 lub starszych wariantów funkcji przy użyciu regproc i pg_get_function_identity_arguments(oid) sprawdź historię edycji tej odpowiedzi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie złączeń do łączenia danych z różnych tabel w PostgreSQL

  2. Uzyskać kolejność ostatnich N wierszy w bazie danych?

  3. Humanizowane lub naturalne sortowanie mieszanych ciągów słów i liczb

  4. Formularz Django do bazy danych zapytań (modele)

  5. Użytkownicy aplikacji a zabezpieczenia na poziomie wiersza