MySQL 項目移植Oracle

最近公司公司項目爲支持oralce數據庫,咱們對項目進行移植,項目中使用  MyBatis須要手工對  MyBatis sql xml文件進行修改,修改過程當中遇到很多問題,記錄在此方便後續查看。java

數據類型錯誤 ORA-00932  web

  SELECT 
           DISTINCT sg.ID,
                  sg.CODE,
                  sg.NAME,
                  sg.ORGANIZATION_ID,
                  sg.DESCRIPTION,
                 -- to_char(sg.DESCRIPTION),
                  sg.SORT,
                  sg.CREATE_USER,
                
    FROM SYS_GROUP sg

 緣由:DESCRIPTION字段類型爲NCLOB,而DISTINCT不支持對NCLOB類型字段進行操做,使用to_char函數進行轉換便可spring


ora-02290 違反檢查約束條件sql

此條錯誤出如今執行一條新增SQL語句時,檢查半天后未發現有什麼異常,該語句在MYSQL也可以正常執行,後來查詢資料瞭解到能夠查詢視圖CONSTRAINT_NAME進行檢查。數據庫

select * from dba_constraints where CONSTRAINT_NAME like '%89071';

仔細查詢以後發現出現此緣由狀況是表字段缺乏,MYSQL環境下該表某個字段設置有默認值,但移植到ORACLE環境下未對該字段設置默認值,同時SQL語句中也未申明該字段因而出現這種錯誤。apache

在修改SQL後,在PL/SQL中可以正常執行語句,但經過程序執行後出現以下錯誤:oracle

org.springframework.jdbc.UncategorizedSQLException: Error setting null for parameter #6 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 無效的列類型

這種錯誤出現以前也有遇到過,是當字段爲NULL時,未指定jdbcType類型的參數就可能致使此問題,以前執行insert語句時我都會添加,如今是移植就經過添加jdbcType來修改,jdbcType必須爲爲ibatis的申明enum類型,不然也會出現異常,默認包含如下類型:函數

package org.apache.ibatis.type;

public enum JdbcType {
    ARRAY, BIT, TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT, REAL, DOUBLE, NUMERIC, DECIMAL, CHAR, VARCHAR, LONGVARCHAR, DATE, TIME, TIMESTAMP, BINARY, VARBINARY, LONGVARBINARY, NULL, OTHER, BLOB, CLOB, BOOLEAN, CURSOR, UNDEFINED, NVARCHAR, NCHAR, NCLOB, STRUCT;

ORA-00984: 列在此處不容許 修改後再次執行SQL依然提示出錯工具

再次檢查後發現SQL語句中values中寫死一個」1「,嘗試去掉雙引號爲單引號可以正常執行,肯定是由於雙引號引發,以前在MYSQL中用雙引號於單引號還未出現此狀況。this

還有一種狀況列名添加單引號也會引發ORALCE報錯,在MYSQL中寫SQL語句時有時會幫列名添加單引號,但在ORALCE中不容許此種寫法


列名小寫  執行一個SQL時出現空指針異常,檢查發現是獲取ID時,是經過KEY 小寫的id進行獲取,但查詢結果集中爲大寫的ID,檢查SLQ後發現經過as進行別名添加,可是輸出的結果仍都爲大寫,經過添加雙引號對別名進行處理 後可以輸出小寫,必須爲雙引號單引號會出錯。

     select sysdate as "date" from dual


ORACLE 獲取自增加ID

MYSQL中能夠經過兩種方式獲取執行INSERT語句時獲取自增加的ID。

方式1:

<insert id="save" useGeneratedKeys="true" keyProperty="id"
            parameterType="Record">

方式2:

<insert id="save" useGeneratedKeys="true" keyProperty="id"
<selectKey resultType="int" keyProperty="id" order="AFTER">
			SELECT LAST_INSERT_ID() AS id
        </selectKey>

 在ORACLE中經過這兩方式進行插入都不行,在使用方式2進行處理時會拋出錯誤:

 ORA-00923: 未找到要求的 FROM 關鍵字

 我猜測問題就出在

SELECT LAST_INSERT_ID() AS id

這句,在MYBAITES在ORALCE中沒法執行這個語句,在MYSQL中可使用

我修改爲爲下面的方式就可以成功處理,經過查詢下個SEQ來獲取ID

<insert id="save" parameterType="hashMap" useGeneratedKeys="true" >
        <selectKey keyProperty="roleId" resultType="int" order="BEFORE">
            SELECT SEQ_SYS_ROLE.NEXTVAL FROM DUAL
        </selectKey>

  同時須要注意在修改爲這種方式時不可以在INSERT標籤中申明

keyProperty="id"

  若是申明,則返回的ID數據將不正確,同事在執行這個語句的時候發現返回的數據並不是INT類型的ID,而返回了一個BYTE數  組。

 當使用自定義對象進行新增時,ID若是爲Integer類型的來接收返回的ID就會出現錯誤(使用int類型不會報錯)

 java.sql.SQLException: 無效的列類型: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor

能夠在對象中添加另一個String類型的字段,在執行INSERT語句時用該字段保存返回的ID,最後在該字段的set方法中賦值給ID,方法雖然麻煩了點,可是了減小改動只能使用這種方式。


ORA-00904: "TYPE": 標識符無效

在一張表中某列名爲」TYPE「,出現該問題時起初覺得是由於使用了ORALCE關鍵字,以前此類問題在關鍵字上面添加雙引號都可以解決此問題,添加後發現仍出現此問題,檢查數據庫表後發現列名爲小寫的「type」,肯定是由於經過工具直接導出的腳本建表語句中爲該字段添加了雙引號致使,如出現該問題請首先檢查數據庫字段是否一致。

相關文章
相關標籤/搜索