创建一个基于表名和 ID 进行搜索的 POSTGRESQL 函数

问题描述 投票:0回答:1

我正在尝试创建一个可以从应用程序调用的函数,该应用程序返回搜索的整个表的结果。我期望该函数返回用户表的所有列以及它所连接的变量定义表,其结果仅限于用户 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
postgresql function variables
1个回答
0
投票

您需要动态 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
    作为记录类型 两个连接表;
  • 小心,该函数容易受到 SQL 注入;
  • 最好不要在列名称和标识符中使用大写字母

不相关,但我不确定使用动态表名称是否是一个好主意。也许回顾一下你的数据设计?

© www.soinside.com 2019 - 2024. All rights reserved.