tam saklı yordam kodu nasıl görüntülenir?


111

Saklanan bir yordamı / işlevi nasıl görüntülersiniz?

Diyelim ki orijinal tanımı olmayan eski bir fonksiyonum var - pg / psql'de ne yaptığını görmek istiyorum ama bunu yapmanın bir yolunu bulamıyorum.

Postgres 8.4.1 sürümünü kullanarak

Yanıtlar:


19

saklanan yordamlarınızın kaynağını almak için pgAdmin kullanın veya pg_proc kullanın. pgAdmin de aynısını yapar.


3
pg_proc işte bu! Pg_procedure ... diye adlandırmayarak birkaç baytlık alanı kurtardıklarına sevindim. :)
darren

14
Psql'yi --echo-hidden parametresiyle başlatarak, psql'nin bu bilgiyi almak için (örneğin \ df komutu için) hangi sorguları kullandığını bulmak oldukça kolaydır. Bu, dahili olarak kullanılan tüm sorguları gösterecektir. pg_proc tam bir CREATE FUNCTION deyimi saklamaz. Kaynağın tamamını geri almak için pg_get_functiondef () kullanabilirsiniz.
a_horse_with_no_name

5
bu tablonun nerede olduğu konusunda kafası karışmış bir durumda: pg_catalog -> sistem tablosu -> pg_proc
Dimitris

242

\df+ <function_name>içinde psql'in .


6
Bunu güzelce yazdırmanın bir yolu var mı? Sormamın nedeni, bunun onu okunamaz hale getirmesi.
12hys

3
Bu benim için oldukça basılmış. Bunu psql'de etkileşimli olarak yapıyorsanız ve satırların kaydırılıp çağrı cihazının devreye girmesi durumunda, kaydırılmış satırları '-S' ('less' komut satırı arg ile aynıdır) yazarak açıp kapatabileceğinizi ve ardından kaydırmak için ok tuşlarını kullanın. etrafında.
Jonathan Hartley

10
Okunaklılık için, işlev tanımını görüntülemeden önce \x psql meta komutunu kullanabilirsiniz . \xuzun dizeli kayıtları içeren sorgu sonuçlarını görüntülemek için de kullanışlıdır.
Yahni

149

\ef <function_name>psql olarak. Düzenlenebilir metin ile tüm işlevi verecektir.


2
Kesin cevap. Bu, düzenleyicide işlev tanımını açacaktır.
Ponnusamy K

2
Bu en iyi cevap! Fonksiyonun tanımını okunabilir bir şekilde gösterir.
faramka

3
; <enter>Arabelleği çalıştırmak için sonra yazmayı unutmayın .
redolent

4
ERROR: more than one function named
Brian Haak

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

Bu, işlev işleyicisine işlevi nasıl çağıracağını söyler. Bu, yorumlanan diller için işlevin gerçek kaynak kodu, bir bağlantı sembolü, bir dosya adı veya uygulama diline / çağrı kuralına bağlı olarak hemen hemen her şey olabilir.


Bu kullanışlı. Çıktının güzel yazdırılmasının bir yolu var mı?
Setjmp

Bu yararlıdır çünkü gerektirmez psql. İşlev adlarının küçültülmüş göründüğünü unutmayın.
Seamus Abshere

@Maxim, dönüş türünü ve giriş argümanlarını nasıl tespit edeceğinizi biliyor musunuz?
Fivell

@Fivell, sadece arg isimlerin değil, tipleri için: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Bu en azından Sf 9.6'da. Türün sayısal kodunu özellik aracılığıyla alabilirsiniz proargtypes, ancak bunu ad olarak almak için başka bir tabloyla katılmanız gerekir.
Thalis K.


10

Katalog tablolarını nasıl hızlı bir şekilde sorgulayacağını ve pg_get_functiondef()işlevi nasıl kullanacağını merak eden biri varsa, işte örnek sorgu:

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 (), kullanıcı tanımlı toplama işlevlerini işlemiyor gibi görünüyor. HATA aldığımda: "histogram" bir UDA'yı sorguladığımda toplu bir işlevdir
Tim Child

2
[42809] HATA: "dizi_agg" toplu bir işlevdir
Daniel L. VanDenBosch

1
@ DanielL.VanDenBosch düzeltildi (sadece toplama işlevlerini hariç tutmak için)
msciwoj

Hayatımı kurtardınız ... pg_get_functiondef () tanımında belirli bir kelimeye sahip prosedürleri bulmak için kullanılabilirpg_get_functiondef(p.oid) ilike '%indicator_loss%'
Sıfır

0

Sisteminizde yapılandırdıysanız phpPgAdmin ile de alabilirsiniz,

Adım 1: Veritabanınızı seçin

Adım 2: Bul düğmesine tıklayın

Adım 3: Arama seçeneğini işlevlere değiştirin ve ardından Bul'a tıklayın.

Tanımlanmış işlevlerin listesini alacaksınız. İşlevleri isme göre de arayabilirsiniz, bu cevabın başkalarına yardımcı olacağını umabilirsiniz.


-1

Depolanan yordamda / işlevlerde yazılan tam kodu (sorgu) görmek için aşağıdaki Komutu kullanın:

sp_helptext procedure/function_name

işlev adı ve prosedür adı için 'dbo' önekini eklemeyin. veya "sys".

yordamın veya işlev adının sonuna parantez eklemeyin ve parametreleri de iletmeyin.

sp_helptext anahtar sözcüğünü kullanın ve ardından yalnızca prosedür / işlev adını iletin.

Prosedür için yazılmış tam kodu görmek için aşağıdaki komutu kullanın:

sp_helptext ProcedureName

işlev için yazılmış tam kodu görmek için aşağıdaki komutu kullanın:

sp_helptext FunctionName

sp_helptextPostgresql'de yok .
GSerg

-2

Normalde , pgAdmin gibi bir DB yöneticisi uygulaması kullanırsınız , ilgilendiğiniz nesneye göz atarsınız ve "oluşturma olarak komut dosyası" veya benzeri yolunuzu sağ tıklatırsınız.

Bunu bir yönetim uygulaması olmadan mı yapmaya çalışıyorsunuz?


2
Yalnızca komut satırı - yönetim uygulaması yok. PgAdmin bunu yapabiliyorsa, bir tür komut kullanıyor olmalı - bununla ilgili herhangi bir belge bulamıyorum. Pg_ * tablolarına bakıyorum ama hiçbiri öne çıkmıyor.
darren

Bir cevap bulduğunuza sevindim, ama hayatı kendiniz için neden zorlaştırdığınızdan emin değilim! Neden pgAdmin'i yüklemiyorsunuz?
annakata

7
Bir ssh oturumunda uzaktan bir db'ye bağlanırken, bir yönetim uygulamasını çalıştırmak kolay değildir.
jutky
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.