首页 > 代码库 > OTL翻译(4) -- otl_stream类
OTL翻译(4) -- otl_stream类
otl_stream
Otl_stream是具体实现otl_stream_concept的类。任何的SQL语句、SQL语句块和存储过程都能通过otl_stream进行处理。
传统的数据库API处理SQL语句的时候,需要绑定变量与占位符,因此,程序员需要定义变量、解析SQL语句、调用绑定占位符的函数、把变量绑定到占位符上、执行SQL、读取输出的变量等等。如此循环。以上所有的这些操作在OTL里面的otl_stream类里面都是自动处理的,otl_stream类提供了与数据库交互自动化最大性能。该性能仅取决于一个参数-缓冲区大小。缓冲区是用于存放SQL执行过程中的逻辑行数。
注:在timesten7.0.2或以上版本的数据库中,定义了OTL_TIMESTEN_UNIX或OTL_TIMESTEN_WINDOWS宏的时候,缓冲区大小可以设置为0。此时表示默认使用数据库的最佳缓冲区大小。一般情况下是一个元素大小。具体更多信息请参考数据库的手册。
一个SQL语句在otl_stream里面至少需要一个输入或输出占位符,对于没有占位符的SQL语句,它将被作为常量的SQL语句作为另一种方式执行。
从OTL4.0.115版本开始后,缓冲区大小的类型为整形,以前的版本全是短整形。如果需要支持旧版本的代码,请在编译代码前添加定义OTL_STREAM_LEGACY_BUFFER_SIZE_TYPE宏。
Otl_stream类有如下的公共方法:
序号 | 函数名 | 说明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | otl_stream(…)
| 仅ORACLE 7/8/9/10/11版本 构造函数。该构造函数创建一个otl_steram对象,并且调用open()函数。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | otl_stream(…)
| 仅ODBC/DB2 CLI 构造函数,该构造函数创建一个otl_stream对象,并且调用open()函数。 在ODBC和DB2 CLI下面对该对象还定义了如下两个常量: otl_explicit_select:指定该流为一个简单的SELECT语句流; otl_implicit_select:指定该流为一个返回结果集的流; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | void open(…)
| 仅ORACLE 7/8/9/10/11版本 该函数打开(执行)SQL语句,总共分为如下:解析SQL语句、在流内部为输入输出变量分配内存空间、自动绑定变量到对应的占位符。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | void open(…)
| 仅ODBC/DB2 CLI 该函数打开(执行)SQL语句,总共分为如下:解析SQL语句、在流内部为输入输出变量分配内存空间、自动绑定变量到对应的占位符。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | int eof() | 测试流里面是否所有的数据全被读取出来,该函数与C++的IO流里面的eof()函数同理。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | int setBufSize(const int buf_size) | 设置缓冲区大小。该函数仅是对后续的otl_connect::operator>>(otl_stream&)操作保存(新建)一个新的缓冲区。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | void flush() | 刷新输出流缓冲区。它实际上的操作是通过执行流里面的SQL语句来填充输出缓冲区。流在缓冲区满的情况下自动的进行刷新操作。该函数与C++的IO流的flush()同理。 如果在设置了auto-commit标识的情况下,在刷新了输出缓冲区后,也就会自动的进行一次事务提交。更详细的解释请见set_commit() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | void flush(…)
| 在OCI8/8i/9i/10g/11g的版本里面还带有一个带两个参数的flush()版本的函数。该函数有两方面的作用: 1、 对大数据量的操作更高效 2、 能够识别(发现)出重复的数据,并抛出异常 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 | int get_auto_commit_flag() | 取得自动提交标识。 1:表示自动提交标识已设置 0:表示自动提交标识未设置 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | int get_stream_type() | 仅ORACLE 7/8/9/10/11版本 取得流的类型。返回的类型由如下的整形常量: otl_no_stream_type—流还未通过SQL进行实例化 otl_select_stream_type—流是一个简单的SELECT语句的流 otl_inout_stream_type—流是通过一个带有输入输出参数的匿名的SQL块进行实例化的,还有可能是一个存储过程。 otl_refcur_stream_type—流是通过一个SQL语句块进行实例化的,该SQL块返回的是一个游标。在这种流的情况下,只能有输入参数,输出参数一定是一个游标。 otl_constant_sql_type—该类型本只能在使用create_stored_proc_call()里面使用,然而它代表了一种流类型。在create_stord_proc_call()里面它本义也是指不带有参数的,而且它必须通过otl_cursor::direct_exec()执行。 otl_mixed_refcur_stream_type—只由create_stoerd_proc_call()实例的类型。它能够带有输入或输出参数,并且一定有返回一个游标。如果create_stored_proc_call()的sql_stm参数设定了的情况下,流的缓冲区大小必须设置为1,并且必须通过otl_refcur_stream去读取游标的数据。更详细的请见例:153 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 | static void create_stored_proc_call(…)
| 仅ORACLE 7/8/9/10/11版本 不能定义在OTL_UNICODE宏下面实现。通过存储过程名去实现一个兼容的otl_stream流。 这是个静态的函数,意图去实现调用oracle的存储过程。 为了能够获取到存储过程的参数和类型,该函数使用ORACLE的系统数据字典。可能会抛出32014、32015、32016的OTL异常。 该函数能够调用下列的函数或存储过程: 1:当前或指定用户名下面的SQL包的存储过程或函数;当前或指定用户名下面的全局的存储过程或函数。 2:公共或私有同义词下面的SQL包的存储过程或函数;公共或私有同义词下面的全局的存储过程或函数。 3:没有重载(同名)的存储过程或函数。 4:带有标量的输入或输出参数,或带有输出游标的存储过程或函数。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12 | void clean(const int clean_up_error_flag = 0) | 在不刷新缓冲区的情况下,清理掉缓冲区里面的内容。 如果clean_up_error_flag参数设置为1,那么除了清掉缓冲区内容的同时,还清理掉流里面抛出的异常信息。详细请见例:65、66、67.该参数的意义在于提供一个不需要关闭流的情况下可以重新返回数据库的相关错误信息。 在4.0.6及以后的版本中,该函数还能中断一个正在执行中的SQL语句,并且清空错误信息。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13 | void rewind() | 重新处理一个流(恢复一个流到初始状态)。如果该流没有参数,则强制该流的执行。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 | operator int() | 把流转换为int类型的重载操作符。它返回!eof()的结果状态。它能够被用在一直循环里面,如下: while(s>>f1>>f2){ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
15 | void cancal() | 仅ODBC / DB2 CLI。 中止一个正在处理中的SELECT语句或是存储过程。而且对于一个线程中正在运行的,另一个线程能异步的中止该正在执行中的流。 具体的中止操作取决于数据库层的API函数。并且错误信息也是由数据库层抛出。 OCI8/8i/9i/10g也有一个相类似的函数otl_connect:cancel(),但是与DB2 CLI确是不同的。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16 | bool get_next_diag_rec(…)
| 仅支持ODBC。 必须定义OTL_ODBC_SQL_STATEMENT_WITH_DIAG_REC_OUTPUT宏。 该函数是用来通过MS SQL SERVER的BACKUP/DBCC命令获取动态的记录。函数内部实际是调用SQLGetDiagRec()函数。记录的索引从1开始计数。函数能自动的增加索引。更详细资料请见例:688、689 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
17 | SQLHSTMT get_stm_handle() | 仅ODBC适用 必须定义OTL_ODBC_SQL_STATEMENT_WITH_DIAG_REC_OUTPUT宏。 该函数用来返回底层的ODBC句柄。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18 | int is_null() | 测试是否stream返回一个空值 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
19 | void set_lob_stream_mode(const bool mode = false) | 设置log_stream_mode标识。该标识通知流使用otl_lob_stream操作。在OCI8上面该函数不是必须的,不过在ODBC/DB2 CLI或是otl_stream_read_iterator一起使用的时候,必须设置该值。或是在代码里面添加多数据库支持的时候,必须调用该函数。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
20 | long get_rpc() | 返回数据库本次操作返回的记录行数。 返回的数据由INSERT/UPDATE/DELETE语句返回的操作行数;对于INSERT操作,它返回的是小于或等于缓冲区大小。对于UPDATE或DELETE语句,它取决于实际更新或删除的行数。 在4.0.6及以后的版本中,该函数对于SELECT语句返回的是累计操作的行数。 对于ORACLE和DB2 CLI或ODBC,该函数返回值有些不同。如对于出错状态的情况下,ORACLE返回的是实际成功的行数,而对于DB2或ODBC它返回的总是0. 结论:对于想兼容所有的数据库来说,该函数并不适用于所有的数据库。但对于ORACLE的不同版本的数据库来说,它还是通用的。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
21 | void set_commit(int auto_commit = 0) | 设置流的auto-commit标识。 当流的输出缓冲区刷新的时候,就会自动进行事务提交操作。 如果想避免自动提交,请设置自动提交标识为false。 该自动提交标识与数据库的自动提交是两码事,该自动提交标识只是OTL自己的自动事务提交标识。 实际上设置为非自动提交还是非常方便的,在这种情况下,就可以使用otl_nocommit_stream类。otl_nocommit_stream类是一个直接继承otl_stream类的子类,仅是关闭了自动提交标识。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
22 | void set_flush(const bool auto_flush = true) | 设置流的自动刷新标识。 默认值为真。实际上,流的析构函数试图进行刷新操作。自动刷新标识可以通过该函数进行关闭。如果自动刷新标识被关闭后,流就必须通过otl_stream::close()或otl_stream::flush()操作来强制刷新流,因为就算流的脏标志为真的情况下流的析构函数也不会去刷新缓冲区。 该函数仅是禁止析构函数里面的自动刷新功能。对于一般的缓冲区提交不能禁止。例如缓冲区满的情况下还是会自动进行刷新操作。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
23 | otl_var_desc * describe_out_vars(int & desc_len) | 一组用来分析流的输入或输出绑定变量的函数。函数返回一个otl_var_desc结构体的指针。 otl_var_desc类类型如下:
该函数用来取得输出变量的属性,参数desc_len返回的是otl_var_desc结构体大小。如果流里面没有输出参数,则返回0。如果有参数同时为输入和输出参数,它返回输出参数部分。 流的输出参数指的是取出流的部分。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
24 | otl_var_desc * describe_in_vars(int & desc_len) | 该函数用来取得输入变量的属性,参数desc_len返回的是otl_var_desc结构体大小。如果流里面没有输入参数,则返回0。如果有参数同时为输入和输出参数,它返回输入参数部分。 流的输入参数指的是输入流的部分。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
25 | otl_var_desc * describe_next_out_var() | 取得下一步输出变量。“下一个”指的是从流中读取了以后,下一个读出来的输出变量。比如调用了otl_stream::operator<<()后,有时候我们想要知道下一步输出变量的类型。如果没有下一个变量的时候,函数返回0. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
26 | otl_var_desc * describe_next_in_var() | 取得下一步输入变量。“下一个”指的是从往流中写入了以后,下一个写入的输入变量。比如调用了otl_stream::operator<<()后,有时候我们想要知道下一步输入变量的类型。如果没有下一个变量的时候,函数返回0. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
27 | (1) void close() | 关闭流。该函数与C++里面的流具有相同的概念。该函数有两个版本,一个是普通的版本,另一个是在定义了OTL_STREAM_POOLING_ON宏下的另一个版本。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
28 | (2) void close(const bool save_in_stream_pool = true) | 定义了OTL_STREAM_POOLING_ON宏情况下使用。 save_in_stream_pool标志是一个初始化标志。当它设置为真的时候,在定义了OTL_STREAM_POOLING_ON宏的情况下,关闭一个流,并非真正的把流关闭了,而是把该流放到一个流缓冲池下面。如果后续还要接着使用该流,那直接调用缓冲池里面的流就可以,而不用重新再新建一个流。 如果标志设置为假,那么关闭流的时候就是真正关闭了流。 在对于某些流需要消耗大量系统资源的情况下,该参数非常有用。因为可以减少分配、删除流资源的时间而提高性能。 更详细的请见例:113、114、115 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
29 | int good() | 测试流是否是打开的。与C++里面的流打开具有相同的功能。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30 | otl_column_desc * describe_select(int & desc_len) | 取得流的输出变量的字段列表。 仅对下列有效:
函数返回otl_column_desc结构体的指针。otl_column_desc类型如下:
OTL定义了如下的类型与相应的数据库类型相对应:
除了返回结构体的指针外,该函数还返回一个desc_len的参数。该参数表示返回的字段列表的长度。该函数返回的结构的指针不用用户删除,流里面在析构的时候会处理删除任务。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
31 | void reset_to_last_valid_row() | 当OTL抛出“incompatible data type in stream operation”异常的时候,该异常为OTL内部的异常,它在流里面的SQL执行之前抛出,此时reset_to_last_valid_row()函数就能把输出缓冲区恢复到最后一个正确的位置。这个时候就能正确的调用flush()操作。如下: otl_stream str | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
32 | otl_stream & operator>>(unsigned char * s) | 从流里面读取数据 当定义了OTL_UNICODE的时候,它返回的是以NULL结尾的双字节的字符串。否则返回的是单字节的字符串。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
33 | otl_stream & operator>>(otl_long_unicode_string & s) | 在定义了OTL_UNICODE或OTL_UNICODE_CHAR_TYPE宏情况下,返回UNICODE的LOB类型 | |||||||||||||||||||||||||||||||||
34 | otl_stream & operator>>(OTL_UNICODE_CHAR_TYPE&c) | 在定义了OTL_UNICODE或OTL_UNICODE_CHAR_TYPE宏情况下,返回UNICODE的字符类型 | |||||||||||||||||||||||||||||||||
35 | otl_stream operator>>(OTL_UNICODE_CHAR_TYPE * s) | 在定义了OTL_UNICODE或OTL_UNICODE_CHAR_TYPE宏情况下,返回UNICODE的字符串 | |||||||||||||||||||||||||||||||||
36 | otl_stream & operator>>(OTL_UNICODE_STRING_TYPE & s) | 在定义了OTL_UNICODE或OTL_UNICODE_CHAR_TYPE/OTL_UNICODE_STRING_TYPE宏情况下,返回UNICODE的string类型,能够很好的读取大数据字段类型,如TEXT类型等。 | |||||||||||||||||||||||||||||||||
37 | otl_stream & operator>>(char & c) | 返回单字节的字符 | |||||||||||||||||||||||||||||||||
38 | otl_stream & operator>>(undigned char & c) | 返回单字节的无符号字符 | |||||||||||||||||||||||||||||||||
39 | otl_stream & operator>>(char * s) | 返回单字节的字符串类型 | |||||||||||||||||||||||||||||||||
40 | otl_stream& operator>>(unsigned char* s); | 返回无符号的单字节字符串类型 | |||||||||||||||||||||||||||||||||
41 | otl_stream& operator>>(otl_long_string& s); | 返回LOB类型 | |||||||||||||||||||||||||||||||||
42 | otl_stream& operator>>(std::string& s); | 必须定义OTL_STL宏。 读取流中的string类型 | |||||||||||||||||||||||||||||||||
43 | otl_stream& operator>>(ACE_TString& s); | 必须定义OTL_ACE。 读取流中的ACE_TString类型。 | |||||||||||||||||||||||||||||||||
44 | otl_stream& operator>>(USER_DEFINED_STRING_CLASS & s); | 必须定义USER_DEFINE_STRING_CLASS和OTL_USER_DEFINED_CLASS_ON宏。 读取用户自定义的与string类型兼容的类型。 | |||||||||||||||||||||||||||||||||
45 | otl_stream& operator>>(int& n); | 读取32位有符号整型 | |||||||||||||||||||||||||||||||||
46 | otl_stream& operator>>(unsigned& u); | 读取32位无符号整武师 | |||||||||||||||||||||||||||||||||
47 | otl_stream& operator>>(short& sh); | 读取16位短整型 | |||||||||||||||||||||||||||||||||
48 | otl_stream& operator>>(long int& l); | 读取长整型(具体长度由编译器决定) | |||||||||||||||||||||||||||||||||
49 | otl_stream& operator>>(float& f); | 读取4字节长度的浮点型 | |||||||||||||||||||||||||||||||||
50 | otl_stream& operator>>(double& d); | 读取8字节长度的浮点型 | |||||||||||||||||||||||||||||||||
51 | otl_stream& operator>>(OTL_BIGINT& d); | 在定义了OTL_BIGINT的情况下。对于不支持bigint的ODBC来说,该操作能将一个数字串转换为64位的有符号整型。 必须定义OTL_STRING_TO_BIGINT/OTL_BIGINT_TO_STRING。 | |||||||||||||||||||||||||||||||||
52 | otl_stream& operator>>(otl_datetime& dt); | 读取流中的时间信息 | |||||||||||||||||||||||||||||||||
53 | otl_stream& operator>>(otl_XXX_tab<…>& tab); | 通过OCI来读取SQL语句中的表信息 | |||||||||||||||||||||||||||||||||
54 | otl_stream& operator>>(otl_lob_stream& lob); | 把CLOB/BLOB/TEXT/IMAGE类型读取到otl_lob_stream类型里面 | |||||||||||||||||||||||||||||||||
55 | otl_stream& operator>>(otl_refcur_stream& refcur); | 把游标的信息读取到otl_refcur_stream类型里面。 | |||||||||||||||||||||||||||||||||
56 | otl_stream& operator<<(const unsigned char* s); | 往流中写入信息。 往流中写入一个以NULL结尾的字符串。如果定义了OTL_UNICODE,则是双字节字符串。 | |||||||||||||||||||||||||||||||||
57 | otl_stream& operator<<(otl_long_unicode_string& s); | 往流中写入UNICODE LOB类型 | |||||||||||||||||||||||||||||||||
58 | otl_stream& operator<<(const OTL_UNICODE_CHAR_TYPE& c); | 在定义了OTL_UNICODE_CHAR_TYPE宏的情况下,往流中写入一个UNICODE字符 | |||||||||||||||||||||||||||||||||
59 | otl_stream& operator<<(const OTL_UNICODE_CHAR_TYPE* s); | 往流中写入一个UNICODE字符串 | |||||||||||||||||||||||||||||||||
60 | otl_stream& operator>>(const OTL_UNICODE_STRING_TYPE& s); | 在定义了OTL_UNICODE/OTL_UNICODE_CHAR_TYPE/OTL_UNICODE_STRING_TYPE宏的情况下,把一个字符串写入到流中。(可以是大对象) | |||||||||||||||||||||||||||||||||
61 | otl_stream& operator<<(const char c); | 往流中写入一个字符 | |||||||||||||||||||||||||||||||||
62 | otl_stream& operator<<(const unsigned char c); | 往流中写入一个无符号的字符 | |||||||||||||||||||||||||||||||||
63 | otl_stream& operator<<(const char* s); | 往流中写入一个以NULL结尾的字符串 | |||||||||||||||||||||||||||||||||
64 | otl_stream& operator<<(const unsigned char* s); | 往流中写入一个以NULL结尾的无符号的字符串 | |||||||||||||||||||||||||||||||||
65 | otl_stream& operator<<(const otl_long_string& d); | 往流中写入LOB类型对象 | |||||||||||||||||||||||||||||||||
66 | otl_stream& operator<<(const std::string& s); | 在定义了OTL_STL宏的情况下,往流里面写入一个STL的string类型。 | |||||||||||||||||||||||||||||||||
67 | otl_stream& operator<<(const ACE_TString &s); | 在这、定义了OTL_ACE宏的情况下,往流中写入一个ACE_TString类型。 | |||||||||||||||||||||||||||||||||
68 | otl_stream& operator<<(const USER_DEFINED_STRING_CLASS &s); | 在定义了USER_DEFINED_STRING_CLASS和OTL_USER_DEFINED_CLASS_ON宏的情况下,往流中写入一个用户自定义的字符串类型 | |||||||||||||||||||||||||||||||||
69 | otl_stream& operator<<(const int n); | 往流中写入一个有符号的整型 | |||||||||||||||||||||||||||||||||
70 | otl_stream& operator<<(const unsigned u); | 往流中写入一个无符号的整型 | |||||||||||||||||||||||||||||||||
71 | otl_stream& operator<<(const short sh); | 往流中写入一个短整型 | |||||||||||||||||||||||||||||||||
72 | otl_stream& operator<<(const long int l); | 往流中写入一个长整型 | |||||||||||||||||||||||||||||||||
73 | otl_stream& operator<<(const float f); | 往流中写入4字节长度的浮点型 | |||||||||||||||||||||||||||||||||
74 | otl_stream& operator<<(const double d); | 往流中写入8字节长度的浮点型 | |||||||||||||||||||||||||||||||||
75 | otl_stream& operator<<(const OTL_BIGINT d); | 在定义了OTL_BIGINT的情况下。对于不支持bigint的ODBC来说,该操作能将一个数字串转换为64位的有符号整型。 必须定义OTL_STRING_TO_BIGINT/OTL_BIGINT_TO_STRING。 | |||||||||||||||||||||||||||||||||
76 | otl_stream& operator<<(const otl_null &n); | 往流中写入NULL值。 OTL定义了一个匿名的NULL类,如下: class otl_null { public: otl_null(); ~otl_null(); }; | |||||||||||||||||||||||||||||||||
77 | otl_stream& operator<<(const otl_datetime& dt); | 往流中写入日期/时间类型。OTL定义了自已的一个otl_datetime类,如下:
fraction/frac_precision两个成员是由数据库决定的。具体数据库支持的精度不一样,该两个成员变量值也不一样。 | |||||||||||||||||||||||||||||||||
78 | otl_stream& operator<<(const otl_XXX_tab<…>& tab); | 往流中写入SQL的表信息 | |||||||||||||||||||||||||||||||||
79 | otl_stream& operator<<(otl_lob_stream& lob); | 往流中写入otl_lob_stream对象 | |||||||||||||||||||||||||||||||||
80 | void set_all_column_types (const unsigned int amask=0); | 设置一组输出字段的类型。可以有如下设置: otl_all_num2str otl_all_date2str otl_all_num2str | otl_all_date2str | |||||||||||||||||||||||||||||||||
81 | void set_column_type (const int column_ndx, const int col_type, const int col_size=0); | 设置输出字段的类型。 column_ndx索引为输出字段的相对位置,如1、2、3. col_type是由OTL定义的一组类型。 col_size是指用来存放新的类型的长度,该长度只对otl_var_char类型有效,对于数值类型能自动计算得出。 该函数能被简单的SELECT语句、带游标的SELECT语句和返回结果集的SELECT语句调用。 该函数里面的类型组合如下:
该函数强烈要求限制使用,只有在那些确实因为数值容纳不下的情况下,才允许使用otl_var_char进行转换 | |||||||||||||||||||||||||||||||||
82 | int get_dirty_buf_len(); | 返回流的缓冲区里面脏数据的行数。所谓的脏数据,指的是对于缓冲区大于1的时候,当执行SQL语句的时候,缓冲区未被填满的情况下,已经使用了的缓冲区条数。如缓冲区为100条记录,在执行某SELECT语句后,取出30条数据,那么缓冲区此时不会被刷新,缓冲区里面有30条数据,执行此函数后就返回30. 如果缓冲区长度被设置为1后,该函数总是返回0.因为如果缓冲区为1后,每次取出记录都会填满缓冲区,此时缓冲区被填满后就会自动刷新,所以缓冲区里面未被刷新的数据总是0条。所以总是返回0. 该函数同样可以返回SELECT语句的游标或结果集缓冲区里面的脏数据。 对于其它的(非SELECT/UPDATE/DELETE/UPDATE)SQL语句块或存储过程,该函数未定义。 | |||||||||||||||||||||||||||||||||
83 | int get_prefetched_row_count(); | 返回SELEC语句、有结果集的存储过程或ORACLE的游标的累计的结果行数。而对于其他的存储过程则总是返回0. 如:对于某SELECT语句,第一次执行返回50,第二次执行返回50,第三次执行结果返回23,那么执行该函数时候,依次返回的的结果是50、100、123. | |||||||||||||||||||||||||||||||||
84 | void skip_to_end_of_row(); | 把读取流的指针定位到当前行的末尾。以便下次读取流的时候,又从逻辑行的第一列开始读取。 | |||||||||||||||||||||||||||||||||
85 | void check_end_of_row(); | 检测是否到达行的末尾。如果没有到达行的末尾,该函数抛出END_OF_ROW check failed异常。 | |||||||||||||||||||||||||||||||||
86 | otl_stream& operator>>(otl_stream& (*pf) (otl_stream&)); | 该函数调用(*pf)流函数(check_end_of_row())。常用法如下: s>>f1>>f2>>endr; | |||||||||||||||||||||||||||||||||
87 | otl_stream& operator<<(otl_stream& (*pf) (otl_stream&)); | 同上,把输出定义为输入。 |
OTL翻译(4) -- otl_stream类