月份對照與常用設定
JAN-1 FEB-2 MAR-3 APR-4 MAY-5 JUN-6
JUL-7 AUG-8 SEP-9 OCT-10 NOV-11 DEC-12
登入驗證觸發器範本
DECLARE
v_flag VARCHAR2(80) := NULL;
v_count NUMBER := 1;
v_result NUMBER;
BEGIN
LOOP
LOGON(USERNAME, PASSWORD || '@' || CONNECT, PROPERTY_FALSE);
v_flag := GET_APPLICATION_PROPERTY(DATASOURCE);
EXIT WHEN v_count > 8 OR v_flag = 'ORACLE';
v_count := v_count + 1;
END LOOP;
IF v_flag != 'ORACLE' THEN
SET_ALERT_PROPERTY('ALERT_LOGIN', ALERT_MESSAGE_TEXT, '登入失敗,請重試');
v_result := SHOW_ALERT('ALERT_LOGIN');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
基表查詢與變數範疇
-- 執行基表查詢
SET_BLOCK_PROPERTY('BLOCK_NAME', DEFAULT_WHERE, '條件式');
GO_BLOCK('BLOCK_NAME');
EXECUTE_QUERY;
-- 變數三種層級
:BLOCK.ITEM -- 區塊項目
:PARAMETER.PARAM_NAME -- 參數
:GLOBAL.GLOBAL_NAME -- 全域變數
常用內建函數分類速查
| 分類 | 函數/語法 | 說明 |
| 字串 | UPPER/LOWER/INITCAP | 大小寫轉換 |
| LPAD/RPAD(str, len, pad) | 左右填充 |
| LTRIM/RTRIM(str, set) | 左右修剪 |
| INSTR(str, substr, pos, occ) | 子字串位置 |
| 數值 | ABS/MOD/SIGN | 絕對值/模數/符號 |
| ROUND/TRUNC(val, prec) | 四捨五入/截斷 |
| FLOOR/CEIL | 向下/向上取整 |
| GREATEST/LEAST(list) | 最大/最小值 |
| DECODE(val, if1, then1, ..., else) | 多重條件判斷 |
| NVL(val, default) | 空值替換 |
| 彙總 | AVG/COUNT/MAX/MIN/SUM | 多行運算 |
| TRANSLATE(str, from, to) | 字元對照轉換 |
| SUBSTR(str, pos, len) | 子字串擷取 |
游標屬性與迴圈模式
-- 顯式游標屬性
%ISOPEN -- 是否開啟
%FOUND -- 最近 FETCH 有資料
%NOTFOUND -- 最近 FETCH 無資料
%ROWCOUNT -- 已擷取行數
-- 四種迴圈
LOOP ... EXIT WHEN ... END LOOP; -- 基本
WHILE condition LOOP ... END LOOP; -- 條件
FOR i IN start..end LOOP ... END LOOP; -- 數值範圍
FOR rec IN cursor LOOP ... END LOOP; -- 游標
例外處理標準語法
EXCEPTION
WHEN NO_DATA_FOUND THEN -- 查無資料
WHEN TOO_MANY_ROWS THEN -- 多行結果
WHEN INVALID_NUMBER THEN -- 字串轉數字失敗
WHEN ZERO_DIVIDE THEN -- 除零
WHEN DUP_VAL_ON_INDEX THEN -- 唯一鍵衝突
WHEN INVALID_CURSOR THEN -- 非法游標操作
WHEN VALUE_ERROR THEN -- 數值/字串轉換錯誤
WHEN OTHERS THEN -- 捕獲所有其他例外
END;
TEXT_IO 檔案操作與 OLE2 整合
-- 寫入檔案
DECLARE
v_file TEXT_IO.FILE_TYPE;
BEGIN
v_file := TEXT_IO.FOPEN('c:\log.txt', 'W');
TEXT_IO.PUT_LINE(v_file, '訊息內容');
TEXT_IO.FCLOSE(v_file);
END;
-- 讀取檔案
DECLARE
v_file TEXT_IO.FILE_TYPE;
v_line VARCHAR2(100);
BEGIN
v_file := TEXT_IO.FOPEN('c:\log.txt', 'R');
IF TEXT_IO.IS_OPEN(v_file) THEN
TEXT_IO.GET_LINE(v_file, v_line);
END IF;
TEXT_IO.FCLOSE(v_file);
END;
-- OLE2 呼叫 Word 開啟文件
DECLARE
v_args OLE2.LIST_TYPE;
BEGIN
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, :OLE.WORD_DOC);
OLE2.INVOKE(Word.hApp, 'FileOpen', v_args);
OLE2.DESTROY_ARGLIST(v_args);
END;
刪除重複資料經典語法
DELETE FROM emp e
WHERE e.rowid > (
SELECT MIN(f.rowid) FROM emp f
WHERE f.empno = e.empno
);