Como exibir a função, procedimento, aciona o código fonte no postgresql?

168

Como imprimir funções e acionar código fonte no postgresql? informe-me se alguém souber a consulta para exibir a função, aciona o código-fonte.

ganesh
fonte
11
como uma observação para os seguidores que chegaram aqui tentando descobrir como listar todos os gatilhos, é select * from pg_trigger;ou, se você também deseja ver qual tabela cada gatilho se aplica ao select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Respostas:

152

\df+no psql fornece o código fonte.

Mateusz Grotek
fonte
17
Nice one :) Eu sugiro usar \dfpara encontrar o nome da sua função, em seguida, \xpara a saída expandido, em seguida,\df+ name_of_function
Sam Watkins
33
\ df + gera muito mais que o código. Se tudo o que você quer é o código, \ sf fará o truque!
Telic
Como ver as funções de uma EXTENSÃO instalada? Exemplo Estou usando ltree , mas não há resposta com \df ltxtquery.
Peter Krauss
\x ONé uma obrigação para a exibição transposta
andilabs 15/06
130

Para função:

você pode consultar a visualização pg_proc, da seguinte maneira

select proname,prosrc from pg_proc where proname= your_function_name; 

Outra maneira é simplesmente executar o commont \dfe \eflistar as funções.

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

Ele mostrará o código fonte da função.

Para gatilhos:

Não sei se existe uma maneira direta de obter o código fonte. Basta saber da seguinte maneira, pode ser que ele irá ajudá-lo!

  • Etapa 1: obter a tabela oid do gatilho:
    skytf => selecione tgrelid em pg_trigger onde tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 linha)
  • Etapa 2: Obtenha o nome da tabela do oid acima!
    skytf => selecione oid, relname de pg_class onde oid = 26599;
      oid | relname           
    ------- + -----------------------------
     26599 tbl_tmp
    (1 linha)
  • Etapa 3: listar as informações da tabela
    skytf => \ d tbl_tmp

Ele mostrará os detalhes do gatilho da tabela. Normalmente, um gatilho usa uma função. Assim, você pode obter o código fonte da função de trigger, exatamente como o indicado acima!

francos
fonte
38

Aqui estão alguns exemplos do PostgreSQL-9.5

Exibir lista:

  1. Funções: \df+
  2. Gatilhos : \dy+

Definição de exibição:

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
fonte
7
Usar o \xprimeiro para ativar a exibição expandida também ajuda na legibilidade.
Pocketsand
26

Existem muitas possibilidades. A maneira mais simples é usar o pgAdmin e obtê-lo na janela SQL. No entanto, se você deseja obter isso programaticamente, em seguida, examinate pg_proce pg_triggercatálogos do sistema ou routinese triggersvistas de esquema de informações (que do SQL forma padrão, mas pode não cobrir todas as características específicas PostgreSQL, especialmente). Por exemplo:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';
Grzegorz Szpetkowski
fonte
3
Mmmm .. Eu tenho funções PGPSQL, que possuem uma rotina_definição vazia, e o estado 'EXTERNO' no campo nome_da_ rotina. Alguma dica de onde posso encontrá-las?
Alfonx
2
+1 Esta é uma solução mais padrão / portátil. Para visualizações, o SQL é:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta 1/15
Mas e o caso em que um nome de função não é exclusivo porque alguém criou funções com o mesmo nome e argumentos de função diferentes? stackoverflow.com/questions/47341513/…
mg1075
@alfonx see pgproc.prosrccolumn
Tomáš Záluský
12

Um pouco mais do que apenas exibir a função, que tal obter as instalações de edição no local também.

\ef <function_name>é muito útil. Ele abrirá o código fonte da função em formato editável. Você não apenas poderá visualizá-lo, mas também poderá editá-lo e executá-lo.

Apenas \efsem function_name, será aberto o modelo editável de CREATE FUNCTION.

Para referência adicional -> https://www.postgresql.org/docs/9.6/static/app-psql.html

mythicalcoder
fonte
11

\sf nome_da_função no psql gera código fonte editável de uma única função.

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

\ sf [+] function_description Este comando busca e mostra a definição da função nomeada, na forma de um comando CREATE OR REPLACE FUNCTION.

Se + for anexado ao nome do comando, as linhas de saída serão numeradas, com a primeira linha do corpo da função sendo a linha 1.

Sergey Tarasov
fonte
mostra o código fonte de uma função. \ nome da função ef abre no templet editável
amar
0

Desde a versão: psql (9.6.17, servidor 11.6)

Eu tentei todas as respostas acima, mas para mim

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 parece não estar funcionando para mim.

Ravi Parekh
fonte