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

时间:2019-03-25 04:22:41

标签: postgresql

  • 在postgres中的select查询中,在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;

代替测试表

2 个答案:

答案 0 :(得分:0)

您可以使用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;

答案 1 :(得分:0)

对于架构和表,您不需要那些局部变量。 使用format选项构造查询,并使用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以返回查询结果。