※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

  • [Oracle]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)妥当性チェック

/***********************************************************
この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 例外処理

■主キー制約違反
 
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;