完全なストアドプロシージャコードを表示する方法


111

ストアドプロシージャ/関数をどのように表示しますか?

元の定義のない古い関数があるとしましょう-pg / psqlでそれが何をしているのかを見たいのですが、それを行う方法を理解できていないようです。

Postgresバージョン8.4.1の使用

回答:


19

pgAdminまたはpg_procを使用して、ストアドプロシージャのソースを取得します。pgAdminも同様です。


3
pg_procで終わりです!pg_procedure ... geezと呼ばないことで、数バイトのスペースを節約できてうれしいです。:)
ダレン

14
--echo-hiddenパラメータを指定してpsqlを起動することにより、psqlがその情報を取得するために使用しているクエリ(\ dfコマンドなど)を簡単に見つけることができます。これにより、内部で使用されるすべてのクエリが表示されます。pg_procは完全なCREATE FUNCTIONステートメントを格納しません。pg_get_functiondef()を使用して完全なソースを取得できます。
a_horse_with_no_name 2010

5
テーブルがどこにあるかについて誰かが混乱している場合に備えて:pg_catalog-> system table-> pg_proc
Dimitris

242

\df+ <function_name>中にはpsql


6
これをきれいに印刷する方法はありますか?私が尋ねる理由は、これにより読みにくくなるためです。
12hy 2012

3
これはかなり印刷されています。これをpsqlでインタラクティブに実行し、行が折り返されてページャーが起動する場合は、「-S」(「less」コマンドライン引数と同じ)を入力して折り返された行をオフに切り替え、矢印キーを使用してスクロールできます周り。
ジョナサンハートレイ

10
読みやすくするために、関数定義を表示する前に\x psqlメタコマンドを使用できます。\xまた、長い文字列を含むレコードを含むクエリ結果を表示する場合にも役立ちます。
2015

149

\ef <function_name>psqlで。関数全体に編集可能なテキストを提供します。


2
正確な答え。これにより、関数定義がエディターで開きます。
Ponnusamy K

2
これが一番の答えです!関数の定義を読みやすく表示します。
faramka 2016年

3
; <enter>バッファを実行するために後でタイプすることを忘れないでください。
'06

4
ERROR: more than one function named
Brian Haak、2017年

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

これは、関数を呼び出す方法を関数ハンドラーに伝えます。実装言語/呼び出し規約に応じて、インタープリター型言語の実際の関数のソースコード、リンクシンボル、ファイル名など、さまざまなことが考えられます。


これは便利です。出力をきれいに印刷する方法はありますか?
Setjmp

必要ないので便利ですpsql。関数名は小文字に見えることに注意してください。
Seamus Abshere 14

@Maxim、戻り値の型と入力引数を検出する方法を知っていますか?
Fivell 2014年

@Fivell、単に引数名、ないタイプのために:SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'。これは少なくともPg 9.6では。プロパティを介してタイプの数値コードを取得できますが、proargtypesこれを名前として取得するには、他のテーブルと結合する必要があります。
Thalis K.


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()はユーザー定義の集約関数を処理しないようです。エラーが表示されると、UDAをクエリすると "histogram"が集約関数になります
Tim Child

2
[42809]エラー:「ar​​ray_agg」は集約関数です
Daniel L. VanDenBosch

1
@ DanielL.VanDenBoschが修正されました(単に集計関数を除外するため)
msciwoj 2018

あなたは私の命を救った... pg_get_functiondef()を使用して、定義に特定の単語が含まれるプロシージャを検索できますpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero

0

システムで設定されている場合は、phpPgAdminを使用して取得することもできます。

ステップ1:データベースを選択する

ステップ2:検索ボタンをクリックします

ステップ3:検索オプションを関数に変更し、[検索]をクリックします。

定義された関数のリストが表示されます。関数を名前で検索することもできます。この答えが他の人の役に立つことを願っています。


-1

ストアドプロシージャ/関数で記述された完全なコード(クエリ)を表示するには、以下のコマンドを使用します。

sp_helptext procedure/function_name

関数名とプロシージャ名に接頭辞「dbo」を追加しないでください。または「sys。」。

プロシージャまたは関数名の最後に角かっこを追加しないでください。また、パラメータを渡さないでください。

sp_helptextキーワードを使用して、プロシージャ/関数名を渡します。

以下のコマンドを使用して、手順用に作成された完全なコードを確認します。

sp_helptext ProcedureName

以下のコマンドを使用して、関数用に作成された完全なコードを確認します。

sp_helptext FunctionName

sp_helptextpostgresqlにはありません。
GSerg

-2

通常は、pgAdminなどのDBマネージャーアプリケーションを使用し、関心のあるオブジェクトを参照して、右クリックして「スクリプトを作成」または類似のものに移動します。

あなたはこれをしようとしています...管理アプリなしで?


2
コマンドラインだけ-管理アプリはありません。pgAdminがそれを実行できる場合は、なんらかのコマンドを使用する必要があります-それに関するドキュメントは見つかりません。pg_ *テーブルを調べていますが、目立つものはありません。
ダレン

あなたが答えを見つけてうれしいが、なぜあなたが自分のために人生を困難にしているのかわからない!なぜpgAdminをインストールしないのですか?
アナカタ

7
sshセッションでリモートからデータベースに接続する場合、管理アプリを実行するのは簡単ではありません。
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.