PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पैरामीटर की संख्या/प्रकार को जाने बिना ड्रॉप फ़ंक्शन?

मूल क्वेरी

यह क्वेरी सभी आवश्यक डीडीएल स्टेटमेंट बनाती है:

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

आउटपुट:

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

संभाव्यता की जांच के बाद आदेश निष्पादित करें।

फ़ंक्शन नाम केस-संवेदी और बिना किसी दोहरे उद्धरण चिह्नों के पास करें pg_proc.proname . से मिलान करने के लिए ।

ऑब्जेक्ट आइडेंटिफ़ायर टाइप करने के लिए कास्ट करें regprocedure (oid::regprocedure ), और फिर text . पर परोक्ष रूप से, तर्क प्रकारों के साथ फ़ंक्शन नाम उत्पन्न करता है, स्वचालित रूप से डबल-उद्धृत और वर्तमान search_path के अनुसार स्कीमा-योग्य। जहां जरूरत है। कोई SQL इंजेक्शन नहीं संभव है।

pg_function_is_visible(oid) चयन को वर्तमान search_path . में कार्यों तक सीमित करता है ("दृश्यमान")। आप इसे चाहें या न चाहें।

यदि आपके पास एकाधिक स्कीमा में एक ही नाम के कई फ़ंक्शन हैं, या विभिन्न फ़ंक्शन तर्कों के साथ अतिभारित फ़ंक्शन हैं, तो सभी उनमें से अलग से सूचीबद्ध किया जाएगा। आप विशिष्ट स्कीमा या विशिष्ट फ़ंक्शन पैरामीटर तक सीमित रखना चाह सकते हैं।

संबंधित:

  • खोज_पथ के संबंध में डिफ़ॉल्ट मान अभिव्यक्ति फ़ंक्शन कब/कैसे बाध्य हैं?

फ़ंक्शन

आप एक plpgsql बना सकते हैं EXECUTE . के साथ बयानों को तुरंत निष्पादित करने के लिए इसके चारों ओर कार्य करें . पोस्टग्रेज के लिए 9.1 या बाद में:सावधान! यह आपके कार्यों को गिरा देता है!

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

कॉल करें:

SELECT f_delfunc('my_function_name');

यदि कोई अपवाद नहीं उठाया जाता है तो फ़ंक्शन पाए गए और छोड़े गए कार्यों की संख्या देता है। 0 अगर कोई नहीं मिला।

आगे पढ़ना:

  • खोज_पथ पहचानकर्ता संकल्प और "वर्तमान स्कीमा" को कैसे प्रभावित करता है
  • पोस्टग्रेज डेटाबेस में सभी तालिकाओं को छोटा करना
  • पोस्टग्रेएसक्यूएल पैरामीटराइज्ड ऑर्डर बाय / लिमिट इन टेबल फंक्शन

9.1 से पुराने पोस्टग्रेज संस्करणों या फ़ंक्शन के पुराने वेरिएंट के लिए regproc का उपयोग कर रहे हैं और pg_get_function_identity_arguments(oid) इस उत्तर के संपादन इतिहास की जाँच करें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं उद्धरण के अंदर प्लेसहोल्डर के साथ एक क्वेरी का उपयोग कैसे कर सकता हूं? (पर्ल/पोस्टग्रेस्क्ल)

  2. Psql का उपयोग करके मैं डेटाबेस में स्थापित एक्सटेंशन को कैसे सूचीबद्ध करूं?

  3. त्रुटि:डोकर में अल्पाइन पर psycopg2 स्थापित करते समय pg_config निष्पादन योग्य नहीं मिला

  4. [वीडियो] PostgreSQL में अनुक्रमण की शक्ति

  5. मैं एक फ़ाइल की प्रतिलिपि बनाने की कोशिश कर रहा हूँ, लेकिन त्रुटि संदेश मिल रहा है