Jak wyświetlić funkcję, procedurę, wyzwalacze kod źródłowy w postgresql?

168

Jak wydrukować funkcje i wyzwalacze kod źródłowy w postgresql? daj mi znać, jeśli ktoś zna zapytanie o wyświetlenie funkcji, wyzwala kod źródłowy.

ganesh
źródło
11
jako uwaga dla obserwujących, którzy przybyli tutaj, próbując wymyślić, jak wyświetlić listę wszystkich wyzwalaczy, jest to select * from pg_trigger;lub, jeśli chcesz również zobaczyć, która tabela dotyczy każdego wyzwalacza dla select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Odpowiedzi:

152

\df+w psql podaje kod źródłowy.

Mateusz Grotek
źródło
17
Fajny :) Proponuję użyć \dfdo znalezienia nazwy funkcji, a następnie \xdo rozszerzonego wyjścia, a następnie\df+ name_of_function
Sam Watkins
33
\ df + wypisuje dużo więcej niż kod. Jeśli chcesz tylko kodu, \ sf załatwi sprawę!
Telic
Jak wyświetlić funkcje zainstalowanego rozszerzenia? Przykład Używam ltree , ale nie ma odpowiedzi z \df ltxtquery.
Peter Krauss,
\x ONjest koniecznością do wyświetlania transponowanego
andilabs
130

Do funkcji:

możesz zapytać o widok pg_proc, tak jak poniżej

select proname,prosrc from pg_proc where proname= your_function_name; 

Innym sposobem jest to, że po prostu wykonaj polecenie commont \dfi \efktóre może wyświetlić listę funkcji.

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

Pokaże kod źródłowy funkcji.

Wyzwalacze:

Nie wiem, czy istnieje bezpośredni sposób na uzyskanie kodu źródłowego. Po prostu poznaj następujący sposób, może to ci pomoże!

  • Krok 1: Pobierz tabelę wyzwalacza:
    skytf => wybierz tgrelid z pg_trigger, gdzie tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 rząd)
  • Krok 2: Uzyskaj nazwę tabeli powyższego oid!
    skytf => wybierz oid, relname z pg_class, gdzie oid = 26599;
      oid | zmienić nazwę           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 rząd)
  • krok 3: wypisz informacje o tabeli
    skytf => \ d tbl_tmp

Pokaże ci szczegóły wyzwalacza tabeli. Zwykle wyzwalacz używa funkcji. Możesz więc pobrać kod źródłowy funkcji wyzwalacza, tak jak powyżej, na które wskazałem!

franki
źródło
37

Oto kilka przykładów z PostgreSQL-9.5

Lista wyświetlania:

  1. Funkcje: \df+
  2. Wyzwalacze : \dy+

Definicja wyświetlania:

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
źródło
7
Użycie \xpierwszego do włączenia rozszerzonego wyświetlacza również pomaga w zwiększeniu czytelności.
Kieszenie i
26

Możliwości jest wiele. Najprostszym sposobem jest użycie pgAdmin i pobranie tego z okna SQL. Jednak jeśli chcesz dostać to programowo następnie examinate pg_proci pg_triggerkatalogów systemowych lub routinesi triggerswidoki ze schematu informacyjnego (to SQL standardowy sposób, ale to nie może obejmować wszystkie funkcje szczególnie PostgreSQL specyficzne). Na przykład:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';
Grzegorz Szpetkowski
źródło
3
Mmmm .. Mam funkcje PGPSQL, które mają pusty routine_defintion i stan „EXTERNAL” w polu routine_body. Masz jakąś wskazówkę, gdzie mogę je znaleźć?
alfonx
2
+1 To jest bardziej standardowe / przenośne rozwiązanie. W przypadku widoków SQL to:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta
Ale co w przypadku, gdy nazwa funkcji nie jest unikalna, ponieważ ktoś utworzył funkcje o tej samej nazwie i różnych argumentach funkcji? stackoverflow.com/questions/47341513/ ...
mg1075
@alfonx patrz pgproc.prosrckolumna
Tomáš Záluský
12

Nieco więcej niż tylko wyświetlanie funkcji, co powiesz także na uzyskanie narzędzia edycji lokalnej.

\ef <function_name>jest bardzo poręczny. Otworzy kod źródłowy funkcji w edytowalnym formacie. Będziesz nie tylko mógł go przeglądać, ale także edytować i wykonywać.

Właśnie \ef bez nazwa_funkcji otworzy edytowalny szablon STWÓRZ FUNKCJĘ.

Więcej informacji -> https://www.postgresql.org/docs/9.6/static/app-psql.html

mythicalcoder
źródło
11

\sf nazwa_funkcji w psql daje edytowalny kod źródłowy pojedynczej funkcji.

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

\ sf [+] opis_funkcji To polecenie pobiera i wyświetla definicję nazwanej funkcji w postaci polecenia CREATE OR REPLACE FUNCTION.

Jeśli do nazwy polecenia zostanie dołączony znak +, to wiersze wyjściowe są numerowane, przy czym pierwszym wierszem treści funkcji jest wiersz 1.

Siergiej Tarasow
źródło
pokazuje kod źródłowy funkcji. \ ef nazwa funkcji otwiera ją w edytowalnym szablonie
amar
0

Od wersji: psql (9.6.17, serwer 11.6)

Próbowałem wszystkich powyższych odpowiedzi, ale dla mnie

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 wydaje się nie działać dla mnie.

Ravi Parekh
źródło