程式中使用繫結變數,執行計劃不正確
當在.net應用中,應用程式中呼叫的sql語句使用繫結變數,導致在oracle中的語句執行計劃不正確,主要是由於資料型別的不匹配導致的。解決辦法就是將.net中的資料型別與oracle資料庫中的型別匹配。
下表是oracle與.net中的資料型別對映表 :
[@more@]下表列出 Oracle 資料型別及其與 的對映。
Oracle 資料型別 | 由 OracleDataReader.GetValue 返回的 .NET Framework 資料型別 | 由 OracleDataReader.GetOracleValue 返回的 OracleClient 資料型別 | 備註 |
---|---|---|---|
BFILE | Byte[] |
|
|
BLOB | Byte[] |
|
|
CHAR | String |
|
|
CLOB | String |
|
|
DATE | DateTime |
|
|
FLOAT | Decimal |
| 此資料型別是 NUMBER 資料型別的別名,其設計目的是使 返回 System.Decimal 或 ,而不是浮點值。使用該 .NET Framework 資料型別可能導致溢位。 |
INTEGER | Decimal |
| 此資料型別是 NUMBER(38) 資料型別的別名,其設計目的是使 返回 System.Decimal 或 ,而不是整數值。 使用 .NET Framework 資料型別可能導致溢位。 |
INTERVAL YEAR TO MONTH | Int32 |
|
|
INTERVAL DAY TO SECOND | TimeSpan |
|
|
LONG | String |
|
|
LONG RAW | Byte[] |
|
|
NCHAR | String |
|
|
NCLOB | String |
|
|
NUMBER | Decimal |
| 使用 .NET Framework 資料型別可能導致溢位。 |
NVARCHAR2 | String |
|
|
RAW | Byte[] |
|
|
REF CURSOR |
|
| 物件不支援 Oracle REF CURSOR 資料型別。 |
ROWID | String |
|
|
TIMESTAMP | DateTime |
|
|
TIMESTAMP WITH LOCAL TIME ZONE | DateTime |
|
|
TIMESTAMP WITH TIME ZONE | DateTime |
|
|
UNSIGNED INTEGER | Number |
| 此資料型別是 NUMBER(38) 資料型別的別名,其設計目的是使 返回 System.Decimal 或 ,而不是無符號整數值。 使用 .NET Framework 資料型別可能導致溢位。 |
VARCHAR2 | String |
|
|
下表列出了在將資料型別作為引數繫結時使用的 Oracle 資料型別和 .NET Framework 資料型別(System.Data.DbType 和 )。
Oracle 資料型別 | 要繫結為引數的 DbType 列舉 | 要繫結為引數的 OracleType 列舉 | 備註 |
---|---|---|---|
BFILE |
| BFile | Oracle 只允許將 BFILE 繫結為 BFILE 引數。 如果您嘗試繫結一個非 BFILE 值(如 byte[] 或 ),適用於 Oracle 的 .NET 資料提供程式並不會自動為您構造這樣的值。 |
BLOB |
| Blob | Oracle 只允許將 BLOB 繫結為 BLOB 引數。 如果您嘗試繫結一個非 BLOB 值(如 byte[] 或 ),適用於 Oracle 的 .NET 資料提供程式並不會自動為您構造這樣的值。 |
CHAR | AnsiStringFixedLength | Char |
|
CLOB |
| Clob | Oracle 只允許將 CLOB 繫結為 CLOB 引數。 如果您嘗試繫結一個非 CLOB 值(如 System.String 或 ),適用於 Oracle 的 .NET 資料提供程式並不會自動為您構造這樣的值。 |
DATE | DateTime | DateTime |
|
FLOAT | Single、Double、Decimal | Float、Double、Number | 確定 System.Data.DBType 和 。 |
INTEGER | SByte、Int16、Int32、Int64、Decimal | SByte、Int16、Int32、Number | 確定 System.Data.DBType 和 。 |
INTERVAL YEAR TO MONTH | Int32 | IntervalYearToMonth | 只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。 |
INTERVAL DAY TO SECOND | Object | IntervalDayToSecond | 只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。 |
LONG | AnsiString | LongVarChar |
|
LONG RAW | Binary | LongRaw |
|
NCHAR | StringFixedLength | NChar |
|
NCLOB |
| NClob | Oracle 只允許將 NCLOB 繫結為 NCLOB 引數。 如果您嘗試繫結一個非 NCLOB 值(如System.String 或 ),適用於 Oracle 的 NET 資料提供程式並不會自動為您構造這樣的值。 |
NUMBER | VarNumeric | Number |
|
NVARCHAR2 | String | NVarChar |
|
RAW | Binary | Raw |
|
REF CURSOR |
| Cursor | 有關更多資訊,請參見。 |
ROWID | AnsiString | Rowid |
|
TIMESTAMP | DateTime | Timestamp | 只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。 |
TIMESTAMP WITH LOCAL TIME ZONE | DateTime | TimestampLocal | 只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。 |
TIMESTAMP WITH TIME ZONE | DateTime | TimestampWithTz | 只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。 |
UNSIGNED INTEGER | Byte、UInt16、UInt32、UInt64、Decimal | Byte、UInt16、Uint32、Number | 確定 System.Data.DBType 和 。 |
VARCHAR2 | AnsiString | VarChar |
|
由 物件的 屬性使用的 InputOutput、Output 和 ReturnValue ParameterDirection 值為 .NET Framework 資料型別,除非輸入值是 Oracle 資料型別(例如 或 )。這並不適用於 REF CURSOR、BFILE 或 LOB 資料型別
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/73920/viewspace-1028193/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 執行計劃繫結
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 11.2 繫結變數執行計劃怎麼這樣?求助!變數
- Event 10053 執行計劃 繫結變數 Bind peeking變數
- sqm執行計劃的繫結
- Oracle-繫結執行計劃Oracle
- 如何解決執行計劃繫結變數bind peeking重新硬解析變數
- Oracle 表連線 篩選欄位執行計劃不正確Oracle
- [20231210]執行計劃與繫結變數.txt變數
- 統計資訊不正確導致執行計劃的錯誤選擇
- Linux計劃任務crontab執行指令碼不正確的問題Linux指令碼
- sqlprofile繫結執行計劃實驗測試SQL
- 知識篇 | ORACLE 如何執行計劃繫結Oracle
- 在資料分佈嚴重不均的列上使用繫結變數容易錯過更好的執行計劃變數
- 使用hint改變執行計劃
- oracle10g_11g_繫結變數bind_與最優執行計劃explain planOracle變數AI
- 使用spm繫結執行計劃來線上優化資料庫優化資料庫
- PLSQL使用繫結變數SQL變數
- 【優化】使用繫結變數 OR 不使用繫結變數,這不是問題!優化變數
- java程式裡怎麼使用繫結變數Java變數
- 通過ERRORSTACK找出正在執行的SQL中的繫結變數值ErrorSQL變數
- 【最佳化】使用繫結變數 OR 不使用繫結變數,這不是問題!變數
- OLTP系統中儘量使用繫結變數變數
- 看執行計劃是否正確
- sql執行計劃變更和刪除快取中執行計劃的方法SQL快取
- 繫結變數變數
- SQL Developer中使用繫結變數SQLDeveloper變數
- 繫結變數的使用範圍變數
- 關於繫結變數的使用變數
- 在oracle的plsql中為cursor使用繫結變數OracleSQL變數
- PostgreSQL執行計劃變化SQL
- oracle 執行計劃變更Oracle
- 執行計劃中Row 數量為0
- 繫結變數的正確使用,bind peeking,Adaptive Cursor Sharing變數APT
- 使用繫結變數的一點總結!變數
- 繫結變數之繫結變數窺探(Bind Peeking)變數
- dbms_outln.create_outline在10.2.0.5中建立outline所包含的執行計劃並不正確
- Oracle SQL_Profile手動生成及繫結sql執行計劃OracleSQL