【发布时间】: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