在带有 CTE 的 Postgres pgplsql 过程中使用变量

Use variable in Postgres pgplsql procedure with CTE

更新:我尝试了动态 SQL (EXECUTE FORMAT...) 但出现语法错误并看到 google/other Whosebug posts 说使用 CTE 的动态查询是可能吧,除非我还是做错了什么

我正在尝试将一些变量注入到我使用的具有 CTE 的 pgplsql 过程中。我谷歌了一遍,但它完全没有价值,因为大多数 post 都围绕着 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 但没有任何效果。

你怎么把 insert/inject 变量转换成 pgplsql 过程? \

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

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