यहां पोस्टग्रेएसक्यूएल में एक विशिष्ट तालिका का संदर्भ देने वाली संग्रहीत कार्यविधियों की सूची लौटाने के तीन उदाहरण दिए गए हैं।
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%';
यह उदाहरण क्लिन के स्टैक ओवरफ़्लो उत्तर पर आधारित है।