原文出處:http://space.itpub.net/519536/viewspace-627340
ORA-01790錯誤提示信息是“expression must have same datatype as corresponding expression”,如果使用oerr命令查看,沒有過多的描述信息。
單純從錯誤信息的內容其實就可以大概看出問題出處,是由於數據類型不一致引起的報錯。
這裏我通過一個實驗模擬一下這個錯誤,然後給出一個解決方法。
實驗中我們將使用UNION ALL操作來模擬這個錯誤,因爲UNION ALL要求多個UNION內容對應字段的數據類型要嚴格一致。
1.創建三個實驗用表T1、T2和T3
sec@ora10g> create table t1 (x varchar2(10), y varchar2(10));
Table created.
sec@ora10g> create table t2 (x varchar2(10), y varchar2(10));
Table created.
sec@ora10g> create table t3 (x int, y varchar2(10));
Table created.
注意T1和T2表的所有字段類型均爲“VARCHAR2”,T3表的X字段類型是“INT”。
2.每張表初始化一條記錄
sec@ora10g> insert into t1 values ('1', 'secooler');
1 row created.
sec@ora10g> insert into t2 values ('2','HOU');
1 row created.
sec@ora10g> insert into t3 values (3,'Andy');
1 row created.
sec@ora10g> commit;
Commit complete.
3.先看正確的使用方法
sec@ora10g> select * from t1
2 union all
3 select * from t2;
X Y
---------- ----------
1 secooler
2 HOU
由於T1表和T2表的字段類型相同,故此處可以得到正確的結果。
4.使用T2和T3表來模擬ORA-01790錯誤
sec@ora10g> select * from t1
2 union all
3 select * from t3;
select * from t1
*
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression
由於是我們設計的場景,此時我們真切的經歷了ORA-01790錯誤發上過程。
原因是顯然的,T1表的X列類型是VARCHAR2,這與T3表X列INT類型不符。
5.規避ORA-01790錯誤的一種方法
針對這個案例,這裏我們採用TO_CHAR函數強制將T3表的X列轉換爲字符串類型的方法來處理。
sec@ora10g> select * from t1
2 union all
3 select to_char(x),y from t3;
X Y
---------------------------------------- ----------
1 secooler
3 Andy
6.MOS中的參考信息[ID 19128.1]
OERR: ORA 1790 expression must have same datatype as corresponding expression
Error: ORA 1790
Text: expression must have same datatype as corresponding expression
-------------------------------------------------------------------------------
Cause: A SELECT list item corresponds to a SELECT list item with a different
datatype in another query of the same set expression.
Action: Check that all corresponding SELECT list items have the same datatypes.
Use the TO_NUMBER, TO_CHAR, and TO_DATE functions to do explicit data
conversions.
7.小結
在使用UNION時,需要注意用到的字段類型要保證一致;
不要放過任何報錯信息後面隱含的真實原因,處理問題的過程就是自身提高的過程。
Good luck.
secooler
10.02.20
單純從錯誤信息的內容其實就可以大概看出問題出處,是由於數據類型不一致引起的報錯。
這裏我通過一個實驗模擬一下這個錯誤,然後給出一個解決方法。
實驗中我們將使用UNION ALL操作來模擬這個錯誤,因爲UNION ALL要求多個UNION內容對應字段的數據類型要嚴格一致。
1.創建三個實驗用表T1、T2和T3
sec@ora10g> create table t1 (x varchar2(10), y varchar2(10));
Table created.
sec@ora10g> create table t2 (x varchar2(10), y varchar2(10));
Table created.
sec@ora10g> create table t3 (x int, y varchar2(10));
Table created.
注意T1和T2表的所有字段類型均爲“VARCHAR2”,T3表的X字段類型是“INT”。
2.每張表初始化一條記錄
sec@ora10g> insert into t1 values ('1', 'secooler');
1 row created.
sec@ora10g> insert into t2 values ('2','HOU');
1 row created.
sec@ora10g> insert into t3 values (3,'Andy');
1 row created.
sec@ora10g> commit;
Commit complete.
3.先看正確的使用方法
sec@ora10g> select * from t1
2 union all
3 select * from t2;
X Y
---------- ----------
1 secooler
2 HOU
由於T1表和T2表的字段類型相同,故此處可以得到正確的結果。
4.使用T2和T3表來模擬ORA-01790錯誤
sec@ora10g> select * from t1
2 union all
3 select * from t3;
select * from t1
*
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression
由於是我們設計的場景,此時我們真切的經歷了ORA-01790錯誤發上過程。
原因是顯然的,T1表的X列類型是VARCHAR2,這與T3表X列INT類型不符。
5.規避ORA-01790錯誤的一種方法
針對這個案例,這裏我們採用TO_CHAR函數強制將T3表的X列轉換爲字符串類型的方法來處理。
sec@ora10g> select * from t1
2 union all
3 select to_char(x),y from t3;
X Y
---------------------------------------- ----------
1 secooler
3 Andy
6.MOS中的參考信息[ID 19128.1]
OERR: ORA 1790 expression must have same datatype as corresponding expression
Error: ORA 1790
Text: expression must have same datatype as corresponding expression
-------------------------------------------------------------------------------
Cause: A SELECT list item corresponds to a SELECT list item with a different
datatype in another query of the same set expression.
Action: Check that all corresponding SELECT list items have the same datatypes.
Use the TO_NUMBER, TO_CHAR, and TO_DATE functions to do explicit data
conversions.
7.小結
在使用UNION時,需要注意用到的字段類型要保證一致;
不要放過任何報錯信息後面隱含的真實原因,處理問題的過程就是自身提高的過程。
Good luck.
secooler
10.02.20