我在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循环中使用变量的文档,因此可能无法实现.
您需要动态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语句中使用动态表名