【问题标题】:Create table with stored function postgresql使用存储函数 postgresql 创建表
【发布时间】:2017-05-23 07:19:16
【问题描述】:

我有如下查询创建表

DROP TABLE IF EXISTS BAJUL;
CREATE TABLE BAJUL AS (
SELECT dt_trx, row_number() OVER (ORDER BY dt_trx DESC) AS row_number
FROM stock_trx_idx
WHERE dt_trx BETWEEN '2017-01-01' AND '2017-02-28'
GROUP BY 1
ORDER BY 1 DESC);

如何在 Postgresql 中使用存储函数创建上表? 我尝试使用以下脚本

CREATE OR REPLACE FUNCTION my_function (dt1 DATE, dt2 DATE)
  RETURNS VOID AS
$func$
BEGIN
EXECUTE format('
    DROP TABLE IF EXISTS tblq;
    CREATE TABLE IF NOT EXISTS tblq AS(
    SELECT dt_trx, row_number() OVER (ORDER BY dt_trx DESC) AS row_number
    FROM stock_trx
    WHERE dt_trx BETWEEN dt1 AND dt2
    GROUP BY 1
    ORDER BY 1 DESC
   )' );

END
$func$ LANGUAGE plpgsql;

但是当我尝试像下面这样执行 SF 时

SELECT my_function ('2017-01-01', '2017-02-28');

我收到错误 --> 错误:列“dt1”不存在

想寻求你的帮助。

感谢和 rgds, 巴渝

【问题讨论】:

  • 你不需要format()函数也不需要EXECUTE语句或者这个。

标签: postgresql stored-functions


【解决方案1】:

使用

format('CREATE ... WHERE dt_trx BETWEEN %L AND %L ...', dt1, dt2)

【讨论】:

    【解决方案2】:

    你的错误很明显。在 SELECT 语句中,

    SELECT dt_trx, row_number() OVER (ORDER BY dt_trx DESC) AS row_number
        FROM stock_trx
        WHERE dt_trx BETWEEN dt1 AND dt2
        GROUP BY 1
        ORDER BY 1 DESC
    

    dt1 列不存在。你没有告诉他你想使用你的变量。尝试将您的字符串与您的变量连接起来。

    顺便说一句,如果您使用该语句创建表,则可以删除 ORDER BY。

    【讨论】:

    • 嗨 Arkhena,是的,我会使用 dt1 作为我的变量,所以当我执行时,我会像下面那样做SELECT my_function ('2017-01-01', '2017-02-28'); 我的问题,如何将该变量传递给 dt1 & dt2
    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2021-12-08
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多