如何从 PostgreSQL 中的 SQL 语句中获取字段信息?

How to get the fields' information from a SQL statement in PostgreSQL?

我想从 SQL 语句中获取字段的描述。也就是说,我想创建一个函数,使用sql语句作为输入参数,returns一个jsonb值来描述字段的信息。

如果我知道 table 的名字,我可以这样做:

SELECT column_name, data_type
FROM information_schema."columns"
WHERE "table_name"='TABLE-NAME'

但是如果我只有selectsql语句,比如select 0::bigint as fid, 'A'::text as fname;,我怎么能在一个函数中得到column_namedata_type .

下面是当我知道 table 名称时函数的结构:

create or replace function public.getfieldsfromtable(vtable text)
    returns jsonb
    language 'plpgsql'
    cost 100
    volatile 
as $body$ declare
    jfields jsonb='[]'::jsonb;
begin
    select 
        array_to_json(array_agg(row_to_json(t))) 
    into jfields
    from (
        select column_name, data_type
        from information_schema."columns"
        where "table_name"=vtable
    ) t;
    return jfields;
end;
$body$;

但是如果我只有一个 Select SQL 语句怎么办?

create or replace function public.getfieldsfromsql(vsql text)
    returns jsonb
    language 'plpgsql'
    cost 100
    volatile 
as $body$ declare
    jfields jsonb='[]'::jsonb;
begin
    ... what can i do?
    return jfields;
end;
$body$;

如果在 C 扩展中做到这一点可能很容易,但在 PL/pgSQL 中几乎是不可能的。对于存储过程,没有 API,如何在不执行查询的情况下检测结果的结构。