如何从 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_name
和data_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,如何在不执行查询的情况下检测结果的结构。
我想从 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_name
和data_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,如何在不执行查询的情况下检测结果的结构。