在 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 中动态传递模式名称和表名称的主要内容,如果未能解决你的问题,请参考以下文章
UPDATE 查询中的 FROM 后的 Postgres 语法错误