詳細連接:http://blog.163.com/lsj_start/blog/static/17826443920111112103716524/
http://blog.itpub.net/29324876/viewspace-1096741/ (用explain查看隱式轉換)
oracle有三種最基本的數據類型,即字符型、數值型、日期型。同時提供類型轉換函數
1)to_char
數值、日期->字符型
語法:to_char(num|date,[format
mask],[nls_parameters])
參數:num|date
待轉換的數值或者日期
format
mask:可選參數
2)to_date
字符值->日期值 語法:to_date (string,[format mask],[nls_parameters]) 參數:string 待轉換的字符值 format mask:可選參數
格式掩碼同to_char轉換為date時相同。
備注:轉換時要根據給定的string設定正確的格式掩碼,否則
Ora_01840:input value is not long enough for date format.
Ora_01862:the numeric value does not match the length of the format item.
3) to_number
字符值->數字值 語法:to_number (string,[format mask],[nls_parameters]) 參數:string 待轉換的字符值 format mask:可選參數
格式掩碼同to_char轉換為number時相同。
備注:如果使用較短的格式掩碼就會返回錯誤。
例如: to_number(123.56,’999.9’)返回錯誤。
在oracle中,如果不同的數據類型之間關聯,如果不顯式轉換數據,則它會根據以下規則對數據進行隱式轉換
1) 對於INSERT和UPDATE操作,oracle會把插入值或者更新值隱式轉換為字段的數據類型。
假如id列的數據類型為number
update t set id='1'; -> 相當於 update t set id=to_number('1');
insert into t(id) values('1') -> insert into t values(to_number('1'));
2) 對於SELECT語句,oracle會把字段的數據類型隱式轉換為變量的數據類型。 如假設id列的數據類型為varchar2
select * from t where id=1; -> select * from t where to_number(id)=1;
但如果id列的數據類型為number,則
select * from t where id='1'; -> select * from t where id=to_number('1');(參考下文)
3) 當比較一個字符型和數值型的值時,oracle會把字符型的值隱式轉換為數值型。
如假設id列的數據類型為number
select * from t where id='1'; -> select * from t where id=to_number('1');
4) 當比較字符型和日期型的數據時,oracle會把字符型轉換為日期型。
如假設create_date為字符型,
select * from t where create_date>sysdate; -> select * from t where to_date(create_date)>sysdate;(注意,此時session的nls_date_format需要與字符串格式相符)
假設create_date為date型,
select * from t where create_date>'2006-11-11 11:11:11'; -> select * from t where create_date>to_date('2006-11-11 11:11:11'); (注意,此時session的nls_date_format需要與字符串格式相符)
5) 如果調用函數或過程等時,如果輸入參數的數據類型與函數或者過程定義的參數數據類型不一直,則oracle會把輸入參數的數據類型轉換為函數或者過程定義的數據類型。
如假設過程如下定義 p(p_1 number)
exec p('1'); -> exec p(to_number('1')); 6)
賦值時,oracle會把等號右邊的數據類型轉換為左邊的數據類型。
如 var a number a:='1'; - > a:=to_number('1');
7) 用連接操作符(||)時,oracle會把非字符類型的數據轉換為字符類型。
select 1||'2' from dual; -> select to_char(1)||'2' from dual;
8) 如果字符類型的數據和非字符類型的數據(如number、date、rowid等)作算術運算,則oracle會將字符類型的數據轉換為合適的數據類型,這些數據類型可能是number、date、rowid等。
如果CHAR/VARCHAR2 和NCHAR/NVARCHAR2之間作算術運算,
則oracle會將她們都轉換為number類型的數據再做比較。
9) 比較CHAR/VARCHAR2 和NCHAR/NVARCHAR2時,如果兩者字符集不一樣,則默認的轉換方式是將數據編碼從數據庫字符集轉換為國家字符集。
簡單總結:
比較時,一般是字符型轉換為數值型,字符型轉換為日期型
算術運算時,一般把字符型轉換為數值型,字符型轉換為日期型
連接時(||),一般是把數值型轉換為字符型,日期型轉換為字符型
賦值、調用函數時,以定義的變量類型為准。