错误信息返回流程(以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时,返回具体错误,需要根据各种条件进行判断