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.