在带有 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
);
更新:我尝试了动态 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
);