我正在尝试创建一个可以从应用程序调用的函数,该应用程序返回搜索的整个表的结果。我期望该函数返回用户表的所有列以及它所连接的变量定义表,其结果仅限于用户 ID(即 uuid)。
这是我最接近解决这个问题的方法。我尝试了一些变体,但即使我可以让 SQL 接受该变量,当我尝试查询它时它也不会成功调用它。
create or replace function DynamicTableSearch(Table_Name varchar,User_ID uuid)
returns setof tmp_table as $$
declare _userid uuid;
declare _tablename varchar;
result tmp_table;
BEGIN
SELECT 'efaad10a-6e0b-4b52-8d55-2c4eefd84cd5' INTO _userid;
select '"Table_Name"' into _tablename;
--DROP TABLE IF EXISTS tmp_table;
--CREATE TEMPORARY TABLE tmp_table AS
SELECT * FROM public."Users" u
join public._tablename x on u."id" = x."UsersID"
into tmp_table
WHERE id = _userid;
return tmp_table
--RETURN tmp_table;
END $$ language plpgsql
您需要动态 SQL。
create or replace function dynamictablesearch(table_name text, arg_user_id uuid)
returns setof tmp_table as $$
DECLARE
dynsql text := 'SELECT * FROM public."Users" u
join public.%I x on u."id" = x."UsersID"
WHERE id = %L';
BEGIN
return query execute format(dynsql, table_name, arg_user_id);
END $$ language plpgsql;
备注:
tmp_table
作为记录类型
两个连接表;不相关,但我不确定使用动态表名称是否是一个好主意。也许回顾一下你的数据设计?