Postgresql

如何記錄由 pl/pgsql 函式執行的 DML 語句?

  • January 9, 2018

我有一個 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;

構造更平滑。

引用自:https://dba.stackexchange.com/questions/71178