पूर्ण संग्रहीत कार्यविधि कोड कैसे प्रदर्शित करें?


111

आप एक संग्रहीत कार्यविधि / कार्य कैसे देखते हैं?

मान लीजिए कि मूल परिभाषा के बिना मेरा एक पुराना कार्य है - मैं यह देखना चाहता हूं कि यह pg / psql में क्या कर रहा है, लेकिन मैं ऐसा करने का तरीका नहीं जान सकता।

Postgres संस्करण 8.4.1 का उपयोग करना

जवाबों:


19

pgAdmin का उपयोग करें या अपनी संग्रहीत प्रक्रियाओं के स्रोत को प्राप्त करने के लिए pg_proc का उपयोग करें। pgAdmin वही करता है।


3
pg_proc यही है! वाह मुझे खुशी है कि उन्होंने इसे pg_procedure ... geez न कहकर अंतरिक्ष के कुछ बाइट्स को बचाया। :)
darren

14
यह पता लगाना बहुत आसान है कि psql किस प्रश्न का उपयोग कर रहा है (जैसे कि \ df कमांड के लिए) --echo- छिपे हुए पैरामीटर के साथ psql शुरू करके। यह उन सभी प्रश्नों को दिखाएगा जो आंतरिक रूप से उपयोग किए जाते हैं। pg_proc एक पूर्ण सृजन कथन संग्रहीत नहीं करता है। आप पूर्ण स्रोत को पुनः प्राप्त करने के लिए pg_get_functiondef () का उपयोग कर सकते हैं।
a_horse_with_no_name

5
pg_catalog -> प्रणाली तालिका -> pg_proc: सिर्फ मामले में किसी को भी, जहां कि तालिका है के रूप में उलझन में है
दिमित्रिस

242

\df+ <function_name>में psql


6
वहाँ सुंदर यह मुद्रित करने के लिए एक रास्ता है? मेरे पूछने का कारण यह है क्योंकि यह इसे अपठनीय बनाता है।
12hys

3
यह मेरे लिए बहुत छपी है। याद रखें कि यदि आप psql में यह अंतःक्रियात्मक रूप से कर रहे हैं और लाइनें लिपटी हुई हैं और पेजर किक करता है, तो आप '-S' टाइप करके लिपटी हुई लाइनों को बंद कर सकते हैं (उसी तरह 'कम' कमांड लाइन arg), तो स्क्रॉल करने के लिए तीर कुंजियों का उपयोग करें चारों ओर।
जोनाथन हार्टले

10
सुस्पष्टता के लिए, आप फ़ंक्शन परिभाषा प्रदर्शित करने से पहले \x psql मेटा-कमांड का उपयोग कर सकते हैं । \xलंबी स्ट्रिंग्स के साथ रिकॉर्ड वाले क्वेरी परिणामों को देखने के लिए भी उपयोगी है।
स्टू

149

\ef <function_name>psql में। यह संपादन योग्य पाठ के साथ पूरे फ़ंक्शन देगा।


2
सटीक उत्तर। यह संपादक में फ़ंक्शन परिभाषा खोलेगा।
पोन्नुसामी के

2
यह सबसे अच्छा जवाब है! यह पठनीय तरीके से फ़ंक्शन की परिभाषा दिखाता है।
फ़रमाका

3
; <enter>बफर निष्पादित करने के बाद टाइप करना न भूलें ।
redolent

4
ERROR: more than one function named
ब्रायन हाक

59
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

यह फ़ंक्शन हैंडलर को फ़ंक्शन को लागू करने का तरीका बताता है। यह कार्यान्वित भाषा / कॉल कन्वेंशन के आधार पर व्याख्या की गई भाषाओं के लिए फ़ंक्शन का वास्तविक स्रोत कोड हो सकता है, एक लिंक प्रतीक, एक फ़ाइल का नाम, या कुछ और भी हो सकता है


यह उपयोगी है। वहाँ एक तरीका है कि उत्पादन बहुत मुद्रित है?
सेटजम्प

यह उपयोगी है क्योंकि इसकी आवश्यकता नहीं है psql। ध्यान दें कि फ़ंक्शन नाम डाउनकेड होने लगते हैं।
सीमस एब्स

@ मैक्सिम, क्या आप जानते हैं कि रिटर्न प्रकार और इनपुट तर्कों का पता कैसे लगाया जाता है?
फाइव

@Fivell, केवल arg नामों के लिए, न कि प्रकार SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%':। यह कम से कम Pg 9.6 पर। आप संपत्ति के माध्यम से प्रकार का संख्यात्मक कोड प्राप्त कर सकते हैं proargtypes, लेकिन आपको इसे नाम के रूप में प्राप्त करने के लिए किसी अन्य तालिका के साथ जुड़ना होगा।
थलिस के।


10

