我正在使用基本的 plpgsql EXECUTE... FORMAT動態腳本和FOR...IN回圈。問題是,LOOP有一個變數/指標(就像任何語言中的任何 FOR LOOP 一樣),它遍歷EXECUTE 中SELECT...查詢的查詢結果集。我需要動態地在句點/點之后制作列名部分,因此使用識別符號(即)作為它,如您所知,從該變數中獲取資料(在此列中是一個sql陳述句)的方法/指標是使用“點表示法”,即temprecord.column_name%I, %s, %LALTER TABLE
/* Output employee names from column "names" in Employee table */
FOR temprecord IN
EXECUTE format('SELECT *
FROM %I t', ''Employee'')
LOOP
EXECUTE temprecord.names; -- THIS WORKS FINE WHEN I HARDCODE IT. I CAN'T SEEM TO MAKE IT DYNAMIC
END LOOP;
所以當我硬編碼時,上述作業正常temprecord.names。問題是我想要列名動態,所以如果不同的呼叫者/方法呼叫我的函式,我可以通過臨時記錄迭代器選擇不同的列,并執行這些資料。
我在下面嘗試了很多次,到目前為止我得到的最好的回應是我在列中的 sql 查詢(如上所述)執行了,但是,它顯示了語法錯誤和截斷錯誤,但我很清楚注意到它回傳了我表的所有三列并將這些列連接在一起。但我知道真正的問題是變數temprecord沒有選擇指定列名的點符號temprecord.column_name_here,這就是為什么它回傳所有列并在此處拋出截斷。正如我上面所說,它在硬編碼時有效。
IE
/* Using the $$ for string formatting here */
CREATE OR REPLACE PROCEDURE my_proc(drop_or_add text)
LANGUAGE plpgsql
AS
$procedure$
DECLARE
temprecord record;
col_nm text;
BEGIN
col_nm := concat_ws('_','sql',drop_or_add); -- SHOULD CONCATENATE TO COLUMN NAME, I.E. sql_drop OR sql_add WHICH HOLDS SQL "ALTER TABLE..." QUERY
FOR temprecord IN
EXECUTE format($f$ SELECT t.col1, t.col2, t.col3%s
FROM some_tbl t
WHERE t.col4 = %L, drop_or_add, 'blue')
LOOP
EXECUTE format($f$ %I.%s $f$, "temprecord", col_nm);
END LOOP;
END
$procedure$;
希望這些語法和我的邏輯都不會令人困惑。同樣,我只是簡單地使用temprecord迭代器變數回圈并嘗試訪問我的資料庫表的某些列,這些列包含一些 SQL 陳述句并且需要根據傳遞給我的程序的引數是動態的。因此,可能EXECUTE temprecord.sql_drop或EXECUTE temprecord.sql_add可以執行。
%s當我使用點表示法訪問一串列時,我總是在我的其他 plpgsql 腳本中使用tbl1.id = tbl2.%,它總是作業正常。我已經嘗試了基本上所有可能的組合,但我會在這里列出一些,即
EXECUTE format($f$ %I.%s $f$, "temprecord", col_nm);
EXECUTE format($f$ %I%s $f$, "temprecord", '.sql_drop');
EXECUTE format($f$ %I.%s $f$, temprecord, col_nm);
EXECUTE format($f$ %I.%I $f$, "temprecord", col_nm);
EXECUTE format($f$ %I.%I $f$, "temprecord", "col_nm");
.
..
...
uj5u.com熱心網友回復:
我能夠找到解決方案,但是,我絕對嘗試了識別符號的所有組合,但在EXECUTE FORMAT塊中連接記錄迭代器和列名時,我無法使其作業。所以我的解決方案是在第二個EXECUTE之前粘貼一個CASE陳述句......然后直接將該字串變數傳遞給EXECUTE并僅使用一個識別符號。似乎問題在于任何時候我試圖temprecord.column_name在 FORMAT 內部劃分/拆分內部,即EXECUTE FORMAT($f$ %I.$s $f$, temprecord,column_name),它都行不通。但是,我可以使用 中的常規表和列來執行此操作SELECT.. FROM WHERE t1.col1 = t2.%,因此我不確定它是否與record變數不同,因為它是FOR... IN LOOP 的一部分 或者其他的東西。
解決方案
CASE
WHEN drop_or_add ILIKE '%drop%' THEN
v_exect_sql := temprow.sql_drop;
WHEN drop_or_add ILIKE '
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321688.html
標籤:PostgreSQL plpgsql 动态-sql 执行 for 循环
