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(…)

序號

參數

說明

1

const int arr_size

緩沖區大小

2

const char * sqlstm

SQL語句或SQL語句塊

3

otl_connect & db

otl_connect對象

4

const char * ref_cur_placeholder = 0

如果otl_stream返回一個游標,則該參數指定游標的占位符

5

const char * sqlstm_label = 0

sql語句標識,如果指定了該參數,則會用sqlstm_label填充otl_exception::stm_text,並且原來的SQL語句將不可見。

 

僅ORACLE 7/8/9/10/11版本

構造函數。該構造函數創建一個otl_steram對象,並且調用open()函數。

2

otl_stream(…)

序號

參數

說明

1

const int arr_size

緩沖區大小

2

const char * sqlstm

SQL語句或SQL語句塊

3

otl_connect & db

otl_connect對象

4

const int implicit_select = otl_explicit_select

如果otl_stream返回一個存儲過程的結果集,該參數必須指定為otl_implicit_select

5

const char * sqlstm_label = 0

sql語句標識,如果指定了該參數,則會用sqlstm_label填充otl_exception::stm_text,並且原來的SQL語句將不可見。

 

僅ODBC/DB2 CLI

構造函數,該構造函數創建一個otl_stream對象,並且調用open()函數。

在ODBC和DB2 CLI下面對該對象還定義了如下兩個常量:

otl_explicit_select:指定該流為一個簡單的SELECT語句流;

otl_implicit_select:指定該流為一個返回結果集的流;

3

void open(…)

序號

參數

說明

1

const int arr_size

緩沖區大小

2

const char * sqlstm

SQL語句或SQL語句塊

3

otl_connect & db

otl_connect對象

4

const char * ref_cur_placeholder = 0

如果otl_stream返回一個游標,則該參數指定游標的占位符

5

const char * sqlstm_label = 0

sql語句標識,如果指定了該參數,則會用sqlstm_label填充otl_exception::stm_text,並且原來的SQL語句將不可見。

 

僅ORACLE 7/8/9/10/11版本

該函數打開(執行)SQL語句,總共分為如下:解析SQL語句、在流內部為輸入輸出變量分配內存空間、自動綁定變量到對應的占位符。

4

void open(…)

序號

參數

說明

1

const int arr_size

緩沖區大小

2

const char * sqlstm

SQL語句或SQL語句塊

3

otl_connect & db

otl_connect對象

4

const int implicit_select = otl_explicit_select

如果otl_stream返回一個存儲過程的結果集,該參數必須指定為otl_implicit_select

5

const char * sqlstm_label = 0

sql語句標識,如果指定了該參數,則會用sqlstm_label填充otl_exception::stm_text,並且原來的SQL語句將不可見。

 

僅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(…)

序號

參數

說明

1

const int row_offset = 0

指定刷新緩沖區的行數

2

const bool force_flush = false

忽略以前的錯誤強制刷新

 

在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(…)

序號

參數

說明

1

otl_connect& db

otl_connect對象

2

otl_stream & args_strm

otl_stream的外部實例。意思是函數外部的一個變量。為了保證函數能從數據字典表里面取得數據庫的信息,該變量必須通過“SELECT … FROM ALL_ARGUMENTS …”來實例化。該變量實例化一次就可以以后續的函數里多次使用。

3

chat * sql_stm

輸出參數。帶有參數的存儲過程名,或兼容otl_stream的SQL語句塊。

4

int & stm_type

輸出參數,otl_stream的類型

5

char * refcur_placeholder

輸出參數。如果存儲過程返回一個游標,則該參數保存游標的名字。后面可以被otl_stream::otl_stream()/otl_stream::open()使用。

6

const char * proc_name

存儲過程名

7

const char * package_name

存儲過程所在的包的名字

8

const char * schema_name = 0

存儲過程和包所在的模式名(用戶名)

9

const bool schema_name_include = false

