Postgresql'de fonksiyon, prosedür, kaynak kodu nasıl görüntülenir?


168

Postgresql'de fonksiyonlar nasıl yazdırılır ve kaynak kodu tetiklenir? fonksiyonu görüntülemek için herhangi bir sorgu biliyorum, lütfen bana bildirin, kaynak kodunu tetikler.


11
buraya gelen takipçiler için bir not olarak tüm tetikleyicilerin nasıl listelendiğini anlamaya çalışıyor, select * from pg_trigger;ya da, her bir tetikleyicinin select tgrelid::regclass, tgname from pg_trigger;FWIW ` için hangi tablonun geçerli olduğunu görmek istiyorsanız
rogerdpack

Yanıtlar:


152

\df+içinde psql'in size sourcecode verir.


17
Güzel bir :) Ben \dffonksiyonunuzun adını bulmak için kullanmanızı öneririz , sonra \xgenişletilmiş çıktı için, o zaman\df+ name_of_function
Sam Watkins

33
\ df + koddan çok daha fazla çıktı verir. İstediğiniz kod ise, \ sf hile yapacak!
Telic

Kurulu bir UZATMA işlevini nasıl görebilirim ? Örnek Ben ltree kullanıyorum , ancak bir yanıt yok \df ltxtquery.
Peter Krauss

\x ONtranspoze ekran için bir zorunluluktur
andilabs

130

Fonksiyon için:

pg_proc görünümünü aşağıdaki gibi sorgulayabilirsiniz

select proname,prosrc from pg_proc where proname= your_function_name; 

Başka bir yöntem de commont yürütmek olduğunu \dfve \efhangi işlevleri listeleyebilirsiniz.

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

Fonksiyonun kaynak kodunu gösterecektir.

Tetikleyiciler için:

Kaynak kodunu almak için doğrudan bir yol olup olmadığını bilmiyorum. Sadece aşağıdaki yolu bilin, belki size yardımcı olacaktır!

  • 1. adım: Tetiğin tablo değerini alın:
    skytf => pg_trigger'dan tgrelid'i seçin; burada tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 satır)
  • adim 2: Yukarıdaki oid'in tablo adını alın!
    skytf => oid seçin, pg_class dosyasından relname; oid = 26599;
      oid | relname           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 satır)
  • 3.Adım: Tablo bilgilerini listeleyin
    skytf => \ d Instagram Hesabındaki Resim ve Videoları tbl_tmp

Tablonun tetikleyicisinin ayrıntılarını gösterecektir. Genellikle bir tetikleyici bir işlev kullanır. Böylece tetik işlevinin kaynak kodunu yukarıda belirttiğim gibi alabilirsiniz!


38

İşte PostgreSQL-9.5'ten birkaç örnek

Ekran listesi:

  1. Fonksiyonlar: \df+
  2. Tetikleyiciler: \dy+

Ekran Tanımı:

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$

7
\xGenişletilmiş ekranı açmak için ilk önce kullanmak da okunabilirliğe yardımcı olur.
Ceplerve

26

Birçok olasılık var. En basit yol sadece pgAdmin kullanmak ve bunu SQL penceresinden almaktır. Eğer irdelemek programlı sonra bu almak istiyorsanız Ancak pg_procve pg_triggersistem katalogları veya routinesve triggersbilgi şemadan görüşlerini (en standart bir yol SQL olduğunu, ama hepsi özellikle PostgreSQL-özgü özellikleri örtmeyebilir). Örneğin:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';

3
Mmmm .. Ben boş bir rutin_defintion ve routine_body alanında 'EXTERNAL' olan PGPSQL fonksiyonları var. Bunları bulabileceğim herhangi bir ipucu?
alfonx

2
+1 Bu daha standart / taşınabilir bir çözümdür. Görünümler için SQL:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta

Ancak, bir işlev adının benzersiz olmadığı durumda, çünkü biri aynı ad ve farklı işlev bağımsız değişkenleriyle işlevler yaptı mı? stackoverflow.com/questions/47341513/…
mg1075

@alfonx bkz. pgproc.prosrcsütun
Tomáš Záluský

12

Sadece işlevi görüntülemekten biraz daha fazlası, yerinde düzenleme özelliğini de almaya ne dersiniz.

\ef <function_name>çok kullanışlıdır. İşlevin kaynak kodunu düzenlenebilir biçimde açar. Sadece görüntüleyemez, düzenleyebilir ve yürütebilirsiniz.

Sadece \effunction_name düzenlenebilir CREATE FUNCTION şablonunu açar.

Daha fazla referans için -> https://www.postgresql.org/docs/9.6/static/app-psql.html


11

\sf psql'deki işlev_adı, tek bir işlevin düzenlenebilir kaynak kodunu verir.

Gönderen https://www.postgresql.org/docs/9.6/static/app-psql.html :

\ sf [+] function_description Bu komut, adlandırılan işlevin tanımını CREATE OR REPLACE FUNCTION komutu şeklinde alır ve gösterir.

Komut adına + eklenirse, çıktı satırları numaralandırılır ve işlev gövdesinin ilk satırı 1. satır olur.


bir işlevin kaynak kodunu gösterir. \ ef işlev adı düzenlenebilir templet içinde açar
amar


0

Sürümden bu yana: psql (9.6.17, sunucu 11.6)

Yukarıdaki cevapların hepsini denedim ama benim için

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 benim için çalışmıyor gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.