अगर किसी को आश्चर्य है कि कैसे कैटलॉग तालिकाओं को जल्दी से क्वेरी करें और pg_get_functiondef()यहां फ़ंक्शन का उपयोग नमूना क्वेरी करें:

SELECT n.nspname AS schema
      ,proname AS fname
      ,proargnames AS args
      ,t.typname AS return_type
      ,d.description
      ,pg_get_functiondef(p.oid) as definition
--      ,CASE WHEN NOT p.proisagg THEN pg_get_functiondef(p.oid)
--            ELSE 'pg_get_functiondef() can''t be used with aggregate functions'
--       END as definition
  FROM pg_proc p
  JOIN pg_type t
    ON p.prorettype = t.oid
  LEFT OUTER
  JOIN pg_description d
    ON p.oid = d.objoid
  LEFT OUTER
  JOIN pg_namespace n
    ON n.oid = p.pronamespace
 WHERE NOT p.proisagg
   AND n.nspname~'<$SCHEMA_NAME_PATTERN>'
   AND proname~'<$FUNCTION_NAME_PATTERN>'

pg_get_functiondef () लगता है कि उपयोगकर्ता परिभाषित कुल कार्यों को संभालना नहीं है। जब मुझे ERROR मिलता है: "Histogram" एक समग्र कार्य होता है जब मैं एक UDA
टिम चाइल्ड

2
[४२ [० ९] ERROR: "array_agg" एक समग्र कार्य है
डैनियल एल। वनडेनबॉश ५'१ch

1
@ DanielL.VanDenBosch ने सही किया (कुल कार्यों को केवल बाहर करने के लिए)
msciwoj

आपने मेरी जान बचाई ... pg_get_functiondef () का इस्तेमाल परिभाषा में विशिष्ट शब्द के साथ procs को खोजने के लिए किया जा सकता हैpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero

0

यदि आप इसे अपने सिस्टम में कॉन्फ़िगर कर रहे हैं, तो आप phpPgAdmin से भी प्राप्त कर सकते हैं,

चरण 1: अपने डेटाबेस का चयन करें

स्टेप 2: फाइंड बटन पर क्लिक करें

चरण 3: खोज विकल्प को फ़ंक्शंस में बदलें फिर फाइंड पर क्लिक करें।

आपको परिभाषित कार्यों की सूची मिल जाएगी। आप कार्यों को नाम से भी खोज सकते हैं, आशा है कि यह उत्तर दूसरों की मदद करेगा।


-1

संग्रहीत कार्यविधि / कार्यों में लिखे गए पूर्ण कोड (क्वेरी) को देखने के लिए, कमांड के नीचे उपयोग करें:

sp_helptext procedure/function_name

फ़ंक्शन नाम और प्रक्रिया नाम के लिए उपसर्ग 'dbo' न जोड़ें। या 'सिस।'

प्रक्रिया या फ़ंक्शन नाम के अंत में कोष्ठक न जोड़ें और पैरामीटर भी पास न करें।

sp_helptext कीवर्ड का उपयोग करें और फिर प्रक्रिया / फ़ंक्शन नाम को पास करें।

प्रक्रिया के लिए लिखे गए पूर्ण कोड को देखने के लिए कमांड का उपयोग करें:

sp_helptext ProcedureName

फ़ंक्शन के लिए लिखा गया पूर्ण कोड देखने के लिए नीचे दिए गए आदेश का उपयोग करें:

sp_helptext FunctionName

sp_helptextPostgresql में कोई भी नहीं है।
GSerg

-2

सामान्यतया आप pgAdmin जैसे DB प्रबंधक एप्लिकेशन का उपयोग करते हैं , उस वस्तु को ब्राउज़ करें जिसमें आप रुचि रखते हैं, और "स्क्रिप्ट बनाने के लिए अपना रास्ता" या समान क्लिक करें।

क्या आप ऐसा करने की कोशिश कर रहे हैं ... बिना प्रबंधन ऐप के?


2
सिर्फ कमांड लाइन - कोई प्रबंधन ऐप नहीं। यदि pgAdmin कर सकता है, तो उसे किसी प्रकार की कमांड का उपयोग करना होगा - मुझे इसके बारे में कोई दस्तावेज नहीं मिल सकता है। मैं pg_ * तालिकाओं के माध्यम से देख रहा हूं, लेकिन कोई भी बाहर खड़ा नहीं होता है।
डारेन

खुशी है कि आपको एक उत्तर मिला, लेकिन यह निश्चित नहीं है कि आप अपने लिए जीवन कठिन क्यों बना रहे हैं! क्यों नहीं बस pgAdmin स्थापित करें?
अन्नकूट

7
जब sb सत्र में दूरस्थ रूप से db से कनेक्ट होता है, तो प्रबंधन ऐप चलाना आसान नहीं होता है।
जूटकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.