指定調用的存儲過程名里面是否帶有模式(用戶)名。

10

const int varchar_size = 2001

存儲過程里面的VARCHAR類型的參數是沒有大小的。該參數指定VARCHAR參數的大小。

11

const int all_num2type = otl_var_double

該參數定義了NUMBER類型參數如何對應綁定變量

12

const int refcur_buf_size = 1

在存儲過程返回游標的情況下,該參數指定游標緩沖區大小。該參數此時對性能影響較大。

 

僅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){ 
    cout<<"f1="<<f1
        <<", f2="
        <<f2<<endl; 
  }

15

void cancal()

僅ODBC / DB2 CLI。

中止一個正在處理中的SELECT語句或是存儲過程。而且對於一個線程中正在運行的,另一個線程能異步的中止該正在執行中的流。

具體的中止操作取決於數據庫層的API函數。並且錯誤信息也是由數據庫層拋出。

OCI8/8i/9i/10g也有一個相類似的函數otl_connect:cancel(),但是與DB2 CLI確是不同的。

16

bool get_next_diag_rec(…)

序號

參數

說明

1

short int & rec_ndx

動態記錄的索引

2

SQLCHAR *sqlstate_buf

SQL狀態緩沖區,在unicode情況下,該參數類型為SQLWCHAR

3

SQLCHAR * msgbuf

消息緩沖區,在unicode情況下,參數類型為SQLWCHAR

4

short int msg_buf_size

消息緩沖區大小

5

int & native_error

本機錯誤

 

僅支持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類類型如下:

序號

類型

說明

1

int param_type

0:輸入變量

1:輸出變量

2輸入輸出變量

2

int ftype

otl的數據類型,詳細見OTL類型與數據庫類型對比表

3

int elem_size

元素大小

4

int array_size

數組大小。對於標量來說,總是1

5

int pos

在SELECT語句里面,表示一個相對的輸出變量的位置,如1、2、3

6

int name_pos

在定義了語句占位符的情況下,它表示占位符的相對的位置。如0,1,2

7

char name[128]

在變量定義為占位符的情況下,它表里前127個字節

8

int pl_tab_flag

在OCI里面,如果變量定義為表名,則值為1,否則為0

 

該函數用來取得輸出變量的屬性,參數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)

取得流的輸出變量的字段列表。

僅對下列有效:

  • straight SELECT statement (OCIx, ODBC, and DB2-CLI)
  • Referenced cursor (OCIx)
  • Result set returned via a stored procedure call (ODBC for MS SQL Server and Sybase, DB2-CLI for DB2)

函數返回otl_column_desc結構體的指針。otl_column_desc類型如下:

序號

成員變量

說明

1

char * name

字段名

2

int dbtype

該值依賴於特定的數據庫。對於OCI或ODBC有不同的值,詳細請參見數據庫。

3

int otl_var_dbtype

OTL定義的字段類型編碼

4

int dbsize

字段長度

5

int scale

數值類型的精度

6

int prec

數值類型的小數位

7

int nullok

指定字段是否為空

8

int charset_form

僅在定義了OTL_UNICODE和OTL_ORA9I/OTL_ORA10G宏時候有效。

1:單字節

2:雙字節

3:其他

9

int char_size

僅在定義了OTL_UNICODE和OTL_ORA9I/OTL_ORA10G宏時候有效。

字段長度(按字母),在OTL_ORA8I情況下該值為0,因為相應的屬性不被支持。

 

OTL定義了如下的類型與相應的數據庫類型相對應:

序號

OTL類型常量

OTL類型編碼

對應的數據庫類型

1

otl_var_bigint

20

MS SQL SERVER/DB2/MYSQL/POSTGRESQL里面的bigint類型(singed 64 bit integer)

2

otl_var_blob

12

oracle8/9/10/11里面的blob類型

3

otl_var_char

1

NULL結尾的字符類型

4

