bagaimana cara menampilkan kode prosedur tersimpan penuh?

111

Bagaimana Anda melihat prosedur / fungsi yang tersimpan?

Katakanlah saya memiliki fungsi lama tanpa definisi asli - Saya ingin melihat apa yang dilakukannya di pg / psql tetapi sepertinya saya tidak dapat menemukan cara untuk melakukannya.

menggunakan Postgres versi 8.4.1

sayang
sumber

Jawaban:

19

gunakan pgAdmin atau gunakan pg_proc untuk mendapatkan sumber prosedur tersimpan Anda. pgAdmin melakukan hal yang sama.

Frank Heikens
sumber
3
pg_proc itu dia! Wah saya senang mereka menghemat beberapa byte ruang dengan tidak menyebutnya pg_procedure ... ya ampun. :)
darren
14
Sangat mudah untuk mengetahui query mana yang digunakan psql untuk mengambil informasi tersebut (misalnya untuk perintah \ df) dengan memulai psql dengan parameter --echo-hidden. Itu akan menunjukkan semua kueri yang digunakan secara internal. pg_proc tidak menyimpan pernyataan CREATE FUNCTION lengkap. Anda bisa menggunakan pg_get_functiondef () untuk mengambil sumber lengkap.
a_horse_with_no_name
5
kalau-kalau ada yang bingung di mana tabel itu: pg_catalog -> tabel sistem -> pg_proc
Dimitris
242

\df+ <function_name>di psql .

Milen A. Radev
sumber
6
Apakah ada cara untuk mencetak ini? Alasan saya bertanya adalah karena ini membuatnya tidak bisa dibaca.
12hys
3
Ini dicetak dengan cantik, untuk saya. Ingat jika Anda melakukan ini secara interaktif dalam psql dan garis terbungkus dan pager masuk, maka Anda dapat mengalihkan garis yang dibungkus dengan mengetik '-S' (sama dengan 'less' command line arg), lalu gunakan tombol panah untuk menggulir sekitar.
Jonathan Hartley
10
Untuk keterbacaan, Anda dapat menggunakan \x perintah meta psql sebelum menampilkan definisi fungsi. \xjuga berguna untuk melihat hasil query yang berisi record dengan string panjang.
Rebus
149

\ef <function_name>di psql. Ini akan memberikan seluruh fungsi dengan teks yang dapat diedit.

Asha Koshti
sumber
2
Jawaban yang tepat. Ini akan membuka definisi fungsi di editor.
Ponnusamy K
2
Inilah jawaban terbaik! Ini menunjukkan definisi fungsi dengan cara yang dapat dibaca.
faramka
3
Jangan lupa untuk mengetik ; <enter>setelah menjalankan buffer.
harum
4
ERROR: more than one function named
Brian Haak
62
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

Ini memberitahu penangan fungsi bagaimana memanggil fungsi tersebut. Ini mungkin kode sumber sebenarnya dari fungsi untuk bahasa yang diinterpretasikan, simbol tautan, nama file, atau apa saja, tergantung pada bahasa implementasi / konvensi panggilan

Pepatah
sumber
Ini berguna. Apakah ada cara untuk mendapatkan hasil cetak yang cantik?
Setjmp
Ini berguna karena tidak membutuhkan psql. Perhatikan bahwa nama fungsi tampaknya diturunkan.
Seamus Abshere
@ Maxim, apakah Anda tahu cara mendeteksi tipe kembalian dan argumen input?
Fivell
@Fivell, hanya nama-nama arg, bukan jenis: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Ini setidaknya di Hal 9.6. Anda bisa mendapatkan kode numerik dari tipe melalui properti proargtypes, tetapi Anda harus bergabung dengan beberapa tabel lain untuk mendapatkan ini sebagai nama.
Thalis K.
16

Gunakan \dfuntuk mendaftar semua prosedur yang disimpan di Postgres.

Puneet Purohit
sumber
10

Jika ada yang bertanya-tanya bagaimana cara membuat kueri tabel katalog dengan cepat dan menggunakan pg_get_functiondef()fungsi berikut ini contoh kueri:

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>'
msciwoj
sumber
pg_get_functiondef () tampaknya tidak menangani fungsi agregat yang ditentukan pengguna. Saat saya mendapatkan ERROR: "histogram" adalah fungsi agregat ketika saya menanyakan UDA
Tim Child
2
[42809] KESALAHAN: "array_agg" adalah fungsi agregat
Daniel L. VanDenBosch
1
@ DanielL.VanDenBosch dikoreksi (untuk hanya mengecualikan fungsi agregat)
msciwoj
Anda menyelamatkan hidup saya ... pg_get_functiondef () dapat digunakan untuk menemukan procs dengan kata tertentu dalam definisipg_get_functiondef(p.oid) ilike '%indicator_loss%'
Nol
0

Anda juga bisa mendapatkan melalui phpPgAdmin jika Anda mengonfigurasinya di sistem Anda,

Langkah 1: Pilih database Anda

Langkah 2: Klik tombol temukan

Langkah 3: Ubah opsi pencarian ke fungsi lalu klik Temukan.

Anda akan mendapatkan daftar fungsi yang didefinisikan. Anda juga dapat mencari fungsi berdasarkan nama, semoga jawaban ini membantu orang lain.

Veeresh Digasangi
sumber
-1

Untuk melihat kode lengkap (query) yang ditulis dalam prosedur / fungsi yang tersimpan, Gunakan Perintah di bawah ini:

sp_helptext procedure/function_name

untuk nama fungsi dan nama prosedur jangan tambahkan awalan 'dbo.' atau 'sys.'.

jangan tambahkan tanda kurung di akhir prosedur atau nama fungsi dan juga jangan berikan parameter.

gunakan kata kunci sp_helptext dan kemudian teruskan nama prosedur / fungsi.

gunakan perintah di bawah ini untuk melihat kode lengkap yang ditulis untuk Prosedur:

sp_helptext ProcedureName

gunakan perintah di bawah ini untuk melihat kode lengkap yang ditulis untuk fungsi:

sp_helptext FunctionName
Developer_Suraj
sumber
Tidak ada sp_helptextdi postgresql.
GSerg
-2

Biasanya Anda akan menggunakan aplikasi pengelola DB seperti pgAdmin , telusuri objek yang Anda minati, dan klik kanan untuk "script as create" atau serupa.

Apakah Anda mencoba melakukan ini ... tanpa aplikasi manajemen?

annakata
sumber
2
Hanya baris perintah - tidak ada aplikasi manajemen. Jika pgAdmin dapat melakukannya, itu harus menggunakan semacam perintah - saya tidak dapat menemukan dokumentasi apa pun tentangnya. Saya melihat melalui tabel pg_ * tetapi tidak ada yang tampak menonjol.
darren
Senang Anda menemukan jawabannya, tetapi tidak yakin mengapa Anda mempersulit hidup Anda sendiri! Mengapa tidak menginstal pgAdmin saja?
annakata
7
Saat menghubungkan ke db dari jarak jauh dalam sesi ssh, tidak mudah menjalankan aplikasi manajemen.
Jutky