Làm thế nào để hiển thị chức năng, thủ tục, kích hoạt mã nguồn trong postgresql?


168

Làm thế nào để in các chức năng và kích hoạt sourcecode trong postgresql? xin vui lòng cho tôi biết nếu có ai biết truy vấn để hiển thị chức năng, kích hoạt mã nguồn.


11
như một lưu ý cho những người theo dõi ở đây đang cố gắng tìm ra cách liệt kê tất cả các kích hoạt, select * from pg_trigger;hoặc, nếu bạn cũng muốn xem mỗi bảng kích hoạt áp dụng cho select tgrelid::regclass, tgname from pg_trigger;FWIW `
rogerdpack

Câu trả lời:


152

\df+trong psql cung cấp cho bạn mã nguồn.


17
Rất vui :) Tôi khuyên bạn nên sử dụng \dfđể tìm tên hàm của mình, sau đó \xcho đầu ra mở rộng, sau đó\df+ name_of_function
Sam Watkins

33
\ df + xuất ra nhiều hơn mã. Nếu tất cả những gì bạn muốn là mã, \ sf sẽ thực hiện thủ thuật!
Telic

Làm thế nào để xem các chức năng của một EXTENSION được cài đặt? Ví dụ tôi đang sử dụng ltree , nhưng không có phản hồi với \df ltxtquery.
Peter Krauss

\x ONlà phải cho màn hình chuyển đổi
andilabs

130

Đối với chức năng:

bạn có thể truy vấn chế độ xem pg_proc, như sau

select proname,prosrc from pg_proc where proname= your_function_name; 

Một cách khác là chỉ cần thực hiện commont \df\efcó thể liệt kê các hàm.

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

Nó sẽ hiển thị mã nguồn của hàm.

Đối với kích hoạt:

Tôi không biết có cách nào trực tiếp để lấy mã nguồn không. Chỉ cần biết cách sau đây, có thể nó sẽ giúp bạn!

  • Bước 1: Lấy bảng oid của trình kích hoạt:
    skytf => chọn tgrelid từ pg_trigger trong đó tgname = 'insert_tbl_tmp_trigger';
      tgrelid
    ---------
       26599
    (1 hàng)
  • Bước 2: Lấy tên bảng của oid trên!
    skytf => chọn oid, relname từ pg_group trong đó oid = 26599;
      oid | tên hiệu           
    ------- + -----------------------------
     26599 | tbl_tmp
    (1 hàng)
  • Bước 3: liệt kê thông tin bảng
    skytf => \ d tbl_tmp

Nó sẽ cho bạn thấy các chi tiết kích hoạt của bảng. Thông thường một kích hoạt sử dụng một chức năng. Vì vậy, bạn có thể lấy mã nguồn của hàm kích hoạt giống như ở trên mà tôi đã chỉ ra!


37

Dưới đây là một vài ví dụ từ PostgreSQL-9.5

Danh sách hiển thị:

  1. Chức năng: \df+
  2. Gây nên : \dy+

Định nghĩa hiển thị:

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$

7
Sử dụng \xđầu tiên để bật màn hình mở rộng cũng giúp dễ đọc.
Pocketsand

26

Có nhiều khả năng. Cách đơn giản nhất là chỉ sử dụng pgAdmin và lấy cái này từ cửa sổ SQL. Tuy nhiên nếu bạn muốn có được điều này lập trình sau đó examinate pg_procpg_triggercatalog hệ thống hay routinestriggersquan điểm từ giản đồ thông tin (mà của SQL cách tiêu chuẩn, nhưng nó có thể không bao gồm tất cả các tính năng đặc biệt PostgreSQL cụ thể). Ví dụ:

SELECT
    routine_definition 
FROM
    information_schema.routines 
WHERE
    specific_schema LIKE 'public'
    AND routine_name LIKE 'functionName';

3
Mmmm .. Tôi có các hàm PGPSQL, có một hàm_d_dintintion trống và trạng thái 'EXTERNAL' trong trường Rout_body. Bất kỳ gợi ý nơi tôi có thể tìm thấy những?
alfonx

2
+1 Đây là giải pháp di động / tiêu chuẩn hơn. Đối với các khung nhìn, SQL là:SELECT view_definition FROM information_schema.views WHERE table_schema = ? AND table_name = ?
Franta

Nhưng những gì về trường hợp một tên hàm không phải là duy nhất bởi vì ai đó đã tạo ra các hàm có cùng tên và các đối số hàm khác nhau thì sao? stackoverflow.com/questions/47341513/
hy

@alfonx xem pgproc.prosrccột
Tomáš Záluský

12

Hơi nhiều hơn là chỉ hiển thị chức năng, làm thế nào về việc chỉnh sửa cơ sở tại chỗ là tốt.

\ef <function_name>rất tiện dụng Nó sẽ mở mã nguồn của hàm ở định dạng có thể chỉnh sửa. Bạn sẽ không chỉ có thể xem nó, bạn có thể chỉnh sửa và thực hiện nó.

Chỉ cần \efkhông có function_name sẽ mở mẫu CREATE FUNCTION có thể chỉnh sửa.

Để tham khảo thêm -> https://www.postgresql.org/docs/9.6/static/app-psql.html


11

\sf function_name trong psql mang lại mã nguồn có thể chỉnh sửa của một hàm duy nhất.

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

\ sf [+] function_description Lệnh này tìm nạp và hiển thị định nghĩa của hàm được đặt tên, dưới dạng lệnh TẠO HOẶC THAY THẾ CHỨC NĂNG.

Nếu + được gắn vào tên lệnh, thì các dòng đầu ra được đánh số, với dòng đầu tiên của thân hàm là dòng 1.


hiển thị mã nguồn của hàm. Tên hàm \ ef mở nó trong templet có thể chỉnh sửa
amar


0

Kể từ phiên bản: psql (9.6.17, máy chủ 11.6)

Tôi đã thử tất cả các câu trả lời trên nhưng đối với tôi

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 dường như không làm việc cho tôi.

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.