Bagaimana cara menampilkan fungsi, prosedur, memicu kode sumber di postgresql?

168

Bagaimana cara mencetak fungsi dan memicu kode sumber di postgresql? tolong beri tahu saya jika ada yang tahu kueri untuk menampilkan fungsi, memicu kode sumber.

Ganesh
sumber
11
sebagai catatan untuk pengikut yang datang ke sini mencoba mencari cara untuk mendaftar semua pemicu, select * from pg_trigger;atau, jika Anda juga ingin melihat tabel mana yang masing-masing pemicu berlaku untuk select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Jawaban:

152

\df+di psql memberi Anda kode sumber.

Mateusz Grotek
sumber
17
Bagus :) Saya sarankan menggunakan \dfuntuk menemukan nama fungsi Anda, kemudian \xuntuk output diperluas, lalu\df+ name_of_function
Sam Watkins
33
\ df + menghasilkan lebih banyak daripada kode. Jika semua yang Anda inginkan adalah kode, \ sf akan melakukan trik!
Telic
Bagaimana cara melihat fungsi EXTENSION yang diinstal? Contoh saya menggunakan ltree , tetapi tidak ada respons dengan \df ltxtquery.
Peter Krauss
\x ONadalah suatu keharusan untuk tampilan transpos
andilab
130

Untuk fungsi:

Anda dapat meminta tampilan pg_proc, seperti berikut ini

select proname,prosrc from pg_proc where proname= your_function_name; 

Cara lain adalah hanya menjalankan commont \dfdan \efyang dapat membuat daftar fungsi.

skytf=> \df           
                                             List of functions
 Schema |         Name         | Result data type |              Argument data types               |  Type  
--------+----------------------+------------------+------------------------------------------------+--------
 public | pg_buffercache_pages | SETOF record     |                                                | normal


skytf=> \ef  pg_buffercache_pages

Ini akan menampilkan kode sumber fungsi.

Untuk pemicu:

Saya tidak tahu apakah ada cara langsung untuk mendapatkan kode sumber. Ketahuilah cara berikut ini, mungkin itu akan membantu Anda!

  • langkah 1: Dapatkan tabel oid dari pelatuk:
    skytf => pilih tgrelid dari pg_trigger mana tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 baris)
  • langkah 2: Dapatkan nama tabel dari oid di atas!
    skytf => pilih oid, relname dari pg_class di mana oid = 26599;
      oid | relname           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 baris)
  • langkah 3: daftar informasi tabel
    skytf => \ d tbl_tmp

Ini akan menunjukkan kepada Anda detail dari pemicu tabel. Biasanya pemicu menggunakan fungsi. Jadi Anda bisa mendapatkan kode sumber fungsi pemicu seperti yang saya tunjukkan di atas!

franc
sumber
38

Berikut adalah beberapa contoh dari PostgreSQL-9.5

Daftar tampilan:

  1. Fungsi: \df+
  2. Pemicu: \dy+

Definisi tampilan:

postgres=# \sf
function name is required

postgres=# \sf pg_reload_conf()
CREATE OR REPLACE FUNCTION pg_catalog.pg_reload_conf()
 RETURNS boolean
 LANGUAGE internal
 STRICT
AS $function$pg_reload_conf$function$

postgres=# \sf pg_encoding_to_char
CREATE OR REPLACE FUNCTION pg_catalog.pg_encoding_to_char(integer)
 RETURNS name
 LANGUAGE internal
 STABLE STRICT
AS $function$PG_encoding_to_char$function$
Sathish
sumber
7
Menggunakan \xpertama untuk mengaktifkan tampilan yang diperluas juga membantu keterbacaan.
Kantong dan
26

Ada banyak kemungkinan. Cara paling sederhana adalah dengan hanya menggunakan pgAdmin dan dapatkan ini dari jendela SQL. Namun jika Anda ingin mendapatkan ini secara programatik maka periksa pg_procdan pg_triggerkatalog sistem atau routinesdantriggers pandangan dari skema informasi (itu cara standar SQL, tetapi mungkin tidak mencakup semua fitur terutama PostgreSQL-spesifik). Sebagai contoh:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';
Grzegorz Szpetkowski
sumber
3
Mmmm .. Saya memiliki fungsi PGPSQL, yang memiliki rutin_defintion kosong, dan menyatakan 'EXTERNAL' di bidang routine_body. Ada petunjuk di mana saya dapat menemukan itu?
alfonx
2
+1 Ini adalah solusi yang lebih standar / portabel. Untuk tampilan SQL adalah:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta
Tetapi bagaimana dengan kasus di mana nama fungsi tidak unik karena seseorang membuat fungsi dengan nama yang sama dan argumen fungsi yang berbeda? stackoverflow.com/questions/47341513/…
mg1075
@alfonx lihat pgproc.prosrckolom
Tomáš Záluský
12

Sedikit lebih dari sekadar menampilkan fungsi, tetapi juga tentang bagaimana mendapatkan fasilitas edit di tempat.

\ef <function_name>sangat berguna. Ini akan membuka kode sumber fungsi dalam format yang dapat diedit. Anda tidak hanya dapat melihatnya, Anda juga dapat mengedit dan menjalankannya.

Hanya \ef tanpa function_name akan membuka template CREATE FUNCTION yang dapat diedit.

Untuk referensi lebih lanjut -> https://www.postgresql.org/docs/9.6/static/app-psql.html

pembuat kode mitos
sumber
11

\sf function_name di psql menghasilkan kode sumber yang dapat diedit dari fungsi tunggal.

Dari https://www.postgresql.org/docs/9.6/static/app-psql.html :

\ sf [+] function_description Perintah ini mengambil dan menunjukkan definisi dari fungsi yang dinamai, dalam bentuk perintah CREATE ATAU REPLACE FUNGSI.

Jika + ditambahkan ke nama perintah, maka baris output diberi nomor, dengan baris pertama dari badan fungsi menjadi baris 1.

Sergey Tarasov
sumber
memperlihatkan kode sumber suatu fungsi. \ nama fungsi membukanya dalam templet yang dapat diedit
amar
0

Sejak Versi: psql (9.6.17, server 11.6)

Saya sudah mencoba semua jawaban di atas tetapi untuk saya

postgres=> \sf jsonb_extract_path_text
CREATE OR REPLACE FUNCTION pg_catalog.jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])
 RETURNS text
 LANGUAGE internal
 IMMUTABLE PARALLEL SAFE STRICT
AS $function$jsonb_extract_path_text$function$



postgres=> \df+
ERROR:  column p.proisagg does not exist
LINE 6:   WHEN p.proisagg THEN 'agg'
               ^
HINT:  Perhaps you meant to reference the column "p.prolang".

df sepertinya tidak bekerja untuk saya.

Ravi Parekh
sumber