【问题标题】:Use variable in Postgres pgplsql procedure with CTE在带有 CTE 的 Postgres pgplsql 过程中使用变量
【发布时间】:2021-10-08 19:51:45
【问题描述】:

更新:我尝试了动态 SQL (EXECUTE FORMAT...),但遇到语法错误,并看到 google/其他 stackoverflow 帖子说不可能使用 CTE 进行动态查询,除非我仍然做错了什么

我正在尝试将一些变量注入到我的 pgplsql 过程中,该过程具有我使用的 CTE。我到处搜索,但这完全没有价值,因为大多数帖子都围绕着 mysql/sql 服务器,或者他们正在做一些超出我想做的事情的范围。我有一个简单的 pgplsql 过程:

CREATE OR REPLACE PROCEDURE public.some_dumb_procedure(batch_size integer, tbl_nm text)
    LANGUAGE plpgsql
AS
$procedure$
declare
    
begin
            // CTE expression here
            WITH my_dumb_CTE_list AS (select co.col1, co.col2, col_val
                                from tbl_nm co // I need to inject the table name here dynamically
                                where exists(select 1
                                             from crappy_table c
                                             where c.id = co.customer_ref_id
                                               and co.offer_expiry_date < now() - interval '180 days')
                                  and not exists(select 1 from super_stupid_list ssl where tbl_nm = 'master' and ssl.id = co.id)
                                limit batch_size
            )

            INSERT INTO my_dumb_table
            (select *
            from my_dumb_CTE_list);

            commit;
           
end;
$procedure$
;

所以它会被称为

call some_dumb_procedure(50000, 10000, 'thetable');

如您所见,我只是想将tbl_nm 过程参数注入到CTE 内的子查询中。由于某些原因,batch_size 变量可以正常工作并被注入到 limit 表达式中(参见上面的示例,其中我将 50,000 作为函数的第一个参数传递,但 tbl_nm 绝对不会注入。我尝试声明它作为变量并执行SELECT... INTO,但没有任何效果。

你到底是如何将变量插入/注入到 pgplsql 过程中的? \

【问题讨论】:

  • 这能回答你的问题吗? Postgres Dynamic Query Function
  • @JGH 我遇到了 EXECUTE FORMAT 的异常,我看到其他 stackoverflow 帖子说 CTE 内部嵌套了动态 EXECUTE 查询是不可能的?
  • 只需将整个查询 - 包括 cte - 放在 execute 语句中
  • @JGH 正是我所需要的,谢谢!如果您将您写的内容发布为答案,我会非常接受作为最佳答案

标签: postgresql variables stored-procedures plpgsql common-table-expression


【解决方案1】:

整个查询 - 包括 CTE - 应该动态执行

EXECUTE format(
    'WITH myCTE as (select * from %I)
    INSERT INTO aTable SELECT * FROM myCTE',
    param_table_name
  );

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多