ORACLE驗證字段值是否爲數字

--創建測試表
DROP TABLE TEST_TO_NUMBER;
CREATE TABLE TEST_TO_NUMBER
(
    ID VARCHAR2(2) PRIMARY KEY,
    TEST_VAL VARCHAR2(20) NOT NULL
);
--插入測試數據
INSERT INTO TEST_TO_NUMBER (ID, TEST_VAL) VALUES ('1','123');
INSERT INTO TEST_TO_NUMBER (ID, TEST_VAL) VALUES ('2','0.12');
INSERT INTO TEST_TO_NUMBER (ID, TEST_VAL) VALUES ('3','2.141');
INSERT INTO TEST_TO_NUMBER (ID, TEST_VAL) VALUES ('4','.0.1');
INSERT INTO TEST_TO_NUMBER (ID, TEST_VAL) VALUES ('5','a.213');
INSERT INTO TEST_TO_NUMBER (ID, TEST_VAL) VALUES ('6','1..2');
INSERT INTO TEST_TO_NUMBER (ID, TEST_VAL) VALUES ('7','1a1');

--創建驗證方法
CREATE OR REPLACE FUNCTION IS_NUMBER (IN_DATA IN VARCHAR2, --原始數據
                                      I IN NUMBER, --整數位數最大允許值
                                      J IN NUMBER  --小數位數最大允許值 0-不能有小數位 ,-1 不校驗小數長度
                                      )
   RETURN INTEGER
AS
   V_NUMBER    NUMBER;
   V_XIAOSHU   VARCHAR2 (128);
--數據類型校驗 返回1 :正確 返回0: 錯誤
BEGIN
   IF (INSTR (IN_DATA,
              ',',
              1,
              1) <> 0)
   THEN
      RETURN 0;
   END IF;

   IF J = -1
   THEN
      V_XIAOSHU := '9999999999999999999999999999';
   ELSIF J = 0
   THEN
      V_XIAOSHU := '0';
   ELSE
      V_XIAOSHU := TRIM (LPAD (' ', J + 1, '9'));
   END IF;

   V_NUMBER :=
      TO_NUMBER (IN_DATA, TRIM (LPAD (' ', I + 1, '9')) || '.' || V_XIAOSHU); --利用類型轉換異常判斷是否合法
   RETURN 1;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN 0;
END IS_NUMBER;

--查詢不是數字的字段
SELECT * FROM (SELECT ID,IS_NUMBER(TEST_VAL,20,20) A FROM TEST_TO_NUMBER) WHERE A = '0';

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章