【问题标题】:Pass a schema name and table name dynamically in FROM in a select query in Postgres在 Postgres 的选择查询中在 FROM 中动态传递模式名称和表名称
【发布时间】: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;

代替测试表

【问题讨论】:

    标签: postgresql


    【解决方案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 注入不安全。
      猜你喜欢
      • 2016-08-15
      • 2019-09-05
      • 2015-04-28
      • 1970-01-01
      • 2019-02-21
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      相关资源
      最近更新 更多