「PL/SQL」の編集履歴(バックアップ)一覧はこちら
「PL/SQL」(2008/01/04 (金) 04:58:07) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
-[Oracle]PL/SQL 処理時間計測
#highlight(pl/sql){
DECLARE
TIME_BEFORE BINARY_INTEGER;
TIME_AFTER BINARY_INTEGER;
BEGIN
TIME_BEFORE := DBMS_UTILITY.GET_TIME;
--//処理実行
TIME_AFTER := DBMS_UTILITY.GET_TIME;
DBMS_OUTPUT.PUT_LINE(TIME_AFTER - TIME_BEFORE);
END;
/
--//テストプロシージャ
CREATE OR REPLACE PROCEDURE HATASYS1.TEST_SHORI_JIKAN
IS
TIME_BEFORE BINARY_INTEGER;
TIME_AFTER BINARY_INTEGER;
BEGIN
--//100分の1ミリ秒単位で取得
TIME_BEFORE := DBMS_UTILITY.GET_TIME;
FOR i IN 1..100 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
TIME_AFTER := DBMS_UTILITY.GET_TIME;
DBMS_OUTPUT.PUT_LINE(TO_CHAR( (TIME_AFTER - TIME_BEFORE)/100) || 'sec');
END;
}
-[Oracle]PL/SQL 日付(YYYY,MM,DD)妥当性チェック
#highlight(pl/sql){
/***********************************************************
このFUNCTIONでは、引数の年、月、日より その日付が
妥当であるかを判定します。
返り値:BOOLEAN
***********************************************************/
FUNCTION DATE_CHECK
(
W_YEAR VARCHAR2 := NULL,
W_MONTH VARCHAR2 := NULL,
W_DATE VARCHAR2 := NULL
)
RETURN BOOLEAN
IS
MONTH1 CONSTANT NUMBER := 31;
MONTH2 CONSTANT NUMBER := 28; --//通常の場合の2月の日数
MONTH2_LEAP CONSTANT NUMBER := 29; --//閏年の場合の2月の日数
MONTH3 CONSTANT NUMBER := 31;
MONTH4 CONSTANT NUMBER := 30;
MONTH5 CONSTANT NUMBER := 31;
MONTH6 CONSTANT NUMBER := 30;
MONTH7 CONSTANT NUMBER := 31;
MONTH8 CONSTANT NUMBER := 31;
MONTH9 CONSTANT NUMBER := 30;
MONTH10 CONSTANT NUMBER := 31;
MONTH11 CONSTANT NUMBER := 30;
MONTH12 CONSTANT NUMBER := 31;
BEGIN
IF W_MONTH ='01' THEN
IF TO_NUMBER(W_DATE) <= MONTH1 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '02' THEN
--( ( (strYear%4 == 0)&&(strYear%100 != 0) ) || (strYear%400 == 0) ) )
--//■うるう年のチェック
IF ( ( MOD(TO_NUMBER(W_YEAR),4) = 0) AND (MOD(TO_NUMBER(W_YEAR),100) != 0) ) OR (MOD(TO_NUMBER(W_YEAR),400) = 0) THEN
IF TO_NUMBER(W_DATE) <= MONTH2_LEAP THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSE
IF TO_NUMBER(W_DATE) <= MONTH2 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END IF;
ELSIF W_MONTH = '03' THEN
IF TO_NUMBER(W_DATE) <= MONTH3 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '04' THEN
IF TO_NUMBER(W_DATE) <= MONTH4 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '05' THEN
IF TO_NUMBER(W_DATE) <= MONTH5 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '06' THEN
IF TO_NUMBER(W_DATE) <= MONTH6 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '07' THEN
IF TO_NUMBER(W_DATE) <= MONTH7 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '08' THEN
IF TO_NUMBER(W_DATE) <= MONTH8 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '09' THEN
IF TO_NUMBER(W_DATE) <= MONTH9 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '10' THEN
IF TO_NUMBER(W_DATE) <= MONTH10 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '11' THEN
IF TO_NUMBER(W_DATE) <= MONTH11 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '12' THEN
IF TO_NUMBER(W_DATE) <= MONTH12 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSE --//どの場合にも当てはまらない、入力値がおかしい時
RETURN FALSE;
END IF;
END;
}
-[Oracle]PL/SQL 処理時間計測
#highlight(pl/sql){
DECLARE
TIME_BEFORE BINARY_INTEGER;
TIME_AFTER BINARY_INTEGER;
BEGIN
TIME_BEFORE := DBMS_UTILITY.GET_TIME;
--//処理実行
TIME_AFTER := DBMS_UTILITY.GET_TIME;
DBMS_OUTPUT.PUT_LINE(TIME_AFTER - TIME_BEFORE);
END;
/
--//テストプロシージャ
CREATE OR REPLACE PROCEDURE HATASYS1.TEST_SHORI_JIKAN
IS
TIME_BEFORE BINARY_INTEGER;
TIME_AFTER BINARY_INTEGER;
BEGIN
--//100分の1ミリ秒単位で取得
TIME_BEFORE := DBMS_UTILITY.GET_TIME;
FOR i IN 1..100 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
TIME_AFTER := DBMS_UTILITY.GET_TIME;
DBMS_OUTPUT.PUT_LINE(TO_CHAR( (TIME_AFTER - TIME_BEFORE)/100) || 'sec');
END;
}
-[Oracle]PL/SQL 日付(YYYY,MM,DD)妥当性チェック
#highlight(pl/sql){
/***********************************************************
このFUNCTIONでは、引数の年、月、日より その日付が
妥当であるかを判定します。
返り値:BOOLEAN
***********************************************************/
FUNCTION DATE_CHECK
(
W_YEAR VARCHAR2 := NULL,
W_MONTH VARCHAR2 := NULL,
W_DATE VARCHAR2 := NULL
)
RETURN BOOLEAN
IS
MONTH1 CONSTANT NUMBER := 31;
MONTH2 CONSTANT NUMBER := 28; --//通常の場合の2月の日数
MONTH2_LEAP CONSTANT NUMBER := 29; --//閏年の場合の2月の日数
MONTH3 CONSTANT NUMBER := 31;
MONTH4 CONSTANT NUMBER := 30;
MONTH5 CONSTANT NUMBER := 31;
MONTH6 CONSTANT NUMBER := 30;
MONTH7 CONSTANT NUMBER := 31;
MONTH8 CONSTANT NUMBER := 31;
MONTH9 CONSTANT NUMBER := 30;
MONTH10 CONSTANT NUMBER := 31;
MONTH11 CONSTANT NUMBER := 30;
MONTH12 CONSTANT NUMBER := 31;
BEGIN
IF W_MONTH ='01' THEN
IF TO_NUMBER(W_DATE) <= MONTH1 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '02' THEN
--( ( (strYear%4 == 0)&&(strYear%100 != 0) ) || (strYear%400 == 0) ) )
--//■うるう年のチェック
IF ( ( MOD(TO_NUMBER(W_YEAR),4) = 0) AND (MOD(TO_NUMBER(W_YEAR),100) != 0) ) OR (MOD(TO_NUMBER(W_YEAR),400) = 0) THEN
IF TO_NUMBER(W_DATE) <= MONTH2_LEAP THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSE
IF TO_NUMBER(W_DATE) <= MONTH2 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END IF;
ELSIF W_MONTH = '03' THEN
IF TO_NUMBER(W_DATE) <= MONTH3 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '04' THEN
IF TO_NUMBER(W_DATE) <= MONTH4 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '05' THEN
IF TO_NUMBER(W_DATE) <= MONTH5 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '06' THEN
IF TO_NUMBER(W_DATE) <= MONTH6 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '07' THEN
IF TO_NUMBER(W_DATE) <= MONTH7 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '08' THEN
IF TO_NUMBER(W_DATE) <= MONTH8 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '09' THEN
IF TO_NUMBER(W_DATE) <= MONTH9 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '10' THEN
IF TO_NUMBER(W_DATE) <= MONTH10 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '11' THEN
IF TO_NUMBER(W_DATE) <= MONTH11 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSIF W_MONTH = '12' THEN
IF TO_NUMBER(W_DATE) <= MONTH12 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSE --//どの場合にも当てはまらない、入力値がおかしい時
RETURN FALSE;
END IF;
END;
}
-[Oracle]PL/SQL 例外処理
#highlight(pl/sql){
■主キー制約違反
EXCEPTION
--//一意制約違反
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('データの重複有り');
ROLLBACK;
■その他例外発生時
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE(SQLCODE);
ROLLBACK;
■ユーザ定義例外
ここでは、例として、「REQUIRED_ITEM_EXCEPTION」を
定義するものとする。
①宣言部
/*■独自例外定義■*/
--//新規ユーザ追加用のデータの必須項目がNULLだった場合
REQUIRED_ITEM_EXCEPTION EXCEPTION;
②実行部
--//例外を投げる。
RAISE REQUIRED_ITEM_EXCEPTION;
③例外処理部
EXCEPTION
--//新規ユーザ登録に必要な項目のNULLチェック
WHEN REQUIRED_ITEM_EXCEPTION THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM'|| SQLERRM);
DBMS_OUTPUT.PUT_LINE('SQLCODE'||SQLCODE);
ROLLBACK;
}