otl_var_clob

11

oracle8/9/10/11里面的clob類型

5

otl_var_db2date

17

db2 date類型

6

otl_var_db2time

16

db2 time類型

7

otl_var_double

2

8字節長度的浮點型

8

otl_var_float

3

4字節長度的浮點型

9

otl_var_int

4

有符號的32位整形

10

otl_var_long_int

7

對於LLP64的C++編譯器是32位有符號整形;對於LP-64編譯器,則是64位有符號整形

11

otl_var_ltz_timestamp

19

對於ORACLE 9I/10G/11G,帶有TIME ZONE的TIMESTAMP類型

12

otl_var_raw

23

RAW, BINARY, VARBINARY, BYTEA, VARCHAR BYTE, CHAR BYTE類型

13

otl_var_raw_long

10

ORACLE里面的LONG RAW;MS SQL SERVER/SYBASE里面的IMAGE;DB2里面的BLOB類型

14

otl_var_short

6

16位有符號整型

15

otl_var_timestamp

8

ORACLE的TIMESTAMP;

DB2的TIMESTAMP;

MS SQL的DATETIME/DATETIME2/TIME/DATE;

SYBASE的TIMESTAMP類型

16

otl_var_tz_timestamp

18

ORACLE下的帶timezone的timestamp

17

otl_var_unsigned_int

5

無符號32位整型

18

otl_var_varchar_long

9

ORACLE里面的LONG;

MS SQL里面的TEXT;

DB2的CLOB類型

 

除了返回結構體的指針外,該函數還返回一個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
   (100,
    "INSERT INTO test_tab VALUES(:f1<int>,:f2<char[31]>)",
   db);
   ...
   try{
     // writing rows into the stream
     ...
   }catch(const otl_exception& ex){
      if(ex.code==32000){
       str.reset_to_last_valid_row();
       str.flush();
      }
   }

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類,如下:

序號

成員變量

說明

1

int year

2

int month

3

int day

4

int hour

小時

5

int minute

分鍾

6

int second

7

unsigned long fraction

微秒部分,默認為0

8

int frac_precision

秒的精度部分,默認為0

9

short int tz_hour

定義了OTL_ORA_TIMESTAMP或OTL_ODBC_TIME_ZONE宏情況下的時區小時

10

short int tz_minute

定義了OTL_ORA_TIMESTAMP或OTL_ODBC_TIME_ZONE宏情況下的時區分鍾

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默認對應類型

OTL兼容的類型

1

NUMBER(ORACLE)

otl_var_double

otl_var_char, otl_var_int, otl_var_float, otl_var_short, otl_var_unsigned_int

2

NUMBER,FLOAT,REAL,MONEY,DECIMAL(MS SQL SERVER/SYBASE/DB2)

otl_var_double

otl_var_char, otl_var_int, otl_var_float, otl_var_short, otl_var_unsigned_int, otl_var_long_int

3

INT(MS SQL SERVER/SYBASE/DB2)

otl_var_int

otl_var_char, otl_var_double, otl_var_float, otl_var_short, otl_var_unsigned_int, otl_var_long_int

4

SMALLINT,TINYINT(MS SQL SERVER/SYBASE/DB2)

otl_var_short

otl_var_char, otl_var_int, otl_var_float, otl_var_double, otl_var_unsigned_int, otl_var_long_int

5

DATE(ORACLE),DATETIME(MS SQL SERVER/SYBASE)

otl_timestamp

otl_var_char

6

LONG ( ORACLE)

otl_var_varchar_long

otl_var_char (<=32000 bytes)

7

TEXT(MS SQL SERVER/SYBASE)

otl_var_varchar_long

otl_var_char(<= max. size of varchar, e.g. <=8000 in MS SQL)       

該函數強烈要求限制使用,只有在那些確實因為數值容納不下的情況下,才允許使用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&));

同上,把輸出定義為輸入。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM