我列出了PostgreSQL模式的所有函數,並且需要用於函數的每個參數的人類可讀類型。在proallargtypes
中表示爲數組的類型的OID。我可以取消數組並將format_type()
應用於它,這會導致查詢分裂爲單個函數的多行。爲了避免這種情況,我必須再次創建外部SELECT
到GROUP
這個argtypes,因爲,顯然,不能將一個未配置的數組分組。所有列都依賴於proname,但我必須列出GROUP BY
子句中的所有列,這是不必要的,但是代替is not a primary key。將函數應用於SELECT語句中數組的每個元素
有沒有更好的方式來實現我的這樣一個輸出的目標:
proname | ... | protypes
-------------------------------------
test | ... | {integer,integer}
我目前使用此查詢
:
SELECT
proname,
prosrc,
pronargs,
proargmodes,
array_agg(proargtypes), -- see here
proallargtypes,
proargnames,
prodefaults,
prorettype,
lanname
FROM (
SELECT
p.proname,
p.prosrc,
p.pronargs,
p.proargmodes,
format_type(unnest(p.proallargtypes), NULL) AS proargtypes, -- and here
p.proallargtypes,
p.proargnames,
pg_get_expr(p.proargdefaults, 0) AS prodefaults,
format_type(p.prorettype, NULL) AS prorettype,
l.lanname
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_language l
ON l.oid = p.prolang
JOIN pg_catalog.pg_namespace n
ON n.oid = p.pronamespace
WHERE n.nspname = 'public'
) x
GROUP BY proname, prosrc, pronargs, proargmodes, proallargtypes, proargnames, prodefaults, prorettype, lanname
謝謝!我會測試並回到你身邊。可悲的是,我無法創建自己的函數,因爲我正在編寫一個數據庫獨立工具,它可以列出函數。儘管閱讀訪問。 – AmShaegar
太棒了,我意識到OUT參數的問題。我需要解決的所有問題是自定義函數的ARRAY()函數。非常感謝你! – AmShaegar
@AmShaegar:注意 - ARRAY()不是函數 - 它是一個「帶有子選擇的數組構造函數」。語法是一樣的,但語義有點不同:) –