当前位置:  开发笔记 > 编程语言 > 正文

如何在postgresql函数中使用变量进行循环查询

如何解决《如何在postgresql函数中使用变量进行循环查询》经验,为你挑选了1个好方法。

我在postgresql(版本9.4.4)中有一个相当复杂的功能,我需要一些帮助.

我在我的函数中声明了一个循环(下面有大量工作):

CREATE OR REPLACE function getRSI(
    psymbol varchar,
    pstarttime timestamp with time zone,
    pendtime timestamp with time zone,
    pduration double precision,
    ptable varchar
    )
 RETURNS SETOF rsi AS
 $BODY$
 declare
    row_data record;
    -- some variables
 begin
    FOR row_data IN SELECT datetime, value FROM "4" WHERE symbol = 'AAPL' 
    AND datetime BETWEEN '2015-11-23 09:30:00 -0500' AND 
    '2015-11-23 15:59:59-0500' LOOP
       -- enter code here
    END LOOP;
 end
 $BODY$ LANGUAGE plpgsql

这很完美,我可以得到我的功能的结果,并让它为我的所有数字.

我想让循环像这样工作:

FOR row_data in select datetime, value from quote_ident(ptable) 
where symbol = quote_literal(psymbol) and datetime 
between quote_literal(pstarttime) AND quote_literal(pendtime) LOOP

其中ptable,psymbol,pstarttime并且pendtime是从函数调用传递变量.

但我很乐意对表进行硬编码,并根据变量得到其他三个东西:

FOR row_data in select datetime, value from "4" where symbol =
quote_literal(psymbol) and datetime between quote_literal(pstarttime)
AND quote_literal(pendtime) LOOP

是的,我知道我有一个以数字命名的表,在我当前的设置中我无能为力.

当我尝试使用上述任一设置调用该函数时,我只是得到一个空白.任何帮助,将不胜感激.我找不到任何关于在for循环中使用变量的文档,因此可能无法实现.



1> Erwin Brands..:

您需要动态SQL EXECUTE- 但用于参数化表名(或其他标识符) - 不需要参数化.

而且也没有串联参数值到查询.这比必要的更昂贵且容易出错.请改用相应的USING条款EXECUTE.

FOR row_data IN
   EXECUTE '
    SELECT datetime, value FROM ' || quote_ident(ptable) || '
    WHERE  symbol = $1
    AND    datetime between $2 AND $3'
   USING psymbol, pstarttime, pendtime
LOOP
  -- do stuff
END LOOP;

或使用format():

   EXECUTE format('
    SELECT datetime, value FROM %I 
    WHERE  symbol = $1
    AND    datetime between $2 AND $3', ptable)
   USING psymbol, pstarttime, pendtime

有关:

关于record类型的手册

表名作为PostgreSQL函数参数

plpgsql - 在declare语句中使用动态表名

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有