我需要一个如何在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 ......
答案 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));
答案 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);