在 Postgres 的选择查询中在 FROM 中动态传递模式名称和表名称

Posted

技术标签:

【中文标题】在 Postgres 的选择查询中在 FROM 中动态传递模式名称和表名称【英文标题】:Pass a schema name and table name dynamically in FROM in a select query in Postgres 【发布时间】:2019-03-25 04:22:40 【问题描述】: 在 postgres 的选择查询中,在 FROM 中动态传递架构名称和表名称。 我需要在 from(在 select 子句中)动态调用表
CREATE OR REPLACE FUNCTION xx.fn_build_test_(
    IN p_var_archive_schema character varying,
    IN p_var_archive_table character varying)

 RETURNS record AS
 $BODY$
   declare

l_var_archive_schema  VARCHAR;
l_var_archive_table VARCHAR; 
l_var_test VARCHAR[];

BEGIN

l_var_archive_schema  := p_var_archive_schema;
l_var_archive_table   := p_var_archive_table;

SELECT  array
( SELECT TO_CHAR(column_name,'YYYYMMDD')
 FROM "test_table"
 WHERE col1 = 1)
 INTO l_var_test;

END;
$BODY$
LANGUAGE plpgsql
VOLATILE SECURITY INVOKER; 

我需要以下值:

  l_var_archive_schema VARCHAR; l_var_archive_table VARCHAR;

代替测试表

【问题讨论】:

【参考方案1】:

架构和表不需要这些局部变量。 使用格式选项构建查询并使用EXECUTE 动态运行它

CREATE OR REPLACE FUNCTION xx.fn_build_test_(
 IN p_var_archive_schema character varying,
 IN  p_var_archive_table character varying )
 RETURNS record AS
 $BODY$
 DECLARE
  l_var_test VARCHAR[];

 BEGIN

 SELECT  array
  ( SELECT TO_CHAR(column_name,'YYYYMMDD')
    FROM "test_table"
   WHERE col1 = 1
   ) INTO l_var_test;

   EXECUTE format (
     'select col_name FROM %I.%I',
         p_var_archive_schema,p_var_archive_table) 
      --INTO rec_variable;
END;
$BODY$
LANGUAGE plpgsql
VOLATILE SECURITY INVOKER; 

如果你想返回动态查询的结果,你可以使用

RETURNS TABLE 选项,然后执行RETURN QUERY EXECUTE 以返回查询结果。

【讨论】:

【参考方案2】:

您可以使用dynamic SQL。例如更改函数中的 SQL 如下。该函数需要进一步更正,因为根据定义,它应该返回一条记录,但目前不返回任何值。

EXECUTE 'SELECT  array
( SELECT TO_CHAR(column_name,''YYYYMMDD'')
  FROM '||l_var_archive_schema||'.'||l_var_archive_table||' WHERE col1 = 1)'
  INTO l_var_test;

【讨论】:

SQL 注入不安全。

以上是关于在 Postgres 的选择查询中在 FROM 中动态传递模式名称和表名称的主要内容,如果未能解决你的问题,请参考以下文章

在子查询的FROM中使用Postgres窗口语句

Oracle --> Postgres 查询

UPDATE 查询中的 FROM 后的 Postgres 语法错误

使用窗口函数在 Postgres 上使用 SqlAlchemy 限制查询

在 postgres 选择中,将列子查询作为数组返回?

在 postgres 上缓慢选择不同的查询