|
@@ -0,0 +1,313 @@
|
|
|
+http://gitlab2.xugu.com/cyj/xugusql
|
|
|
+
|
|
|
+1.连接:
|
|
|
+ 1.1 客户端主动发起连接,创建socket后,向服务端发出连接字符串:
|
|
|
+ login database = '数据库名' user = '用户名' password = '口令' [ encryptor = '加密库的解密口令' ]
|
|
|
+ [ char_set = '客户端使用的字符集名'] [ time_zone='时区'] [iso_level='事务隔离级别']
|
|
|
+ [ lock_timeout='加锁超时' ] [ auto_commit='on或off'] [ strict_commit='on或off']
|
|
|
+ [ result='char'] [ return_schema='on或off ] [ return_cursor_id='on或off ]
|
|
|
+ [ lob_ret='descriptor'] [ return_rowid = true] version='客户端协议版本号'
|
|
|
+
|
|
|
+ 解释:
|
|
|
+ 连接串中除了login database=数据库名 user = '用户名' password = '口令' 外,其余为可选项,若未指定那些项,则系统为连接设置默认值
|
|
|
+
|
|
|
+ 数据解密口令:用于启动加密数据库,若库未加密,则可不要,但带上此参数不会影响连接
|
|
|
+
|
|
|
+ 客户端使用的字符集名: 'GB2312' ,'GBK','BIG5' 等,默认为GBK
|
|
|
+
|
|
|
+ 时区: 'GMT +08:00'
|
|
|
+
|
|
|
+ 事务隔离级别:
|
|
|
+ 'READ COMMITED':读已提交
|
|
|
+ 'REPEATIABLE READ':可重复读
|
|
|
+ 'SERIALIZABLE':序列化
|
|
|
+
|
|
|
+ 加锁超时:
|
|
|
+ 毫秒数,表示本连接中的事务在争用锁时,最多等候的时间,若在此时间内加锁不成功,则回滚事务并报错
|
|
|
+
|
|
|
+ auto_commit:
|
|
|
+ on:表示自动提交,即每个命令都作为一个事务,命令完成立即提交
|
|
|
+ off:非自动提交,需要 commit命令才提交
|
|
|
+
|
|
|
+ strict_commit: 是否该连接中执行的事务使用严格提交(即须记实了事务日志才向客户端返回'K')
|
|
|
+
|
|
|
+ result='char': 当设置了该项后,则float,integer等不以字串方式返回的结果皆强制使用字符串方式返回(此项对于odbc,jdbc等标准驱动皆不使用)
|
|
|
+
|
|
|
+ return_schema: 是否在返回字段名信息时加上模式名,若设置为'on',则返回的字段名形式为: 模式名.表名.字段名 '%' 别名,否则返回的字段名形式为:表名.字段名 '%' 别名
|
|
|
+
|
|
|
+ return_cursor_id: 若该项设置为'on',则存贮过程的ref_cursor的返回值为cursor的ID号,此时,客户端若要使用ref_currsor的结果,则应使用fetch命令,cursor的名为: 'CurN' + 游标号的16进制字串,
|
|
|
+ 若该项设置为off或没有该项,则将在返回结果中直接嵌入ref_cursor的结果集
|
|
|
+
|
|
|
+ lob_ret='descriptor': 该项目前服务器版本中没有,拟新加入,若有该项,则在返回大对象时不以数据形式返回,代之以描述符,当真正需要大对象数据时,使用 GET LOB 大对象描述符;命令从服务器取回数据
|
|
|
+
|
|
|
+ version:
|
|
|
+ 客户端协议版本,目前都应是:'201'
|
|
|
+
|
|
|
+
|
|
|
+ 1.2 服务器端: 发回字节'K'表示成功,否则,发回错误信息(见错误信息格式)并立即关闭连接
|
|
|
+
|
|
|
+
|
|
|
+2.所有DML及DDL访问:
|
|
|
+
|
|
|
+ 2.1 客户端发出访问:
|
|
|
+
|
|
|
+ QryStream: '?' Comand_Len Comand_str Param_num { Param_name_len Param_name Param_INOUT Param_DType Param_Data_Len Param_Data }*
|
|
|
+ ? 5 ? STC 1 0 1 type_int 4 1
|
|
|
+
|
|
|
+ 解释:
|
|
|
+ Command_len: 命令长度(网络序32位整数,计算命令长度时不包括结束符0x0)
|
|
|
+ Command_str: 命令字串(发送时应包括结束符0x0)
|
|
|
+ Param_num: 参数个数(网络序16位整数,若没有参数则此值为0)
|
|
|
+
|
|
|
+ Param_name_len: 参数名字长度(网络序短整数,若参数无名,则此值为0)
|
|
|
+ Param_name: 参数名(该部分字节数应与Param_name_Len一致)
|
|
|
+ Param_INOUT: 参数输出输入类型(网络序16位整数)
|
|
|
+ Param_DType: 参数数据类型号(网络序16位整数)
|
|
|
+ Param_Data_Len: 参数长度(网络序32位整数)
|
|
|
+ Param_Data: 参数数据(该部分字节数应与Param_Data_Len一致)
|
|
|
+
|
|
|
+ {}*: 表示参数部分可有0至多个参数,其重复的次数取决于Param_num,若Param_num为0,则没有参数需要发送
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ 2.2 服务器返回: 服务器可返回一组或多组信息,并以字节'K'标识所有信息已传送完毕
|
|
|
+
|
|
|
+ SrvResponse: { FormArgDescri | SelectResult | InsertResult | UpdateResult | DeleteResult | ProcRet | OutParamRet | ErrInfo | WarnInfo | Message }* 'K'
|
|
|
+
|
|
|
+ FormArgDescri: '$' Arg_Num { Arg_Name_Len Arg_Name Arg_No Arg_DType Arg_Preci_Scale }+
|
|
|
+
|
|
|
+ SelectResult: 'A' Field_Num { Field_Name_Len Field_Name Field_DType Field_Preci_Scale Field_Flag }+ { 'R' Col_len1 Col_Data1 ... }*
|
|
|
+
|
|
|
+ InsertResult: 'I' Rowid_Len Rowid_Data
|
|
|
+
|
|
|
+ UpdateResult: 'U' Update_Num
|
|
|
+
|
|
|
+ DeleteResult: 'D' Delete_Num
|
|
|
+
|
|
|
+ ProcRet: 'O' Ret_DType Ret_Data_Len Ret_Data
|
|
|
+
|
|
|
+ OutParamRet: 'P' Out_Param_No Out_Param_DType Out_Param_Len Out_Param_Data
|
|
|
+
|
|
|
+ ErrInfo: 'E' Err_Str_Len Err_Str
|
|
|
+
|
|
|
+ WarnInfo: 'W' Warn_Str_Len Warn_Str
|
|
|
+
|
|
|
+ Message: 'M' Msg_Str_Len Msg_Str
|
|
|
+
|
|
|
+
|
|
|
+ 解释:
|
|
|
+ FormArgDescri: 形式参数描述,执行prepare语句后,通常返回此部分信息
|
|
|
+ Arg_Num: 形参个数(网络序32位整数)
|
|
|
+ Arg_Name_Len: 形参名长度(网络序32位整数)
|
|
|
+ Arg_Name: 形参名(字节数与Arg_Name_Len一致)
|
|
|
+ Ar_No: 形参的序号(网络序32位整数,若prepare语句中使用?号表示参数,则服务器按?号的顺序从1开始为其设定序号)
|
|
|
+ Argg_DType: 形参的数据类型ID(网络序32位整数)
|
|
|
+ Arg_Preci_Scale: 形参的精度标度(网络序32位整数
|
|
|
+
|
|
|
+ SelectResult: 查询结果集,包含一组结果集字段描述 以及0至多个行数据
|
|
|
+ Field_Num: 结果集字段数
|
|
|
+ Field_Name_Len: 字段名长度(网络序32位整数)
|
|
|
+ Field_Name: 字段名(字节数与Field_Name_Len一致)
|
|
|
+ Field_DType: 字段数据类型ID(网络序32位整数)
|
|
|
+ Field_Preci_Scale:字段的精度标度(网络序32位整数,若为-1或0表示没有精度标度信息,否则高16位为精度低16位为标度)
|
|
|
+ Field_Flag: 字段的其它属性标志(网络序32位整数),其中每一个位表征字段的某一个特性,各位对应的特性如下
|
|
|
+ FIELD_BASE_TAB=1, /* 表示字段是实际的表的字段(否则,表示字段实际上是表达式) */
|
|
|
+ FIELD_NOT_NULL=2, /* 表示字段具有非空约束 */
|
|
|
+ FIELD_IS_PRIMARY=4, /* 表示字段是主键 */
|
|
|
+ FIELD_IS_SERIAL=8, /* 表示字段是序列值 */
|
|
|
+ FIELD_IS_TIMESTAMP=16, /* 表示字段是timestamp */
|
|
|
+ FIELD_IS_LOB=32, /* 表示字段是大对象类型 */
|
|
|
+ FIELD_IS_UNIQUE=64, /* 表示字段是唯一值类型 */
|
|
|
+ FIELD_IS_ROWID=128, /* 表示字段是rowid */
|
|
|
+ FIELD_IS_DUMMY=256, /* 表示字段不应输出 */
|
|
|
+ FIELD_IS_HIDE=512, /* 表示字段是隐藏字段 */
|
|
|
+
|
|
|
+ Col_len: 列数据长度(网络序32位整数)
|
|
|
+ Col_Data: 列数据(字节数与Col_Len一致)
|
|
|
+
|
|
|
+ 注: 返回结果中,记录数据由 'R'开头,后跟若干个列的长度及数据,每个'R'后的列数据个数为Field_Num个
|
|
|
+
|
|
|
+
|
|
|
+ InsertResult: 插入语句的返回结果
|
|
|
+ Rowid_Len: 插入语句返回的新行的ROWID数据的长度
|
|
|
+ Rowid_Data: 插入语句返回的新行的ROWID数据(为base64编码)
|
|
|
+
|
|
|
+
|
|
|
+ UpdateResult: 更改语句返回的结果
|
|
|
+ Update_Num: 更改语句影响的行数(网络序32位整数)
|
|
|
+
|
|
|
+ DeleteResult: 删除语句的返回结果
|
|
|
+ Delete_Num: 删除的行数
|
|
|
+
|
|
|
+ ProcRet: 存贮函数调用的返回值
|
|
|
+ Ret_DType: 返回值数据类型(网络序32位整数)
|
|
|
+ Ret_Data_Len: 返回值数据长度(网络序32位整数)
|
|
|
+ Ret_Data: 返回值数据
|
|
|
+
|
|
|
+ OutParamRet: 返回型参数
|
|
|
+ Out_Param_No: 返回型参数的参数号
|
|
|
+ Out_Param_DType:返回参数的数据类型(网络序32位整数)
|
|
|
+ Out_Param_Len: 返回参数的数据长度(网络序32位整数)
|
|
|
+ Out_Param_Date: 返回参数的数据
|
|
|
+
|
|
|
+ ErrInfo: 错误信息(通常在返回数据的最后出现,即出现在 'K'字符前)
|
|
|
+ Err_Str_Len: 错误信息长度(网络序32位整数)
|
|
|
+ Err_Str: 错误信息(字节数与Err_Str_Len一致)
|
|
|
+
|
|
|
+ WarnInfo: 警告信息(通常在返回数据的最后出现,即出现在 'K'字符前)
|
|
|
+ Warn_Str_Len: 警告信息长度(网络序32位整数)
|
|
|
+ Warn_Str: 警告信息(字节数与Warn_Str_Len一致)
|
|
|
+
|
|
|
+ Message: 通知信息(出现的位置没有一定的规定)
|
|
|
+ Msg_Str_Len: 通知信息长度(网络序32位整数)
|
|
|
+ Msg_Str: 通知信息(字节数与Msg_Str_Len一致)
|
|
|
+
|
|
|
+ 注: {}* 中各种返回信息是并列的关系,可能一次返回中含有0个至多个返回信息,不能假定改到其中其种返回信息就认为没有其它种类的返回信息,
|
|
|
+ 有些类型的返回信息甚至可能重重出现,如:一次发多条select 语句就会造成返回信息中包含多个查询结果集.
|
|
|
+
|
|
|
+ 2.3 关于新版本中将增加的大对象数据返回形式的说明
|
|
|
+
|
|
|
+ a) 当在连接中未加入了 lob_ret='descriptor'子串时,使用原来的方式返回大对象数据
|
|
|
+
|
|
|
+ b) 当在连接中加入了 lob_ret='descriptor'子串时,应该将大对象对应的列返回值视作描述符,描述符分两种:一种为内嵌在行内的大对象数据的描述符,一种为非内嵌大对象描述符
|
|
|
+ 内嵌大对象描述符:
|
|
|
+ BLOB类型:'b' + 大对象数据 即:大对象数据仍直接返回,只是前面加了一个 'b'字符,因此大对象数据的长度实际为列数据长度-1
|
|
|
+ CLOB类型:'c' + 大对象数据 即:大对象数据仍直接返回,只是前面加了一个 'c'字符,因此大对象数据的长度实际为列数据长度-1
|
|
|
+
|
|
|
+ 非内嵌大对象描述符:
|
|
|
+ BLOB类型: 'B' + 大对象描述符字串 ,该字符串由两部分组成:前面为descriptor的base64编码,后面为大对象的数据长度(10进制数值串),
|
|
|
+ 中间由空格分开;整个串的长度为列数据长度-1;
|
|
|
+ CLOB类型: 'C' + 大对象描述符字串,其余与BLOB相同
|
|
|
+
|
|
|
+ c) 当大对象字段返回的字段长度为0时,仍表示该字段为空值,不能再去取该字段的数据作为描述符用
|
|
|
+
|
|
|
+ d) 对于内嵌大对象,驱动应保存其数据,而不能从服务器另取数据
|
|
|
+
|
|
|
+ e) 对于非内嵌大对象,驱动在向应用程序返回数据时使用:
|
|
|
+ GET LOB '大对象描述符' offset 偏移量 limit 读取长度; 命令来读取大对象数据. (注意:大对象描述符串包括前面的‘B’或‘C’,
|
|
|
+ 但不包含后面的大对象长度字串,描述前后有'号)
|
|
|
+ 服务端以单行单列结果集的形式返回数据:
|
|
|
+ 对于BLOB,返回的字段名为:BLOBDATA,返回记录的数据长度为实际读取长度(通常就是limit,若已读到尾,则小于limit),
|
|
|
+ 对于CLOB,返回的字段名为:CLOBDATA,若不存在库字符集与客户端字符集的差异,则返回记录的数据长度为实际读取长度,
|
|
|
+ 否则,返回的数据长度为字符集转换后的长度,当然,内容也就为转换后的内容。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+3.数据类型ID的取值:以下取值未写明数值的按有数值的依次向下增1
|
|
|
+
|
|
|
+ TYPE_EMPTY = 0,
|
|
|
+ TYPE_NULL,
|
|
|
+ TYPE_BOOL,
|
|
|
+ TYPE_I1,
|
|
|
+ TYPE_UI1,
|
|
|
+ TYPE_I2,
|
|
|
+ TYPE_UI2,
|
|
|
+ TYPE_I4,
|
|
|
+ TYPE_UI4,
|
|
|
+ TYPE_I8,
|
|
|
+ TYPE_UI8,
|
|
|
+ TYPE_R4,
|
|
|
+ TYPE_R8,
|
|
|
+ TYPE_DATE,
|
|
|
+ TYPE_TIME,
|
|
|
+ TYPE_DATETIME,
|
|
|
+ TYPE_TIMESTAMP,
|
|
|
+ TYPE_INTERVAL_D2S,
|
|
|
+ TYPE_SMALLTIME,
|
|
|
+ TYPE_TIME_TZ,
|
|
|
+ TYPE_DATETIME_TZ,
|
|
|
+ TYPE_INTERVAL_Y2M,
|
|
|
+
|
|
|
+ TYPE_DECIMAL,
|
|
|
+ TYPE_NUMERIC,
|
|
|
+ TYPE_CY,
|
|
|
+ TYPE_STR,
|
|
|
+ TYPE_CHAR,
|
|
|
+ TYPE_VARCHAR,
|
|
|
+ TYPE_CLOB,
|
|
|
+ TYPE_BINARY,
|
|
|
+ TYPE_BLOB,
|
|
|
+ TYPE_IMAGE,
|
|
|
+ TYPE_BLOB_INROW,
|
|
|
+ TYPE_BLOB_S,
|
|
|
+ TYPE_BLOB_M,
|
|
|
+ TYPE_BLOB_OM,
|
|
|
+ TYPE_STREAM,
|
|
|
+ TYPE_AUDIO,
|
|
|
+ TYPE_VIDEO,
|
|
|
+ TYPE_ROWVER,
|
|
|
+
|
|
|
+ TYPE_INTERVAL_Y,
|
|
|
+ TYPE_INTERVAL_M,
|
|
|
+ TYPE_INTERVAL_D,
|
|
|
+ TYPE_INTERVAL_H,
|
|
|
+ TYPE_INTERVAL_MI,
|
|
|
+ TYPE_INTERVAL_S,
|
|
|
+ TYPE_INTERVAL_D2H,
|
|
|
+ TYPE_INTERVAL_D2M,
|
|
|
+ TYPE_INTERVAL_H2M,
|
|
|
+ TYPE_INTERVAL_H2S,
|
|
|
+ TYPE_INTERVAL_M2S,
|
|
|
+ TYPE_GUID,
|
|
|
+
|
|
|
+ TYPE_GEOMETRY=60,
|
|
|
+ TYPE_POINT,
|
|
|
+ TYPE_BOX,
|
|
|
+ TYPE_POLYLINE,
|
|
|
+ TYPE_POLYGON,
|
|
|
+
|
|
|
+
|
|
|
+ TYPE_MAX_SYS=100,
|
|
|
+
|
|
|
+ TYPE_BLADE_BEGIN=101,
|
|
|
+ TYPE_BLADE_END=1000,
|
|
|
+
|
|
|
+ TYPE_OBJECT=1001, /* 对象类型 */
|
|
|
+ TYPE_RECORD, /* 记录类型 */
|
|
|
+ TYPE_VARRAY, /* 数组类型 */
|
|
|
+ TYPE_TABLE, /* 表类型 */
|
|
|
+ TYPE_IDXBY_TAB, /* index by 表类型 */
|
|
|
+ TYPE_ROWTYPE, /* 引用行类型 */
|
|
|
+ TYPE_COLTYPE, /* 引用列类型 */
|
|
|
+ TYPE_ROW, /* 行类型 */
|
|
|
+ TYPE_CUR_REC, /* 引用记录类型(不能更改字段) */
|
|
|
+ TYPE_CURSOR, /* 游标类型 */
|
|
|
+ TYPE_REFCUR, /* REF_CURSOR类型 */
|
|
|
+ TYPE_PARAM,
|
|
|
+
|
|
|
+ TYPE_UDT_BEGIN=1100,
|
|
|
+
|
|
|
+
|
|
|
+4.数据类型返回格式
|
|
|
+ 2.1.若连接时连接串中有 result='char',则各类型数据的返回值皆转换成字符串的形式进行返回,
|
|
|
+
|
|
|
+ 数值型(integer,float,numeric等),返回的字符串变由数字与小数点组成
|
|
|
+ 日期型格式:‘2011-3-3’
|
|
|
+ 时间型格式 ‘12:03:40’或 ‘12:03:40.999'
|
|
|
+ 日期时间型格式:‘2011-3-3 12:34:23' 或 ‘2011-3-3 12:34:23.999'
|
|
|
+ 带时区的日期时间格式:‘2011-3-3 12:34:23+08:00' 或‘2011-3-3 12:34:23-08:00'
|
|
|
+ 带时区的时间格式:‘12:34:23+08:00' 或‘12:34:23-08:00'
|
|
|
+
|
|
|
+ 2.2若连接串中不含 result='char',则各类型数据的返回值通常以二进制方式返回
|
|
|
+
|
|
|
+ char、varchar、clob、numeric等类型以字符串形式返回
|
|
|
+ 数值型(integer等除numeric外)返回格式,就是其二进制格式,只是转换成了网络序
|
|
|
+ date: 32位网络序整数,为从1970-1-1起流失的天数(负数表示在1970-1-1之前)
|
|
|
+ time: 32位网络序整数,为一天内从0:0:0开始流失的毫秒数
|
|
|
+ datetime:64位网络序整数,为从1970-1-1起流失的毫秒数(负数表示在1970-1-1之前)
|
|
|
+ time with time zone:6字节,前4字节为32位网络序时间值,后2字节为16位网络序时区值,时间值与time的处理方式一样,
|
|
|
+ 时区值为时区相对于格林威治天文台的时差,单位为分钟,有正负之分。
|
|
|
+ datetime with time zone:10字节,前8字节为64位网络序日期时间值,后2字节为16位网络序时区值,日期时间值与datetime的处理方式一样,
|
|
|
+ 时区值为时区相对于格林威治天文台的时差,单位为分钟,有正负之分。
|
|
|
+
|
|
|
+ interval year: 32位网络序整数,单位为年
|
|
|
+ interval month: 32位网络序整数,单位为月
|
|
|
+ interval day: 32位网络序整数,单位为天
|
|
|
+
|
|
|
+ interval hour: 32位网络序整数,单位为小时
|
|
|
+ interval minute:32位网络序整数,单位为分钟
|
|
|
+ interval second:64位网络序整数,单位为毫秒(微秒 CYJ)
|
|
|
+
|
|
|
+ 注:interval XX to YY(如interval day to second)其返回的值的格式与 interval YY相同,
|
|
|
+ 即:interval day to second 返回格式与interval second相同,余类推
|
|
|
+
|