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

Respostas:


19

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


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 .


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.


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


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.


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>'

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.


-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

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?


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.