CodeGym /課程 /SQL SELF /用 RAISE NOTICE 做日誌紀錄

用 RAISE NOTICE 做日誌紀錄

SQL SELF
等級 52 , 課堂 1
開放

日誌紀錄就是把應用程式或資料庫運作時的重要事件跟資訊記下來。在 PL/pgSQL 裡這超有用,尤其是你寫的 function 很複雜、會呼叫其他 function、用到 trigger 或是有一堆步驟的時候。這裡有幾個為什麼你一定要做日誌紀錄的重點:

  1. 除錯程式碼:log 幫你搞懂 function 執行到每個階段到底發生什麼事。
  2. 問題診斷:如果 function 沒照你想的跑,log 可以幫你找出錯誤點在哪。
  3. 執行分析:你知道哪些步驟有執行(還有順序),就能優化效能或找到可以改進的地方。
  4. 好維護:想像你一年後打開自己的 function,完全看不懂自己在寫什麼(真的會這樣)。這時候 log 就是你的救星。

RAISE NOTICE — 日誌紀錄的基礎

如果你是工程師,之前有用過 print()console.log() 來除錯,那 RAISE NOTICE 就是 PostgreSQL 世界裡的進階版。這個指令會在 function 執行時把訊息印出來。這些訊息你可以在 console、terminal 或你執行查詢的介面看到。

RAISE NOTICE 的語法

RAISE NOTICE '執行訊息';

但這只是開始。你可以把變數放進訊息裡,讓 log 更有資訊:

RAISE NOTICE '變數目前的值: %', my_variable;

這裡 % 是 placeholder,而 my_variable 就是你想印出來的變數。

如果你想一次印出多個變數,可以這樣寫:

RAISE NOTICE '數值: % 和 %', var1, var2;

RAISE NOTICE 的使用範例

1. 印出變數的值。 在 function 裡宣告一個變數,然後用 RAISE NOTICE 把它的值印出來。

CREATE OR REPLACE FUNCTION debug_variable_example()
RETURNS VOID AS $$
DECLARE
    my_variable INTEGER := 42;
BEGIN
    RAISE NOTICE '變數 my_variable 的值: %', my_variable;
END;
$$ LANGUAGE plpgsql;

當你呼叫這個 function:

SELECT debug_variable_example();

你會在結果看到類似這樣:

NOTICE:  變數 my_variable 的值: 42

2. 記錄執行步驟。 假設你有個 function 要做好幾個步驟。你可以在每個動作後面加 RAISE NOTICE,這樣就能確定一切照你的流程走。

CREATE OR REPLACE FUNCTION process_data()
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE '步驟 1: 開始處理';

    -- 這裡執行一些 SQL
    PERFORM pg_sleep(1); -- 模擬操作

    RAISE NOTICE '步驟 2: 處理中';

    -- 再來一點 SQL
    PERFORM pg_sleep(1); -- 模擬操作

    RAISE NOTICE '步驟 3: 處理完成';
END;
$$ LANGUAGE plpgsql;

呼叫 function:

SELECT process_data();

你會得到:

NOTICE:  步驟 1: 開始處理
NOTICE:  步驟 2: 處理中
NOTICE:  步驟 3: 處理完成

這樣你就隨時知道現在執行到哪個階段。

實用應用

來看一個計算過程日誌的例子。 我們來寫一個 function,計算 1 到 N 的總和,並且把過程記錄下來:

CREATE OR REPLACE FUNCTION sum_with_logging(n INTEGER)
RETURNS INTEGER AS $$
DECLARE
    total INTEGER := 0;
    i INTEGER;
BEGIN
    RAISE NOTICE '開始計算 n = %', n;

    FOR i IN 1..n LOOP
        total := total + i;
        RAISE NOTICE '第 % 步的總和: %', i, total;
    END LOOP;

    RAISE NOTICE '計算結果: %', total;

    RETURN total;
END;
$$ LANGUAGE plpgsql;

用參數 5 呼叫這個 function:

SELECT sum_with_logging(5);

你會看到:

NOTICE:  開始計算 n = 5
NOTICE:  第 1 步的總和: 1
NOTICE:  第 2 步的總和: 3
NOTICE:  第 3 步的總和: 6
NOTICE:  第 4 步的總和: 10
NOTICE:  第 5 步的總和: 15
NOTICE:  計算結果: 15

日誌紀錄小技巧

  1. 把沒用的 log 刪掉:function 寫好、除錯完就把多餘的 RAISE NOTICE 訊息刪掉,才不會讓 terminal 或介面一堆雜訊。
  2. 訊息要有意義:不要只寫「步驟 1」、「步驟 2」。要讓人一看就知道這步在幹嘛。
  3. 小心敏感資訊:log 裡千萬不要放信用卡資料、密碼或其他機密資訊。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION