首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 應用開發實戰經驗彙編(一):Forms/PL/SQL 常用技巧與語法速查

     編輯:Oracle 資料庫相關知識

月份對照與常用設定

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
);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved