1)降低可讀性
2)自動型別轉換往往對效能產生不好的影響,特別是左值的型別被自動轉成了右值的型別,這種方式很可能使左值上的索引失效。
3)自動型別轉換可能依賴於發生轉換時的上下文環境,一旦上下文環境改變,很可能我們的程式就不能執行
如:select to_date(sysdate,'yyyymm') from dual;
這個語句等價於select to_date(to_char(sysdate, nls_date_format),'yyyymm') from dual;
datetime and interval 型別
binary_double
binary_float
number
字元型別
所有其它內建型別
oracle自動型別轉換是根據上下文環境以及一些預定的規則,經過語法語義的分析之後進行相關的自動型別轉換,自動型別轉換首要條件就是這個轉換有意義,要正確,否則轉換不成功,要報錯。
自動型別轉換矩陣圖
1)在insert,
update,賦值語句(如select...into...)中,oracle將賦值的型別轉為目標列的型別
2)對數值型別的操作,oracle經常將數值型別的值調整為最大的精度(precision)和刻度(scale)
3)在字元和非字元之間的算術和比較操作中,oracle會根據日期,rowid,數值型別優先順序最大來進行轉換。算術操作一般都要轉為number,比如where rowid='…'要將字串轉為rowid,where date ='….'會將字串根據nls的設定轉為日期型別。
4)在字元型別、number數值型別與浮點型別的數值之間相互轉換,可能會丟失精度,因為number是以10進製(0-9)精度表示數字的,而浮點型別數值是以二進位制(0和1)表示的精度。
5)將clob轉為字元型別或將blob轉為raw型別的時候,如果被轉換的型別長度比目標型別長,那麼會出錯,其它的自動型別轉換如果無法轉換的話也會報錯
6)binary_float自動轉為binary_double是準確的,當然這毋庸置疑。反之,binary_double自動轉為binary_float可能就是不準確的了,如binary_double轉為binary_float需要更多的精度位的支援。
7)在做連線操作(||)的時候,oracle會將非字元型別轉為char或nchar。
8)字元型別之間的型別轉換,char-->vachar2-->nchar-->nvarchar2
9)很多sql函式可以接受clob型別,對引數要求是varchar2或char的如果傳入clob型別也是可以的,但是有最大長度限制為4000位元組,也就是說如果clob超過4000位元組只取前4000位元組。
自動型別轉換
1 建構函式轉換 如果定義乙個建構函式,這個建構函式能把乙個型別的物件 或引用 作為它的單個引數,那麼這個建構函式允許編譯器執行自動型別轉換。class one class two void fun two int main 從上面的 我們可以看到通過建構函式可以 輕易的把乙個型別的變數轉換為另乙個...
c c 自動型別轉換
學習各種語言,必須要有紮實的基礎知識。c和c 有很多靈活性的東西,所以在程式設計時一定要牢記這些知識點。不同型別資料間的混合運算中的自動型別轉換。當乙個表示式中有不同的資料型別參加時,預設情況下會進行自動型別轉換。轉換過程當中以運算中最高端別為準。其中橫向箭頭是必定發生的轉換。縱向箭頭是可以直接越級...
C 自動型別轉換
在c 中,如果編譯器看到乙個表示式或函式呼叫使用了乙個不合適的型別,它會執行乙個自動型別轉換,將不合適的型別轉換為合適的型別。對於自定義類,可以通過定義該類的建構函式的方法將其它型別轉換為本自定義類 或者使用運算子將本自定義類轉換為其它型別。對於乙個自定義類,可以為該類定義乙個有乙個引數的建構函式。...