làm thế nào để hiển thị mã thủ tục được lưu trữ đầy đủ?


111

Làm thế nào để bạn xem một thủ tục / chức năng được lưu trữ?

Giả sử tôi có một hàm cũ mà không có định nghĩa ban đầu - tôi muốn xem nó đang làm gì trong pg / psql nhưng dường như tôi không thể tìm ra cách để làm điều đó.

sử dụng Postgres phiên bản 8.4.1

Câu trả lời:


19

sử dụng pgAdmin hoặc sử dụng pg_proc để lấy nguồn của các thủ tục được lưu trữ của bạn. pgAdmin cũng làm như vậy.


3
pg_proc đó là nó! Chà, tôi rất vui vì họ đã tiết kiệm được vài byte dung lượng bằng cách không gọi nó là pg_procedure ... geez. :)
darren

14
Khá dễ dàng để tìm ra truy vấn psql đang sử dụng để truy xuất thông tin đó (ví dụ: đối với lệnh \ df) bằng cách bắt đầu psql với tham số --echo-hidden. Điều đó sẽ hiển thị tất cả các truy vấn được sử dụng nội bộ. pg_proc không lưu trữ một câu lệnh CREATE FUNCTION hoàn chỉnh. Bạn có thể sử dụng pg_get_functiondef () để truy xuất nguồn hoàn chỉnh.
a_horse_with_no_name

5
chỉ trong trường hợp bất cứ ai đang nhầm lẫn như những nơi bàn đó là: pg_catalog -> bảng hệ thống -> pg_proc
Dimitris

242

\df+ <function_name>trong psql .


6
Có cách nào để in cái này đẹp không? Lý do tôi hỏi là vì điều này làm cho nó không thể đọc được.
12hys

3
Đây là một bản in đẹp, đối với tôi. Hãy nhớ nếu bạn đang thực hiện điều này một cách tương tác trong psql và các dòng được bao bọc và máy nhắn tin khởi động, sau đó bạn có thể tắt các dòng được bọc bằng cách gõ '-S' (giống như 'less' command line arg), sau đó sử dụng các phím mũi tên để cuộn xung quanh.
Jonathan Hartley

10
Để dễ đọc, bạn có thể sử dụng \x lệnh meta psql trước khi hiển thị định nghĩa hàm. \xcũng hữu ích để xem kết quả truy vấn chứa các bản ghi có chuỗi dài.
Hầm

149

\ef <function_name>trong psql. Nó sẽ cung cấp cho toàn bộ chức năng với văn bản có thể chỉnh sửa.


2
Câu trả lời chính xác. Điều này sẽ mở định nghĩa chức năng trong trình soạn thảo.
Ponnusamy K

2
Đây là câu trả lời tốt nhất! Nó hiển thị định nghĩa của hàm theo cách có thể đọc được.
faramka

3
Đừng quên gõ ; <enter>sau để thực thi bộ đệm.
redolent

4
ERROR: more than one function named
Brian Haak

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

Điều này cho trình xử lý hàm biết cách gọi hàm. Nó có thể là mã nguồn thực của hàm cho các ngôn ngữ được thông dịch, ký hiệu liên kết, tên tệp hoặc bất kỳ thứ gì khác, tùy thuộc vào ngôn ngữ triển khai / quy ước gọi


Điều này là hữu ích. Có cách nào để có đầu ra được in đẹp không?
Setjmp

Điều này rất hữu ích vì nó không yêu cầu psql. Lưu ý rằng tên chức năng dường như bị giảm bớt.
Seamus Abshere

@Maxim, bạn có biết cách phát hiện kiểu trả về và đối số đầu vào không?
Fivell

@Fivell, cho tên arg chỉ, các loại: SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'. Điều này ít nhất là trên trang 9.6. Bạn có thể lấy mã số của loại thông qua thuộc tính proargtypes, nhưng bạn cần kết hợp với một số bảng khác để lấy mã này làm tên.
Thalis K.

16

Sử dụng \dfđể liệt kê tất cả các thủ tục được lưu trữ trong Postgres.


10

Nếu có ai thắc mắc về cách truy vấn nhanh các bảng danh mục và sử dụng pg_get_functiondef()chức năng thì đây là truy vấn mẫu:

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 () dường như không xử lý các hàm tổng hợp do người dùng xác định. Khi tôi nhận được LỖI: "biểu đồ" là một hàm tổng hợp khi tôi truy vấn UDA
Tim Child

2
[42809] LỖI: "array_agg" là một hàm tổng hợp
Daniel L. VanDenBosch

1
@ DanielL.VanDenBosch đã sửa (để chỉ loại trừ các hàm tổng hợp)
msciwoj

Bạn đã cứu mạng tôi ... pg_get_functiondef () có thể được sử dụng để tìm procs với từ cụ thể trong định nghĩapg_get_functiondef(p.oid) ilike '%indicator_loss%'
Zero,

0

Bạn cũng có thể lấy bằng phpPgAdmin nếu bạn đã định cấu hình nó trong hệ thống của mình,

Bước 1: Chọn cơ sở dữ liệu của bạn

Bước 2: Bấm vào nút tìm

Bước 3: Thay đổi tùy chọn tìm kiếm thành các chức năng sau đó nhấp vào Tìm.

Bạn sẽ nhận được danh sách các chức năng đã định nghĩa, bạn cũng có thể tìm kiếm các chức năng theo tên, hy vọng câu trả lời này sẽ giúp ích cho những người khác.


-1

Để xem toàn bộ mã (truy vấn) được viết trong thủ tục / hàm được lưu trữ, hãy sử dụng Lệnh bên dưới:

sp_helptext procedure/function_name

đối với tên hàm và tên thủ tục không thêm tiền tố 'dbo.' hoặc 'sys.'.

không thêm dấu ngoặc vào cuối thủ tục hoặc tên hàm và cũng không chuyển các tham số.

sử dụng từ khóa sp_helptext và sau đó chỉ cần chuyển tên thủ tục / hàm.

sử dụng lệnh dưới đây để xem toàn bộ mã được viết cho Thủ tục:

sp_helptext ProcedureName

sử dụng lệnh dưới đây để xem toàn bộ mã được viết cho hàm:

sp_helptext FunctionName

Không có sp_helptexttrong postgresql.
GSerg

-2

Nói một cách thông thường, bạn sẽ sử dụng ứng dụng trình quản lý DB như pgAdmin , duyệt đến đối tượng mà bạn quan tâm và nhấp chuột phải vào "script as create" hoặc tương tự.

Bạn đang cố gắng làm điều này ... mà không cần ứng dụng quản lý?


2
Chỉ dòng lệnh - không có ứng dụng quản lý. Nếu pgAdmin có thể làm điều đó, nó phải sử dụng một số loại lệnh - tôi chỉ không thể tìm thấy bất kỳ tài liệu nào về nó. Tôi đang xem qua các bảng pg_ * nhưng dường như không có bảng nào nổi bật.
darren

Rất vui vì bạn đã tìm được câu trả lời, nhưng không biết chắc tại sao bạn đang tự làm khó mình! Tại sao không chỉ cài đặt pgAdmin?
annakata

7
Khi kết nối từ xa với một db trong phiên ssh, không dễ để chạy một ứng dụng quản lý.
jutky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.