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

PostgreSQL में एक तालिका को संदर्भित करने वाली सभी संग्रहीत प्रक्रियाओं को सूचीबद्ध करने के 3 तरीके

यहां पोस्टग्रेएसक्यूएल में एक विशिष्ट तालिका का संदर्भ देने वाली संग्रहीत कार्यविधियों की सूची लौटाने के तीन उदाहरण दिए गए हैं।

information_schema.routines देखें

हम information_schema.routines . को क्वेरी कर सकते हैं यह देखने के लिए देखें कि क्या किसी परिभाषा में तालिका का नाम है।

उदाहरण:

SELECT
    routine_name,
    routine_body,
    routine_definition
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE'
AND routine_schema = 'public'
AND routine_definition ILIKE '%artists%';

इस उदाहरण में, मैंने यह देखने के लिए जाँच की कि क्या किसी संग्रहीत कार्यविधि में artists . टेक्स्ट है या नहीं उनकी परिभाषा में।

ILIKE ऑपरेटर सक्रिय स्थान के अनुसार मैच को केस-असंवेदनशील बनाता है। यह एक PostgreSQL एक्सटेंशन है, और यह SQL मानक का हिस्सा नहीं है। केस संवेदी मिलान के लिए, LIKE . का उपयोग करें ।

ध्यान दें कि यह सही नहीं है, इस अर्थ में कि यदि पाठ प्रक्रिया में है, तो यह झूठी सकारात्मकता लौटा सकता है, लेकिन यह एक तालिका नहीं है। इस जोखिम को कम करने के लिए, आप शायद फ़िल्टर मानदंड परिशोधित कर सकते हैं।

pg_proc कैटलॉग

pg_catalog.pg_proc कैटलॉग फ़ंक्शंस, प्रक्रियाओं, कुल फ़ंक्शंस और विंडो फ़ंक्शंस के बारे में जानकारी संग्रहीत करता है। इसलिए हम इस तरह से क्वेरी कर सकते हैं:

SELECT 
    n.nspname AS schema_name,
    p.proname AS function_name,
    pg_get_function_arguments(p.oid) AS arguments,
    p.prosrc AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';

इस मामले में, हम pg_catalog.pg_namespace . के साथ कैटलॉग में शामिल होते हैं केवल public . के साथ परिणामों को फ़िल्टर करने के लिए कैटलॉग नाम स्थान।

हम वैकल्पिक रूप से pg_get_functiondef() . का उपयोग कर सकते हैं परिभाषा प्राप्त करने के लिए कार्य करें। यह फ़ंक्शन वास्तव में संग्रहीत कार्यविधि के लिए निर्माण आदेश का पुनर्निर्माण करता है। यह एक विघटित पुनर्निर्माण है, न कि आदेश का मूल पाठ। इसके परिणामस्वरूप CREATE OR REPLACE PROCEDURE संग्रहीत कार्यविधि के लिए कथन।

उदाहरण:

SELECT 
    n.nspname AS schema_name,
    p.proname AS function_name,
    pg_get_function_arguments(p.oid) AS arguments,
    pg_get_functiondef(p.oid) AS definition
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE p.prokind = 'p'
AND n.nspname = 'public'
AND p.prosrc ILIKE '%artists%';

तालिका को संदर्भित करने वाली विशिष्ट पंक्ति प्राप्त करें

तालिका को संदर्भित करने वाली पंक्ति संख्या को शामिल करने के लिए हम अपनी क्वेरी को संशोधित कर सकते हैं:

SELECT *
FROM (
    SELECT 
        proname AS stored_procedure, 
        row_number() OVER (partition by proname) AS line_number, 
        textline
    FROM (
        SELECT 
            proname, 
            unnest(string_to_array(prosrc, chr(10))) AS textline
        FROM pg_proc p
        JOIN pg_namespace n ON n.oid = p.pronamespace
        WHERE nspname = 'public'
        AND prosrc ILIKE '%artists%'
        ) lines
    ) x
WHERE textline ILIKE '%artists%';

यह उदाहरण क्लिन के स्टैक ओवरफ़्लो उत्तर पर आधारित है।


  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. मैं नोड-पोस्टग्रेज के साथ पीजी में कई पंक्तियों को ठीक से कैसे सम्मिलित करूं?

  3. कैसे Atan2d () PostgreSQL में काम करता है

  4. एक दूषित TOAST तालिका को ठीक करना

  5. #या को दिया गया संबंध संरचनात्मक रूप से संगत होना चाहिए। असंगत मान:[:संदर्भ]