【问题标题】:How to use timestamp variable in EXECUTE format statement如何在 EXECUTE 格式语句中使用时间戳变量
【发布时间】:2015-01-09 05:27:18
【问题描述】:

我需要一个示例,说明如何在 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] 错误:“17”处或附近的语法错误 第 1 行:...T * FROM "mtTable" WHERE datetime

【问题讨论】:

    标签: function postgresql timestamp execute


    【解决方案1】:

    你需要转义你的引号:

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

    【讨论】:

    • 感谢您的打勾,但我更喜欢@Houari 的回答!
    【解决方案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

    【讨论】:

      【解决方案3】:

      如果您使用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;
      

      它不太容易出错,并且您不会以这种方式处理文本表示(format 会将其参数转换为它们的文本表示并执行将它们适当地转换回来,但这也可能导致 unknown 类型) .

      通常,它们也可以混合使用,但前提是存在来自变量的标识符。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 2021-12-02
        • 2018-04-20
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 2020-01-18
        相关资源
        最近更新 更多