Postgresql
如何記錄由 pl/pgsql 函式執行的 DML 語句?
我有一個 pl/pgsql 函式(見下文),它列出了一些欄位並使用動態構造的 UPDATE 命令清除它們的內容。
當我設置時
log_statement = 'mod'
,我在執行該函式時在日誌上看不到任何內容SELECT fnct_clear_temp_fields();
。當我設置log_statement = 'all'
並執行我可以SELECT fnct_clear_temp_fields();
在日誌中看到的功能時,而不是底層的 UPDATE 命令。有沒有辦法讓 UPDATE 命令也出現在日誌中?
有關資訊,這裡是函式:
CREATE OR REPLACE FUNCTION fnct_clear_temp_fields() RETURNS VOID AS $$ DECLARE --Put into a cursor a view dynamically listing all user-defined fields beginning with 'temp_' dataset_1 CURSOR FOR SELECT column_name, table_name FROM information_schema.tables NATURAL JOIN information_schema.columns WHERE table_schema='public' AND table_type='BASE TABLE' AND column_name ~ '^temp_' ORDER BY table_name,column_name; --Record variable to go through each line of the view above dataset_1_row RECORD; BEGIN OPEN dataset_1; --Open the cursor FETCH dataset_1 INTO dataset_1_row; --first row of the view WHILE FOUND LOOP RAISE NOTICE 'Table: %, Column: %', dataset_1_row.table_name,dataset_1_row.column_name; --Set to NULL the contents of the current 'temp_' column EXECUTE 'UPDATE '||dataset_1_row.table_name||' SET '||dataset_1_row.column_name||'=NULL WHERE '||dataset_1_row.column_name||' IS NOT NULL'; FETCH dataset_1 INTO dataset_1_row; --next row please. END LOOP; --while end CLOSE dataset_1; RETURN; END; $$ LANGUAGE plpgsql;
所以,我的建議是一個實際的答案:
如果您僅在此函式中需要它,則可以執行
RAISE LOG '%', your_statement;
, 或在您的實際程式碼中:... DECLARE exec_str text; ... --Set to NULL the contents of the current 'temp_' column exec_str := 'UPDATE '||dataset_1_row.table_name|| 'SET '||dataset_1_row.column_name||'=NULL WHERE '||dataset_1_row.column_name||' IS NOT NULL'; RAISE LOG 'Query executed: %', exec_str; EXECUTE exec_str; ...
另外,我發現
FOR dataset_1_row IN SELECT ... LOOP END LOOP;
構造更平滑。