2017-10-19 103 views
0

我需要一種方法來從SELECT查詢(遊標)中獲取列的「描述」,例如它們的名稱,數據類型,精度,比例等,在PostgreSQL(或更好的PL/pgSQL)中。如何在PostgreSQL中描述SQL查詢的列(獲取它們的名稱,數據類型等)

我正在從Oracle PL/SQL過渡,我可以使用內置過程dbms_sql.describe_columns獲取此類描述。它返回一個記錄數組,每個記錄對應給定(已解析)遊標的每一列。

教育局已就實施過(https://www.enterprisedb.com/docs/en/9.0/oracompat/Postgres_Plus_Advanced_Server_Oracle_Compatibility_Guide-127.htm#P13324_681237

這樣的查詢的

一個例子:

select col1 from tab where col2 = :a 

我需要一個API(或解決方法)可以被稱爲像這樣(希望):

select query_column_description('select col1 from tab where col2 = :a'); 

,將返回類似於:

{{"col1","numeric"}} 

爲什麼?我們構建這些查詢成爲單獨列的視圖。例如,視圖的查詢將如下所示:

select (select col1 from tab where col2 = t.colA) as col1::numeric 
    from tab_main t 
+0

類似的東西可用psycopg2(https://stackoverflow.com/questions/10252247/how-do-i-get-a-list-of-column-names-from-a-psycopg2-cursor),但我希望我能保持在PL/pgSQL中,所以我不必爲此處理(安裝/學習/等)psycopg2(也許還有一些其他很酷/我需要發現的功能) –

+0

有沒有內置在服務器端。在客戶端,我知道JDBC可以做到這一點,我也猜測ODBC。我假設這兩個接口都使用[SPI](https://www.postgresql.org/docs/current/static/spi-interface-support.html)。 –

+0

如果你沒有問題,請提出答案。謝謝。 – Indent

回答

0

http://sqlfiddle.com/#!17/21c7a/2

您可以使用系統表:

第一步創建您的查詢的臨時視圖(沒有where子句中)

create or replace view temporary view a_view as 
    select col1 from tab 

然後選擇

select 
    row_to_json(t.*) 
from (
    select 
     column_name, 
     data_type 
    from 
     information_schema.columns 
    where 
     table_schema = 'public' and 
     table_name = 'a_view' 
) as t 
+0

謝謝@Indent。我將通過創建臨時視圖來使用您的解決方法。 –

+0

好的,很酷。如果你覺得沒問題,請提出答案。謝謝。祝你有美好的一天。 – Indent

+0

對不起@Indent,因爲我的低信譽,我無法贊成。然而你的答案幫了我很多。再次感謝。 –

相關問題