一、月份縮寫對照表
JAN-1 FEB-2 MAR-3 APR-4 MAY-5 JUN-6
JUL-7 AUG-8 SEP-9 OCT-10 NOV-11 DEC-12
二、常用環境設定與 Forms 觸發器範例
ON-LOGON 觸發器:多重資料源登入重試邏輯
DECLARE
flag VARCHAR2(80) := NULL;
cou NUMBER := 1;
n NUMBER;
BEGIN
LOOP
LOGON(USERNAME, PASSWORD || '@' || CONNECT, PROPERTY_FALSE, ...);
flag := GET_APPLICATION_PROPERTY(DATASOURCE);
EXIT WHEN cou > 8 OR flag = 'Oracle';
cou := cou + 1;
END LOOP;
IF flag <> 'Oracle' THEN
SET_ALERT_PROPERTY('a_1', ALERT_MESSAGE_TEXT, '登錄失敗,請返回重試');
n := SHOW_ALERT('a_1');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
對基表執行查詢
SET_BLOCK_PROPERTY('Block_Name', DEFAULT_WHERE, 'WHERE ...');
GO_BLOCK('Block_Name');
EXECUTE_QUERY;
三、變數類型與作用域
- 區域變數:PL/SQL 區塊內宣告。
- 全域變數:
:block.item、:parameter.v_name、:global.v_name。
四、常用內建函數速查
視窗控制
SYNCHRONIZE; -- 同步顯示
EXECUTE_TRIGGER('TRIGGER_NAME');-- 觸發指定 Trigger
CLEAR_BLOCK(NO_VALIDATE); -- 清除區塊(不驗證)
警示視窗
SET_ALERT_PROPERTY('Alert_Name', ALERT_MESSAGE_TEXT, 'message');
n := SHOW_ALERT('Alert_Name');
IF n = ALERT_BUTTON1 THEN ... ELSIF n = ALERT_BUTTON2 THEN ... END IF;
視窗屬性設定
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW, WINDOW_STATE, MAXIMIZE|MINIMIZE);
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW, TITLE, 'TEXT');
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW, REMOVE_ON_EXIT, PROPERTY_FALSE|TRUE);
系統訊息等級
:SYSTEM.MESSAGE_LEVEL := '5|10|15|20';
Item 屬性控制
SET_ITEM_PROPERTY('Block.Item', ENABLED, PROPERTY_TRUE|FALSE);
SET_ITEM_PROPERTY('Block.Item', NAVIGABLE, PROPERTY_TRUE|FALSE);
SET_ITEM_PROPERTY('Block.Item', VISUAL_ATTRIBUTE, 'vname');
SET_ITEM_PROPERTY('Block.Item', DISPLAYED, TRUE|FALSE);
SET_ITEM_PROPERTY('Block.Item', POSITION, x, y);
SET_ITEM_PROPERTY('Block.Item', ITEM_SIZE, x, y);
SET_ITEM_PROPERTY('Block.Item', LABEL, 'MESSAGE');
List Item 操作
CLEAR_LIST('b1.fkfs');
POPULATE_GROUP('fkfs');
POPULATE_LIST('b1.fkfs', 'fkfs');
ADD_LIST_ELEMENT(list_name, index, label, value);
DELETE_LIST_ELEMENT(list_name, index);
GET_LIST_ELEMENT_COUNT(list_name);
GET_LIST_ELEMENT_LABEL(list_name, index);
GET_LIST_ELEMENT_VALUE(list_name, index);
Timer 與編輯器
CREATE_TIMER('emp_timer', 60000, REPEAT|NO_REPEAT); -- 1 分鐘週期
DECLARE ed_id Editor; status BOOLEAN;
BEGIN
ed_id := FIND_EDITOR('edit_name');
IF NOT ID_NULL(ed_id) THEN
SHOW_EDITOR(ed_id, NULL, :block.item, status);
ELSE RAISE FORM_TRIGGER_FAILURE; END IF;
END;
LOV (List of Values)
DECLARE lv_id LOV; status BOOLEAN;
BEGIN
lv_id := FIND_LOV('lov_name');
status := SHOW_LOV(lv_id, 10, 20);
END;
例外處理
DECLARE err_1 EXCEPTION;
BEGIN
IF ... THEN RAISE err_1; END IF;
EXCEPTION
WHEN err_1 THEN ...;
END;
五、常用 SQL 函數速查
- 字串:
UPPER/LOWER/INITCAP, LPAD/RPAD, LTRIM/RTRIM, INSTR, SUBSTR, TRANSLATE, ASCII
- 數值:
ABS, MOD, ROUND/TRUNC, SIGN, GREATEST/LEAST, FLOOR/CEIL
- 彙總:
AVG/COUNT/MAX/MIN/SUM
- 條件:
DECODE, NVL
- 排序:
ORDER BY expr|position ASC|DESC
六、游標屬性與迴圈結構
%ISOPEN -- 是否開啟
%NOTFOUND -- 最近 FETCH 無資料
%FOUND -- 最近 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;
七、常見預定義例外
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 ...
八、TEXT_IO 檔案操作
DECLARE out_file TEXT_IO.FILE_TYPE; L VARCHAR2(100);
BEGIN
out_file := TEXT_IO.FOPEN('c:\log.txt', 'r');
IF TEXT_IO.IS_OPEN(out_file) THEN
TEXT_IO.GET_LINE(out_file, L);
...
END IF;
TEXT_IO.FCLOSE(out_file);
END;
九、其他實用片段
- 清除全域變數:
ERASE('global.var_name')
- 隱藏物件:
HIDE_WINDOW|VIEW|MENU('name')
- 參數列傳遞報表:
CREATE_PARAMETER_LIST, ADD_PARAMETER, RUN_PRODUCT
- OLE 自動化:
OLE2.CREATE_OBJ, OLE2.INVOKE
- 刪除重複資料:
DELETE FROM emp e WHERE e.rowid > (SELECT MIN(f.rowid) FROM emp f WHERE f.empno = e.empno);