如何在EXECUTE格式语句中使用timestamp变量

时间:2014-11-12 11:16:40

标签: function postgresql timestamp execute

我需要一个如何在PostgreSQL函数中传递时间戳并在执行语句中使用它的示例。我使用了这样的例子:

CREATE OR REPLACE FUNCTION ref4(b1 timestamp) RETURNS refcursor AS $$   
DECLARE 
mycurs refcursor;

BEGIN 
OPEN mycurs FOR 
 EXECUTE format('SELECT * FROM  myTable WHERE  datetime <= '|| b1 ||'ORDER BY datetime' , b1);
RETURN mycurs;
END;$$ 
language plpgsql;

SELECT ref4( '2009/08/28 17:44:46.240' );

但由于以下错误,它无效:

  

[Err] ERROR:语法错误在“17”或附近      第1行:...... T * FROM“mtTable”WHERE datetime&lt; = 2009-08-28 17:44:46.2 ......

3 个答案:

答案 0 :(得分:2)

替换:

EXECUTE format('SELECT * FROM  myTable WHERE  datetime <= '|| b1 ||'ORDER BY datetime' , b1);

通过

EXECUTE format('SELECT * FROM  myTable WHERE  datetime <= %s ORDER BY datetime' , quote_literal(b1));

quote_literal

format

答案 1 :(得分:2)

如果您使用format(),则应在格式字符串(%s%I%L)中使用占位符,例如:

SELECT format('SELECT * FROM  myTable WHERE datetime <= %L ORDER BY datetime' , b1);

但是:因为你使用EXECUTE,我建议你使用它的USING条款:

EXECUTE 'SELECT * FROM  myTable WHERE datetime <= $1 ORDER BY datetime' USING b1;

它不易出错,并且您不会以这种方式处理文本表示(格式会将其参数转换为文本表示形式,并且执行会根据需要将其转换回来,但这可能会导致unknown类型也是。)

通常,它们也可以混合使用,但只有存在来自变量的标识符时才会混合。

注意,如果你的代码很简单,就不需要EXECUTE,你可以在函数中的sql语句中使用函数参数(只要它们不与现有的列名冲突):

SELECT * FROM  myTable WHERE datetime <= b1 ORDER BY datetime

答案 2 :(得分:0)

你需要逃避你的报价:

EXECUTE format('SELECT * FROM myTable WHERE datetime <= ''' || b1 || ''' ORDER BY datetime' , b1);

相关问题