como exibir o código de procedimento armazenado completo?

111

Como você visualiza um procedimento / função armazenado?

Digamos que eu tenha uma função antiga sem a definição original - quero ver o que ela está fazendo no pg / psql, mas não consigo descobrir uma maneira de fazer isso.

usando Postgres versão 8.4.1

Darren
fonte

Respostas:

19

use pgAdmin ou use pg_proc para obter a origem de seus procedimentos armazenados. pgAdmin faz o mesmo.

Frank Heikens
fonte
3
pg_proc é isso! Estou feliz que eles economizaram alguns bytes de espaço ao não chamá-lo de pg_procedure ... geez. :)
darren
14
É muito fácil descobrir quais consultas o psql está usando para recuperar essas informações (por exemplo, para o comando \ df) iniciando o psql com o parâmetro --echo-hidden. Isso mostrará todas as consultas usadas internamente. pg_proc não armazena uma instrução CREATE FUNCTION completa. Você pode usar pg_get_functiondef () para recuperar a fonte completa.
a_horse_with_no_name de
5
apenas no caso de alguém estar confuso sobre onde essa tabela está: pg_catalog -> tabela do sistema -> pg_proc
Dimitris
242

\df+ <function_name>no psql .

Milen A. Radev
fonte
6
Existe uma maneira de imprimir isso? A razão de eu perguntar é porque isso o torna ilegível.
12h de
3
Isso está bem impresso, para mim. Lembre-se de que se você estiver fazendo isso interativamente no psql e as linhas forem quebradas e o pager for ativado, você pode desativar as linhas quebradas digitando '-S' (o mesmo que 'less' na linha de comando arg) e, em seguida, use as teclas de seta para rolar por aí.
Jonathan Hartley,
10
Para maior legibilidade, você pode usar o \x meta-comando psql antes de exibir a definição da função. \xtambém é útil para visualizar resultados de consultas contendo registros com strings longas.
Ensopado de
149

\ef <function_name>no psql. Ele dará toda a função com texto editável.

Asha Koshti
fonte
2
Resposta exata. Isso abrirá a definição da função no editor.
Ponnusamy K
2
Esta é a melhor resposta! Mostra a definição da função de forma legível.
faramka de
3
Não se esqueça de digitar ; <enter>depois para executar o buffer.
cheirando a
4
ERROR: more than one function named
Brian Haak,
62
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

Isso informa ao manipulador da função como invocar a função. Pode ser o código-fonte real da função para linguagens interpretadas, um símbolo de link, um nome de arquivo ou qualquer outra coisa, dependendo da linguagem de implementação / convenção de chamada

Máxima
fonte
Isso é útil. Existe uma maneira de ter a saída bem impressa?
Setjmp
Isso é útil porque não exige psql. Observe que os nomes das funções parecem estar reduzidos.
Seamus Abshere
@Maxim, você sabe detectar tipo de retorno e argumentos de entrada?
Fivell
@Fivell, por apenas nomes Arg, não tipos: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Isso pelo menos na página 9.6. Você pode obter o código numérico do tipo por meio da propriedade proargtypes, mas precisará unir-se a alguma outra tabela para obter isso como nomes.
Thalis K.
16

Use \dfpara listar todos os procedimentos armazenados no Postgres.

Puneet Purohit
fonte
10

Se alguém se pergunta como consultar tabelas de catálogo rapidamente e usar a pg_get_functiondef()função, aqui está o exemplo de consulta:

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
fonte
pg_get_functiondef () parece não lidar com funções agregadas definidas pelo usuário. Conforme eu obtenho ERROR: "histograma" é uma função agregada quando eu consulto um UDA
Tim Child
2
[42809] ERRO: "array_agg" é uma função agregada
Daniel L. VanDenBosch
1
@ DanielL.VanDenBosch corrigido (para simplesmente excluir funções agregadas)
msciwoj
Você salvou minha vida ... pg_get_functiondef () pode ser usado para encontrar procs com palavras específicas na definiçãopg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero
0

Você também pode obter pelo phpPgAdmin se estiver configurado em seu sistema,

Etapa 1: Selecione seu banco de dados

Etapa 2: Clique no botão Localizar

Etapa 3: Mude a opção de pesquisa para funções e clique em Encontrar.

Você obterá a lista de funções definidas. Você também pode pesquisar funções por nome, espero que esta resposta ajude outras pessoas.

Veeresh Digasangi
fonte
-1

Para ver o código completo (consulta) escrito em procedimentos / funções armazenados, use o comando abaixo:

sp_helptext procedure/function_name

para o nome da função e o nome do procedimento, não adicione o prefixo 'dbo'. ou 'sys.'.

não adicione colchetes no final do procedimento ou nome da função e também não passe os parâmetros.

use a palavra-chave sp_helptext e depois apenas passe o nome do procedimento / função.

use o comando abaixo para ver o código completo escrito para o procedimento:

sp_helptext ProcedureName

use o comando abaixo para ver o código completo escrito para a função:

sp_helptext FunctionName
Developer_Suraj
fonte
Não existe sp_helptextno postgresql.
GSerg
-2

Normalmente falando, você usaria um aplicativo gerenciador de banco de dados como o pgAdmin , navegue até o objeto no qual está interessado e clique com o botão direito para "criar um script" ou semelhante.

Você está tentando fazer isso ... sem um aplicativo de gerenciamento?

Annakata
fonte
2
Apenas a linha de comando - nenhum aplicativo de gerenciamento. Se o pgAdmin pode fazer isso, ele deve estar usando algum tipo de comando - eu simplesmente não consigo encontrar nenhuma documentação sobre isso. Estou olhando as tabelas pg_ *, mas nenhuma parece se destacar.
darren
Que bom que você encontrou uma resposta, mas não sei por que está dificultando sua vida! Por que não apenas instalar o pgAdmin?
annakata de
7
Ao conectar-se a um banco de dados remotamente em uma sessão ssh, não é fácil executar um aplicativo de gerenciamento.
jutky de