更新:我嘗試了動態 SQL ( EXECUTE FORMAT...),但遇到了語法錯誤,并看到 google/other stackoverflow 帖子說不可能使用 CTE 進行動態查詢,除非我仍然做錯了什么
我正在嘗試將一些變數注入到我使用的具有 CTE 的 pgplsql 程序中。我到處搜索,但它完全沒有價值,因為大多數帖子都圍繞著 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絕對從不注入。我嘗試將其宣告為變數并執行 aSELECT... INTO但沒有任何效果.
你到底是如何將變數插入/注入 pgplsql 程式的?\
uj5u.com熱心網友回復:
整個查詢 - 包括 CTE - 應該動態執行
EXECUTE format(
'WITH myCTE as (select * from %I)
INSERT INTO aTable SELECT * FROM myCTE',
param_table_name
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320791.html
標籤:PostgreSQL 变量 存储过程 plpgsql 公用表表达式
上一篇:如何洗掉R中名稱為日期的一些變數
下一篇:Linux -查找功能
