使用CTE进行Postgres EXECUTE

时间:2018-02-13 20:37:01

标签: postgresql prepared-statement common-table-expression

是否可以使用您从CTE获得的参数执行准备好的声明?

以下示例是我的代码的简化版本,但这完全复制了我的问题。

在没有CTE的情况下,我能走多远:

BEGIN;

CREATE TEMPORARY TABLE testTable
(
    col1 NUMERIC,
    col2 TEXT
) ON COMMIT DROP;

INSERT INTO testTable
VALUES (1, 'foo'), (2, 'bar');

PREPARE myStatement AS
    WITH cteTable AS
    (
        SELECT col1, col2
        FROM testTable
        WHERE col1 = $1
    )
    SELECT col2 FROM cteTable;


EXECUTE myStatement(2);

DEALLOCATE myStatement;
COMMIT;

结果如下:

  

COL2

           

现在,这就是我想要实现的目标:

BEGIN;

CREATE TEMPORARY TABLE testTable
(
    col1 NUMERIC,
    col2 TEXT
) ON COMMIT DROP;

INSERT INTO testTable
VALUES (1, 'foo'), (2, 'bar');

PREPARE myStatement AS
    WITH cteTable AS
    (
        SELECT col1, col2
        FROM testTable
        WHERE col1 = $1
    )
    SELECT col2 FROM cteTable;

-- Using a CTE here to get the parameters for the prepared statement
WITH parameters AS
(
    SELECT 2 val
)
EXECUTE myStatement(SELECT val FROM parameters);

DEALLOCATE myStatement;
COMMIT;

我遇到的错误消息是

  

EXECUTE或其附近的语法错误

即使尝试在不尝试使用CTE值的情况下运行EXECUTE部分,我仍然会收到相同的错误消息。

尽管我没有研究过,但我还没有找到其他人有同样的问题,我想我可能做错了。如果有的话,有人可以指出我正确的方向吗?

由于

1 个答案:

答案 0 :(得分:0)

Vao Tsun所述,这是不可能的。

我已将我准备好的语句转换为一个函数,该函数将返回一个表,然后使用CTE对多个参数的函数SELECT UNION。