Postgresql

如何使函式返回動態命名的列?

  • December 21, 2017

簡單的虛擬碼範例:

create function myfunc (someparam text, desired_return_column_name text)
returns table (somekeyname int, MAGIC_DYNAMIC_NAME text)
language SQL
as $funcdef$
 select
   somekeyname,
   fieldofinterest as <MAGIC HERE?> desired_return_column_name
 from the_base_table
 where some_other_field = someparam
$funcdef$;

在英語中,如何使 Postgres (9.6) 中的 SQL 函式返回一個具有靜態定義類型的表,但其中一個返回的列名是根據傳入的參數命名的?

如果 SQL 函式無法做到這一點,那麼 PL/pgSQL 函式是否可以?

不,這在函式中是不可能的,與它們的語言無關。函式結果集的結構始終是靜態的,就像任何給定查詢的結果集一樣。事實上它是相關的,因為這個結構(列名和類型)必須合併到呼叫函式的 SQL 查詢中。

請記住,客戶端應用程序必須能夠在執行之前準備查詢並獲得其結果的描述。此外,準備好的查詢可以使用不同的參數重複執行,並且不能在執行過程中返回不同的結構。如果一個函式可以獨立且動態地決定它想要返回什麼結構,那麼就不可能保證該屬性。

我不確定文件是否在某處明確指出了這一點(當然它傾向於描述可以做的事情,而不是不可能的事情),但協議流文件中的一些內容支持這個答案:

描述消息(門戶變體)指定現有門戶的名稱(或未命名門戶的空字元串)。響應是一個RowDescription 消息,描述將通過執行門戶返回的行;如果門戶不包含將返回行的查詢,則為 NoData 消息;或 ErrorResponse 如果沒有這樣的門戶。

在未來的版本(PostgreSQL 11 或更高版本)中,我們可能有儲存過程,它們不是通過 SQL 查詢呼叫,而是通過CALL不與特定結果集結構綁定的特殊語句呼叫。事實上,儲存過程應該能夠返回多個具有不同結構的結果集,而無需事先聲明返回類型。這目前正在 -hackers 郵件列表中進行處理和討論(請參閱來自過程的動態結果集和 SQL 過程的相關最近執行緒)。

但是從 PostgreSQL 10 開始,除了使用 JSON 或 XML 等封裝類型之外,實際上無法獲得動態結果集。

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