sql >> Databáze >  >> RDS >> PostgreSQL

FUNKCE DROP bez znalosti počtu/typu parametrů?

Základní dotaz

Tento dotaz vytvoří všechny potřebné příkazy 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

Výstup:

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

Proveďte příkazy po kontrole věrohodnosti.

Předejte název funkce rozlišují se malá a velká písmena a bez přidaných dvojitých uvozovek k porovnání s pg_proc.proname .

Přetypování na typ identifikátoru objektu regprocedure (oid::regprocedure ) a poté na text implicitně vytváří názvy funkcí s typy argumentů, automaticky v dvojitých uvozovkách a kvalifikovaných podle schématu podle aktuální search_path kde je potřeba. Žádné vkládání SQL možné.

pg_function_is_visible(oid) omezuje výběr na funkce v aktuální search_path ("viditelné"). To můžete nebo nemusíte chtít.

Pokud máte více funkcí se stejným názvem ve více schématech nebo přetížené funkce s různými argumenty funkcí, vše z nich budou uvedeny samostatně. Možná budete chtít omezit na konkrétní schéma(a) nebo konkrétní funkční parametr(y).

Související:

  • Kdy / jak jsou funkce výrazu výchozí hodnoty svázány s ohledem na vyhledávací_cestu?

Funkce

Můžete vytvořit plpgsql funkce kolem tohoto pro okamžité provedení příkazů pomocí EXECUTE . Pro Postgres 9.1 nebo později:Pozor! Ztratí vaše funkce!

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

Volejte:

SELECT f_delfunc('my_function_name');

Funkce vrátí počet nalezených a zrušených funkcí, pokud nejsou vyvolány žádné výjimky. 0 pokud nebyly žádné nalezeny.

Další čtení:

  • Jak parametr search_path ovlivňuje rozlišení identifikátoru a "aktuální schéma"
  • Zkrácení všech tabulek v databázi Postgres
  • PostgreSQL parametrizované Order By / Limit v tabulkové funkci

Pro verze Postgres starší než 9.1 nebo starší varianty funkce pomocí regproc a pg_get_function_identity_arguments(oid) zkontrolujte historii úprav této odpovědi.



  1. Implementace nastavení více datových center pro PostgreSQL – část první

  2. Vytvořte tunel SSH pro vzdálený přístup k MySQL

  3. Nakonfigurujte Lucene.Net s SQL Server

  4. Oracle convert unix epoch time to date