常用系統變數函數
| 函數 | 回傳值 | 典型用途 | 範例 |
SYSDATE | 資料庫伺服器當前日期時間(含秒) | 預設值、時間篩選、審計欄位 | WHERE created_dt BETWEEN SYSDATE-30 AND SYSDATE |
SYSTIMESTAMP | 含時區與毫秒的時間戳記 | 高精度計時、跨時區應用 | SELECT SYSTIMESTAMP FROM dual |
CURRENT_DATE | Session 時區的當前日期 | 用戶本地時間顯示 | ALTER SESSION SET TIME_ZONE='Asia/Taipei' |
CURRENT_TIMESTAMP | Session 時區的當前時間戳記 | 同上,含毫秒 | |
USER | 當前登入 Schema 名稱 | 權限檢查、動態 SQL | SELECT USER FROM dual |
UID | 當前用戶 ID(數值) | 同上 | |
USERENV(parameter) | Session 環境資訊 | 稽核、診斷、條件邏輯 | 見下表 |
USERENV 參數速查
| 參數 | 說明 | 範例回傳 |
SESSIONID | Session 唯一識別碼 | 123456 |
ENTRYID | 審計項目序號 | 789 |
ISDBA | 是否具 DBA 權限 | TRUE/FALSE |
CLIENT_INFO | 用戶自訂資訊(DBMS_APPLICATION_INFO.SET_CLIENT_INFO) | BatchJob_202401 |
MODULE | 模組名稱(SET_MODULE) | OrderEntry |
ACTION | 動作名稱(SET_ACTION) | InsertOrder |
LANGUAGE | 語言與字元集 | AMERICAN_AMERICA.AL32UTF8 |
TERMINAL | 客戶端終端機名稱 | WORKSTATION01 |
IP_ADDRESS | 客戶端 IP(需啟用 SQL*Net 追蹤) | 192.168.1.50 |
HOST | 資料庫主機名 | db-server-01 |
INSTANCE | Instance 名稱 | ORCL |
實用範例
1. 最近 30 天銷售查詢
SELECT * FROM sales
WHERE sale_date BETWEEN TRUNC(SYSDATE) - 30 AND TRUNC(SYSDATE);
2. 審計觸發器記錄用戶與程式
CREATE OR REPLACE TRIGGER trg_sales_audit
BEFORE INSERT ON sales
FOR EACH ROW
BEGIN
:NEW.created_by := USER;
:NEW.created_at := SYSDATE;
:NEW.client_ip := USERENV('IP_ADDRESS');
:NEW.module := USERENV('MODULE');
END;
/
3. 設定應用程式上下文(便於 USERENV 讀取)
EXEC DBMS_APPLICATION_INFO.SET_MODULE('OrderSys', 'CreateOrder');
EXEC DBMS_APPLICATION_INFO.SET_CLIENT_INFO('Batch_20240115');
EXEC DBMS_APPLICATION_INFO.SET_ACTION('ValidatePayment');
注意事項
SYSDATE 回傳 DATE 型別(精度到秒);需毫秒請用 SYSTIMESTAMP 或 CURRENT_TIMESTAMP。
USERENV 在 12c 後部分參數改用 SYS_CONTEXT('USERENV', 'param'),建議改用新語法:
SYS_CONTEXT('USERENV', 'SESSION_USER') 等同 USER。
- 觸發器、View、函數中引用
SYSDATE 會在「陳述式執行時」取值,同一陳述式內多次引用值相同。