1. 程式人生 > >Ora01722 無效數字 報錯帶來的反省

Ora01722 無效數字 報錯帶來的反省

第一步:先建立兩個測試表

   第一個表:

create table test_a
(
       id_no number
       ,vchar varchar2(50)
);
   第二個表:
create table test_b
(
       id_no number
       ,vnum number
);
第二步:往表裡插入資料
insert into TEST_A (ID_NO, VCHAR)values (1, '奧特曼');

insert into TEST_A (ID_NO, VCHAR)values (2, 'WPS');

insert into TEST_A (ID_NO, VCHAR)values (3, '10');

insert into test_b (ID_NO, VNUM)values (1, 10);

insert into test_b (ID_NO, VNUM)values (2, 11);

insert into test_b (ID_NO, VNUM)values (3, 12);
第三步:寫出問題SQL:
select * from test_a
where vchar in (select vnum from test_b)
錯誤原因
以前這樣用沒有問題的原因是,以前碰到的欄位,雖然都是字元型,但是裡面存的確是都是一些數字,
因此在Oracle預設轉換為數字的的時候不會問題。但是這個欄位裡面,不僅有數字,還有中文和英文,都是實打實的
字串,無法在預設轉換的時候被轉換成數字,所以就會報錯無效數字。由於以前不好的習慣,導致了這個失誤。甚至
會覺得自己沒有錯誤,因為以前都是這樣寫的。

自我反省
不能因為Oracle越來越人性化,而忽視程式碼書寫的嚴謹性。嚴格要求自己。
正確的寫法:


select * from test_a
where vchar in (select to_char(vnum) from test_b)