전체 저장 프로 시저 코드를 표시하는 방법은 무엇입니까?


111

저장 프로 시저 / 함수를 어떻게 봅니까?

원래 정의가없는 오래된 함수가 있다고 가정 해 보겠습니다. pg / psql에서 무엇을하는지보고 싶지만 그 방법을 알아낼 수없는 것 같습니다.

Postgres 버전 8.4.1 사용

답변:


19

pgAdmin을 사용하거나 pg_proc 을 사용 하여 저장 프로 시저의 소스를 가져옵니다. pgAdmin은 동일합니다.


3
pg_proc 그게 다야! 휴, 그들이 pg_procedure ... geez라고 부르지 않아서 몇 바이트의 공간을 절약하게되어 기쁩니다. :)
darren 2010-08-19

14
--echo-hidden 매개 변수로 psql을 시작하면 psql이 해당 정보 (예 : \ df 명령의 경우)를 검색하는 데 사용하는 쿼리를 쉽게 찾을 수 있습니다. 내부적으로 사용되는 모든 쿼리가 표시됩니다. pg_proc은 완전한 CREATE FUNCTION 문을 저장하지 않습니다. pg_get_functiondef ()를 사용하여 전체 소스를 검색 할 수 있습니다.
a_horse_with_no_name

5
누군가 그 테이블이 어디에 있는지 혼란 스러울 경우를 대비하여 : pg_catalog-> 시스템 테이블-> pg_proc
Dimitris

242

\df+ <function_name>에서 psql의 .


6
이것을 꽤 인쇄하는 방법이 있습니까? 내가 묻는 이유는 이것이 읽을 수 없기 때문입니다.
12hys

3
이것은 나를 위해 꽤 인쇄되어 있습니다. psql에서 대화식으로이 작업을 수행하고 줄이 래핑되고 호출기가 시작되면 '-S'( 'less'명령 줄 인수와 동일)를 입력하여 줄 바꿈을 해제 한 다음 화살표 키를 사용하여 스크롤 할 수 있습니다. 주위에.
Jonathan Hartley

10
가독성을 위해 함수 정의를 표시하기 전에 \x psql 메타 명령을 사용할 수 있습니다 . \x긴 문자열이있는 레코드가 포함 된 쿼리 결과를 보는데도 유용합니다.
Stew

149

\ef <function_name>psql에서. 편집 가능한 텍스트로 전체 기능을 제공합니다.


2
정확한 답변입니다. 그러면 편집기에서 함수 정의가 열립니다.
Ponnusamy K

2
이것이 최고의 답변입니다! 함수의 정의를 읽기 쉽게 보여줍니다.
faramka 2016-06-10

3
; <enter>버퍼를 실행 한 후에 입력하는 것을 잊지 마십시오 .
redolent aug

4
ERROR: more than one function named
Brian Haak

60
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

이것은 함수 핸들러에게 함수를 호출하는 방법을 알려줍니다. 구현 언어 / 호출 규칙에 따라 해석 된 언어, 링크 기호, 파일 이름 또는 기타 거의 모든 기능에 대한 함수의 실제 소스 코드 일 수 있습니다.


이것은 유용합니다. 출력물을 예쁘게 인쇄하는 방법이 있습니까?
setjmp는

필요하지 않기 때문에 유용합니다 psql. 함수 이름은 다운 케이스로 표시됩니다.
Seamus Abshere 2014

@Maxim, 반환 유형 및 입력 인수를 감지하는 방법을 알고 있습니까?
Fivell 2014 년

@Fivell, 형식이 아닌 인수 이름 : SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. 이것은 적어도 Pg 9.6에서. property를 통해 유형의 숫자 ​​코드를 얻을 수 proargtypes있지만이를 이름으로 가져 오려면 다른 테이블과 조인해야합니다.
Thalis K.


10

카탈로그 테이블을 빠르게 쿼리하고 pg_get_functiondef()함수를 사용하는 방법이 궁금하다면 다음 은 샘플 쿼리입니다.

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 ()는 사용자 정의 집계 함수를 처리하지 않는 것 같습니다. 오류가 발생하면 "히스토그램"은 UDA를 쿼리 할 때 집계 함수입니다
Tim Child

2
[42809] 오류 : "array_agg"는 집계 함수입니다
Daniel L. VanDenBosch 2017 년

1
DanielL.VanDenBosch은 (단순히 집계 함수를 제외에) 수정 @
msciwoj을

당신은 내 생명을 구했습니다 ... pg_get_functiondef ()는 정의에서 특정 단어로 procs를 찾는 데 사용할 수 있습니다pg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero

0

시스템에서 구성한 경우 phpPgAdmin으로 얻을 수도 있습니다.

1 단계 : 데이터베이스 선택

2 단계 : 찾기 버튼 클릭

3 단계 : 검색 옵션을 기능으로 변경 한 다음 찾기를 클릭합니다.

정의 된 함수 목록이 표시되며 이름으로 함수를 검색 할 수도 있습니다.이 답변이 다른 사용자에게 도움이되기를 바랍니다.


-1

저장 프로 시저 / 함수로 작성된 전체 코드 (쿼리)를 보려면 아래 명령을 사용하십시오.

sp_helptext procedure/function_name

함수 이름과 프로 시저 이름에 접두사 'dbo'를 추가하지 마십시오. 또는 'sys.'.

프로 시저 또는 함수 이름 끝에 대괄호를 추가하지 말고 매개 변수도 전달하지 마십시오.

sp_helptext 키워드를 사용하고 프로 시저 / 함수 이름을 전달하십시오.

절차에 대해 작성된 전체 코드를 보려면 아래 명령을 사용하십시오.

sp_helptext ProcedureName

기능을 위해 작성된 전체 코드를 보려면 아래 명령을 사용하십시오.

sp_helptext FunctionName

sp_helptextpostgresql 에는 없습니다 .
GSerg

-2

일반적으로 pgAdmin 과 같은 DB 관리자 응용 프로그램을 사용 하고 관심있는 객체를 찾은 다음 마우스 오른쪽 버튼을 클릭하여 "생성시 스크립트"또는 이와 유사한 방식으로 작성합니다.

관리 앱없이이 작업을 수행하려고합니까?


2
명령 줄 만 있으면 관리 앱이 없습니다. pgAdmin이이를 수행 할 수 있다면 일종의 명령을 사용해야합니다. 이에 대한 문서를 찾을 수 없습니다. pg_ * 테이블을 살펴보고 있지만 눈에 띄는 것은 없습니다.
darren

답을 찾아서 다행이지만 왜 자신을 위해 인생을 어렵게 만들고 있는지 모르겠습니다! pgAdmin을 설치하지 않는 이유는 무엇입니까?
annakata

7
ssh 세션에서 원격으로 db에 연결할 때 관리 앱을 실행하기가 쉽지 않습니다.
jutky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.