--創建測試表
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';