Postgresql

如何瀏覽 PostgreSQL 文件以查找適用於特定類型的所有函式的列表?

  • December 11, 2016

假設我想找到一個可以使用的功能列表,jsonb不使用Google從終端執行此操作的最有效方法是什麼?假設只能訪問

  • 手冊頁
  • psql
  • PostgreSQL 表

有幾種方法,但讓我們嘗試解決所有這三種方法。

手冊頁

沒有任何man頁面可以解決這些問題。有很多 PostgreSQL 文件,但目前沒有類似的文件,也沒有perldoc針對 PostgreSQL 的文件。涵蓋此內容的文​​檔僅作為 HTML 分發——您仍然可以使用終端瀏覽器(如 elinks、lynx、w3m 等)查看這些文件。大多數發行版都單獨打包,在 Ubuntu 中你會這樣做。

sudo apt-get install postgresql-doc
elinks /usr/share/doc/postgres*/html/index.html

psql

要為此使用 PSQL,您需要使用\dfS. 您可以看到所有 psql 命令的列表\?。完成後,\dfS只需搜尋類型。如果\dfS使用在終端寬度上換行的查看器,您可以通過使用 `\setenv 設置來告訴它不要換行,大多數尋呼機通過其環境變數接受參數,因此要使用 LESS 而無需換行,您可以使用

\setenv PAGER less
\setenv LESS -S

這一切都埋在了man pagefor 中psql。在該手冊頁中也可以更好地解釋 in-shell psql 幫助的大部分輸出\?,例如,這就是\?顯示的內容

\df[antw][S+] [PATRN]  list [only agg/normal/trigger/window] functions

而且,這man psql表明,

列出函式及其參數、返回類型和函式類型,它們被分類為“agg”(聚合)、“normal”、“trigger”或“window”。要僅顯示特定類型的函式,請將相應的字母 a、n、t 或 w 添加到命令中。如果指定了模式,則僅顯示名稱與模式匹配的函式。預設情況下,僅顯示使用者創建的對象;提供模式或 S 修飾符以包含系統對象。如果使用 \df+ 形式,則會顯示有關每個函式的附加資訊,包括安全分類、易失性、所有者、語言、原始碼和描述。

提示 要查找接受參數或返回特定類型值的函式,請使用尋呼機的搜尋功能滾動瀏覽 \df 輸出。

PostgreSQL 目錄

首先,您需要了解要查詢的內容。這就是複雜的聚會。在上面,我們知道我們正在使用\dfS,所以我們可以這樣得到一個起點psql

psql -E -c"\dfS" -d myDB | less -S

這將從查詢開始,

********* QUERY **********
SELECT n.nspname as "Schema",
 p.proname as "Name",
 pg_catalog.pg_get_function_result(p.oid) as "Result data type",
 pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
CASE
 WHEN p.proisagg THEN 'agg'
 WHEN p.proiswindow THEN 'window'
 WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
 ELSE 'normal'
END as "Type"
FROM pg_catalog.pg_proc p
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE pg_catalog.pg_function_is_visible(p.oid)
ORDER BY 1, 2, 4;
**************************

現在,我們現在p.proname as "Name"pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types"我們可以把它們放在一起,得到一個簡化的版本\dfS,顯示你想要的,

SELECT p.proname AS "Name",
 pg_get_function_arguments(p.oid) AS "Argument data types"
FROM pg_proc AS p
WHERE pg_get_function_arguments(p.oid) like '%jsonb%';

對pg_proc進行更多研究,我們可以看到

proargtypes - oidvector - pg_type.oid - 具有函式參數數據類型的數組。這僅包括輸入參數(包括 INOUT 和 VARIADIC 參數),因此表示函式的呼叫簽名。

這將允許我們做一個非常具體的pg_type查詢oid

SELECT proname AS "Name"
FROM pg_proc
 INNER JOIN pg_type ON ( pg_type.oid = ANY(proargtypes) )
WHERE typname = 'jsonb';

而且,這正是我們想要的。

資訊模式

雖然這裡可能不適用,但一般來說,您可以在information_schema. 這個通用介面不支持一切,速度很慢,而且 psql 內部不使用它。我根本沒有看到這些資訊information_schema.routines

這個答案中的一些無恥地受到了這個問題的啟發,但旨在成為一個更友好的資源。

引用自:https://dba.stackexchange.com/questions/157781