錯誤信息返回流程(以SQL錯誤為例)
Client |
|
|
|
Server |
1 |
------- |
Data Piggyback(11) Cursor Close All(69) 或 03 5e |
-----> |
具體語句 |
2 |
<----- |
Marker(0C) |
------- |
返回Marker |
3 |
<----- |
Marker(0C) |
------- |
返回Marker |
4 |
------- |
Marker(0C) |
-----> |
Request Marker |
5 |
<----- |
Data Error(17) 02 |
------- |
錯誤信息 |
錯誤請求涉及的包有Marker包(PacketType 0x0C)和Data Error(DataType 0x06 DataID 0x17 CallID 0x02)包
錯誤請求發出后,服務端會返回兩個Marker(2,3),然后客戶端會主動通過一個Marker(4)請求去獲取錯誤信息(5)
Marker包不是data包,他的的dataflag是0C,所以頭部是
0x00,0x0b,0x00,0x00,0x0c,0x00,0x00,0x00
從當前看似乎Marker包長度固定為0b
除去頭部固定的8個字節后,剩下三個字節是Marker的具體內容
返回的第一個Marker
01 00 01 或者01 00 03
Attention
Marker Type: Data Marker - 1 Data Bytes (0x01)
Marker Data Byte: 0x00
Marker Data Byte: 0x03 或者 0x01
返回的第二個Marker
01 00 02
Attention
Marker Type: Data Marker - 1 Data Bytes (0x01)
Marker Data Byte: 0x00
Marker Data Byte: 0x02
請求Marker
01 00 02
Attention
Marker Type: Data Marker - 1 Data Bytes (0x01)
Marker Data Byte: 0x00
Marker Data Byte: 0x02
錯誤信息返回
此包根據服務端,客戶端不同有很多變化,且不能通用
64bitOCIclient to 12c 錯誤返回
此包此包為Data包,DataID=17 CALLID=02
包含兩個部分,前一個部分固定長度為155字節,表示內部錯誤信息,后一部分是前序一個長度字節的錯誤字符串,和語言及編碼設定有關
64bitOCIclient to 11g 錯誤返回
此包此包為Data包,DataID=04 CALLID=05
包含兩個部分,前一個部分固定長度為68字節,表示內部錯誤信息,后一部分與12c版本相同是前序長度的錯誤字符串,和語言及編碼設定有關
注意與12c一樣,綠色部分的錯誤編碼要和藍色字符串中的錯誤編碼相同,才能顯示字符串中的信息,否則顯示默認信息
TNS312版本錯誤返回
如果將版本改為312,返回錯誤又不相同,
此包此包為Data包,DataID=17 CALLID=02
綠色部分的錯誤編碼要和藍色字符串中的錯誤編碼相同,才能顯示字符串中的信息,否則顯示默認信息
代碼示例
功能:在接收命令處如果滿足禁止條件,則返回權限不足,效果如圖
首先在接收命令處如果滿足禁止條件,則返回兩個marker
當代理收到marker時,返回具體錯誤,需要根據各種條件進行判斷