jak wyświetlić pełny kod procedury składowanej?

111

Jak wyświetlić procedurę / funkcję składowaną?

Powiedzmy, że mam starą funkcję bez oryginalnej definicji - chcę zobaczyć, co robi w pg / psql, ale nie mogę znaleźć sposobu, aby to zrobić.

używając Postgres w wersji 8.4.1

Darren
źródło

Odpowiedzi:

19

użyj pgAdmin lub użyj pg_proc, aby uzyskać źródło procedur składowanych. pgAdmin robi to samo.

Frank Heikens
źródło
3
pg_proc to wszystko! Uff, cieszę się, że zaoszczędzili kilka bajtów miejsca, nie nazywając go pg_procedure ... geez. :)
darren
14
Dość łatwo jest dowiedzieć się, jakich zapytań używa psql do pobierania tych informacji (np. Dla polecenia \ df), uruchamiając psql z parametrem --echo-hidden. Spowoduje to wyświetlenie wszystkich zapytań, które są używane wewnętrznie. pg_proc nie przechowuje pełnej instrukcji CREATE FUNCTION. Możesz użyć pg_get_functiondef (), aby pobrać kompletne źródło.
a_horse_with_no_name
5
na wypadek, gdyby ktoś był zdezorientowany, gdzie znajduje się ta tabela: pg_catalog -> tabela systemowa -> pg_proc
Dimitris
242

\df+ <function_name>w psql .

Milen A. Radev
źródło
6
Czy jest sposób, aby ładnie to wydrukować? Pytam, ponieważ to sprawia, że ​​jest nieczytelny.
12hys
3
Jak dla mnie jest to całkiem wydrukowane. Pamiętaj, jeśli robisz to interaktywnie w psql i wiersze są zawijane, a pager włącza się, możesz wyłączyć zawinięte wiersze, wpisując `` -S '' (tak samo jak `` mniej '' argument wiersza poleceń), a następnie użyj klawiszy strzałek do przewijania na około.
Jonathan Hartley
10
Aby zapewnić czytelność, przed wyświetleniem definicji funkcji można użyć \x meta-polecenia psql . \xjest również przydatny do przeglądania wyników zapytań zawierających rekordy z długimi ciągami.
Gulasz
149

\ef <function_name>w psql. Daje to całą funkcję z edytowalnym tekstem.

Asha Koshti
źródło
2
Dokładna odpowiedź. Spowoduje to otwarcie definicji funkcji w edytorze.
Ponnusamy K
2
To najlepsza odpowiedź! Pokazuje definicję funkcji w czytelny sposób.
faramka
3
Nie zapomnij wpisać ; <enter>after, aby wykonać bufor.
pachnący
4
ERROR: more than one function named
Brian Haak
62
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

Mówi to obsłudze funkcji, jak wywołać funkcję. Może to być rzeczywisty kod źródłowy funkcji dla języków interpretowanych, symbol łącza, nazwa pliku lub cokolwiek innego, w zależności od konwencji języka implementacji / wywołania

Maksyma
źródło
To jest przydatne. Czy istnieje sposób, aby wynik był ładnie wydrukowany?
Setjmp,
Jest to przydatne, ponieważ nie wymaga psql. Zwróć uwagę, że nazwy funkcji wydają się być zmniejszone.
Seamus Abshere
@Maxim, czy wiesz, jak wykryć typ zwracany i argumenty wejściowe?
Fivell
@Fivell, za jedyne param nazw, typów: nie SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. To przynajmniej na str. 9.6. Możesz uzyskać kod numeryczny typu poprzez właściwość proargtypes, ale musisz połączyć z inną tabelą, aby uzyskać to jako nazwy.
Thalis K.
16

Służy \dfdo wyświetlania wszystkich procedur składowanych w Postgres.

Puneet Purohit
źródło
10

Jeśli ktoś się zastanawia, jak szybko przeszukiwać tabele katalogu i korzystać z pg_get_functiondef()funkcji, oto przykładowe zapytanie:

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
źródło
Wydaje się, że pg_get_functiondef () nie obsługuje funkcji agregujących zdefiniowanych przez użytkownika. Jak otrzymuję BŁĄD: „histogram” jest funkcją agregującą, gdy wysyłam zapytanie do UDA
Tim Child
2
[42809] BŁĄD: „array_agg” to funkcja agregująca
Daniel L. VanDenBosch,
1
@ DanielL.VanDenBosch poprawione (aby po prostu wykluczyć funkcje agregujące)
msciwoj
Uratowałeś mi życie ... pg_get_functiondef () można użyć do znalezienia procesów z określonym słowem w definicjipg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero.
0

Możesz również uzyskać przez phpPgAdmin, jeśli skonfigurowałeś go w swoim systemie,

Krok 1: Wybierz bazę danych

Krok 2: Kliknij przycisk Znajdź

Krok 3: Zmień opcję wyszukiwania na funkcje, a następnie kliknij Znajdź.

Otrzymasz listę zdefiniowanych funkcji. Możesz także wyszukiwać funkcje według nazwy, mam nadzieję, że ta odpowiedź pomoże innym.

Veeresh Digasangi
źródło
-1

Aby zobaczyć pełny kod (zapytanie) zapisane w procedurze / funkcjach składowanych, użyj poniższego polecenia:

sp_helptext procedure/function_name

dla nazwy funkcji i nazwy procedury nie dodawaj przedrostka „dbo”. lub „sys.”.

nie dodawaj nawiasów na końcu procedury lub nazwy funkcji, a także nie przekazuj parametrów.

użyj słowa kluczowego sp_helptext, a następnie podaj nazwę procedury / funkcji.

użyj poniższego polecenia, aby zobaczyć pełny kod napisany dla procedury:

sp_helptext ProcedureName

użyj poniższego polecenia, aby zobaczyć pełny kod napisany dla funkcji:

sp_helptext FunctionName
Developer_Suraj
źródło
Nie ma sp_helptextw postgresql.
GSerg
-2

Zwykle używałbyś aplikacji do zarządzania bazami danych , takiej jak pgAdmin , przejdź do obiektu, który Cię interesuje i kliknij prawym przyciskiem myszy, aby przejść do „skryptu podczas tworzenia” lub podobnego.

Czy próbujesz to zrobić ... bez aplikacji do zarządzania?

annakata
źródło
2
Tylko wiersz poleceń - bez aplikacji do zarządzania. Jeśli pgAdmin może to zrobić, musi użyć jakiegoś polecenia - po prostu nie mogę znaleźć żadnej dokumentacji na ten temat. Przeglądam tabele pg_ *, ale żadna nie wydaje się wyróżniać.
darren
Cieszę się, że znalazłeś odpowiedź, ale nie wiesz, dlaczego utrudniasz sobie życie! Dlaczego po prostu nie zainstalować pgAdmin?
annakata
7
Podczas zdalnego łączenia się z bazą danych w sesji ssh uruchomienie aplikacji zarządzającej nie jest łatwe.
jutky