青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

寶杉的博客

UNIX/LINUX;ACE;SNMP;C++
posts - 33, comments - 23, trackbacks - 0, articles - 0

OTL 4.0, OTL concept

Posted on 2007-08-20 16:58 寶杉 閱讀(2592) 評論(4)  編輯 收藏 引用 所屬分類: OTL

OTL stream concept

Any SQL statement, PL/SQL block or a stored procedure call is characterized by its input / output [variables].

Example 1. A SELECT statement has scalar input variables that are used in the WHERE clause of the statement. The SELECT statement also defines output columns. Potentially, the output columns are vector parameters since the SELECT statement may return multiple rows.

Example 2. An INSERT statement writes data into a table, i.e. it has input parameters. Same is true for UPDATE statemements.

Example 3. A DELETE statement deletes rows from a table. Deletion criteria needs to be entered, thus the DELETE statement has input.

Example 4. A stored procedure may have input and/or output parameters. Usually, stored procedure parameters are scalars. There is a special case, though: stored procedure returning a referenced cursor (Oracle) or a result set (MS SQL Server or Sybase).

Example 5. An arbitrary PL/SQL block may have input or/and output parameters that may be either scalars or vectors.

Industrial strength database servers have bulk (or array) operations:

  • bulk INSERT
  • bulk UPDATE
  • bulk DELETE
  • bulk SELECT

Therefore, parameters in INSERT/UPDATE/DELETE statement may be vectors if the statement is performed in bulk.

The picture is clear: any interaction with SQL or its procedural extension can be treated as a black box with input and/or output. It does not matter what the black box does inside (according to the definition of a black box). What matters is the input wires that send signals into the box and the output wires that receive signals from the box:

Some of the wires may be both input and output.

Why not combine the concept of data streams and SQL? Instead of multiplying constructs and making database API's too convoluted, why not unify and simplify them? The OTL gives an answer to those questions and the answer is the otl_stream class.

Since a SQL statement may be done in bulk, the otl_stream is a buffered stream. Conceptually, the otl_stream has two separate buffers: input and output. The input buffer is comprised of all input variables put together. Respectively, the output buffer is comprised of all output variables put together.

C++ streams are usually manipulated via operator >> and operator <<. The stream reference is on the left of the operator symbol:

   s>>variable;
s<<variable;

The double arrow shows the direction in which data goes:

  • >> -- from the stream into the data container (variable)
  • << -- from the data container (variable) into the stream

OTL streams are similar to buffered C++ streams . A SQL statement or stored procedure call is opened as an ordinary buffered stream. The logic of the OTL stream operations remains the same as the C++ stream operations with the only exception -- the OTL stream has separate input and output buffers which may overlap.

The OTL stream has a flush function for flushing its input buffer when the buffer gets full and a collection of >> and << operators for reading and writing objects of different data types. The most important advantage of the OTL streams is their unified interface to SQL statements and stored procedure call of any kind. This means that the application developer needs to remember just a few syntactical constructs and function names which he already got familiar with when he started working with C++ streams.

Inside the OTL stream there is a small parser for parsing declarations of bind variables and their data types. There is no need to declare C/C++ host variables and bind them with placeholders by special bind function calls. All necessary buffers are created dynamically inside the stream. The stream just needs to be opened for reading and writing values.

The OTL stream interface requires use of the OTL exceptions. This means that potentially any OTL stream operation can throw an exception of the otl_exception type. In order to intercept the exception and prevent the program from aborting, wrap up the OTL stream code with the corresponding try & catch block.

The functioning of the otl_stream is pretty much automatic: when all of the input variables of the stream are defined (in other words, the input buffer is filled out), it triggers the block box inside the stream to execute. The output buffer gets filled out in the process of the execution of the black box. After the execution is finished, the output values can be read from the stream. If it is a SELECT statement and it returns more rows than the output buffer can hold, after the whole output buffer is read, then the stream automatically fetches the next bacth of rows into the output buffer.

Feedback

# re: OTL 4.0, OTL concept  回復  更多評論   

2008-08-06 14:20 by harvey
This example demonstrates a stored procedure call.

Source Code
#include <iostream>using namespace std;#include <stdio.h>#define OTL_ODBC_MSSQL_2005 // Compile OTL 4/ODBC, MS SQL 2005//#define OTL_ODBC // Compile OTL 4/ODBC. Uncomment this when used with MS SQL 7.0/ 2000#include <otlv4.h>otl_connect db; // connect objectvoid stored_proc(void)// invoking stored procedure{ otl_stream o(1, // buffer size should be equal to 1 in case of stored procedure call "{call my_proc(" " :A<int,inout>, " " :B<char[31],out>, " " :C<char[31],in> " ")}", // stored procedure call db // connect object ); o.set_commit(0); // set stream auto-commit off since // the stream does not generate transaction o<<1<<"Test String1"; // assigning :1 = 1, :3 = "Test String1" int a; char b[31]; o>>a>>b; cout<<"A="<<a<<", B="<<b<<endl;}int main(){ otl_connect::otl_initialize(); // initialize ODBC environment try{ db.rlogon("uid=scott;pwd=tiger;dsn=mssql"); // connect to ODBC otl_cursor::direct_exec (db, "CREATE PROCEDURE my_proc " " @A int out, " " @B varchar(60) out, " " @C varchar(60) " "AS " "BEGIN " " SELECT @A=@A+1" " SELECT @B=@C " "END" ); // create stored procedure stored_proc(); // invoking stored procedure } catch(otl_exception& p){ // intercept OTL exceptions cerr<<p.msg<<endl; // print out error message cerr<<p.code<<endl; // print out error code cerr<<p.var_info<<endl; // print out the variable that caused the error cerr<<p.sqlstate<<endl; // print out SQLSTATE message cerr<<p.stm_text<<endl; // print out SQL that caused the error } db.logoff(); // disconnect from the data source return 0;}
Output
A=2, B=Test String1

# re: OTL 4.0, OTL concept  回復  更多評論   

2008-08-06 14:25 by harvey
忘了對以上例子的說明了。

以上是OTL中調用存儲過程,得到出參的例子,OTL說明書里是有的,但我也找了很久才找到的。網址是 http://otl.sourceforge.net/otl3_ex24.htm

需要注意以下
otl_stream o(1, stored procedure call
"{call my_proc("
       " :A<int,inout>, " //
       " :B<char[31],out>, " //
        " :C<char[31],in> " //char[31], 和in之間不能有空格
       ")}",
       db);

# re: OTL 4.0, OTL concept  回復  更多評論   

2008-08-06 14:28 by harvey
這個是OTL調sql, ODBC的,注意是
#define OTL_ODBC

而不是ORACLE的例子

因為otl + oracle的例子網上非常多,
而otl + sqlServer的例子網上很少,

在這希望能起到拋磚引玉的作用。

# re: OTL 4.0, OTL concept  回復  更多評論   

2008-10-14 19:18 by xiao_xiao
我在用到otl_stream時候,我是在流里不斷的輸入,但是如果其中的一條語句錯誤,異常了,他是否會把緩存里面的所有清空刷新呢? 我懷疑這樣我入庫的時候,會少數據呢? 聯系我 165621600

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            狠狠干综合网| 一区二区三区免费在线观看| 亚洲特级片在线| 欧美极品影院| 欧美一区二区三区四区高清 | 亚洲精品你懂的| 欧美a级片网| 一区二区三区精品在线| 久久国产黑丝| 亚洲精品日韩综合观看成人91| 激情丁香综合| 欧美日在线观看| 久久久国产精品亚洲一区| 亚洲人成久久| 欧美日韩你懂的| 亚洲综合三区| 亚洲精品一区中文| 欧美+日本+国产+在线a∨观看| 亚洲一区二三| 最新中文字幕一区二区三区| 国产欧美精品久久| 欧美日本不卡视频| 欧美freesex交免费视频| 欧美另类视频| 国产欧美日韩不卡免费| 亚洲国产1区| 狠狠88综合久久久久综合网| 亚洲福利视频专区| 欧美一二区视频| 亚洲欧美日韩精品| 亚洲一区二区久久| 99av国产精品欲麻豆| 亚洲区欧美区| 亚洲主播在线观看| 久久亚洲精选| 美女露胸一区二区三区| 久久久精品性| 香港成人在线视频| 欧美电影打屁股sp| 亚洲狠狠婷婷| 欧美一区二区三区免费观看| 中文在线不卡视频| 欧美成人日本| 欧美在线视频一区二区| 欧美一级片一区| 欧美经典一区二区三区| 伊人久久大香线| 亚洲高清不卡| 欧美一级大片在线免费观看| 亚洲激情在线激情| 亚洲一区二区成人在线观看| 亚洲一区尤物| 欧美日精品一区视频| 在线播放国产一区中文字幕剧情欧美| aa日韩免费精品视频一| 亚洲淫片在线视频| 亚洲精品欧美在线| 欧美激情网站在线观看| 国产精品久久久久久久久久直播 | 久久在线免费| 午夜欧美大片免费观看| 亚欧成人精品| 欧美日本高清一区| 99国产精品一区| 亚洲国产一区视频| 久久综合狠狠综合久久激情| 欧美日本一区二区三区| 亚洲精品乱码久久久久久蜜桃91 | 国产精品视频一二| 国产亚洲精久久久久久| 激情综合在线| 欧美福利在线| 欧美电影美腿模特1979在线看| 国产精品二区在线| 在线看片日韩| 亚洲一区精彩视频| 亚洲欧美国产不卡| 国产日韩精品一区二区三区| 国产亚洲一级| 久久久久久欧美| 亚洲精品偷拍| 欧美色图五月天| 亚洲欧美日韩一区在线| 亚洲丝袜av一区| 欧美激情一二区| 亚洲日本久久| 亚洲在线黄色| 国产自产精品| 中文在线不卡| 午夜日韩电影| 加勒比av一区二区| 欧美sm重口味系列视频在线观看| 六月丁香综合| 国产视频在线观看一区二区三区 | 国内成+人亚洲+欧美+综合在线| 久久亚洲色图| 欧美日韩国产高清视频| 亚洲精品国产日韩| 99精品欧美| 欧美激情国产精品| 在线观看视频日韩| 免费国产一区二区| 欧美性色aⅴ视频一区日韩精品| 国产欧美亚洲视频| 亚洲第一精品在线| 亚洲自拍偷拍视频| 午夜精品999| 每日更新成人在线视频| 欧美成黄导航| 欧美日韩国产一区二区| 久久精品国产精品亚洲| 亚洲乱码国产乱码精品精98午夜| 欧美午夜性色大片在线观看| 久久精品成人| 欧美片在线播放| 久久国产成人| 欧美日韩精品高清| 亚洲国产精品va在线看黑人动漫| 国产精品r级在线| 亚洲韩国青草视频| 亚洲第一精品在线| 欧美一区二区三区在线| 午夜亚洲影视| 欧美日韩一区在线观看| 欧美国产日韩一区二区| 亚洲在线中文字幕| av成人毛片| 欧美freesex8一10精品| 久久综合狠狠综合久久综合88| 国产精品一区二区三区四区五区 | 亚洲第一色中文字幕| 欧美影院在线| 欧美一区久久| 国产精品入口| 亚洲欧美韩国| 久久国产免费| 国产综合网站| 欧美在线视频观看免费网站| 欧美自拍偷拍| 国产欧美精品在线播放| 亚洲欧美日韩国产中文| 欧美一区二区日韩| 国产精品久久久久秋霞鲁丝| 亚洲网站视频福利| 欧美亚洲一区二区在线| 国产农村妇女精品一区二区| 亚洲欧美第一页| 久久久亚洲高清| 亚洲国产精品福利| 欧美激情一区| 亚洲视频图片小说| 一区二区视频欧美| 久久久亚洲国产天美传媒修理工| 99这里只有久久精品视频| 欧美片在线播放| 亚洲综合成人婷婷小说| 久久欧美肥婆一二区| 亚洲二区在线| 欧美日韩精品欧美日韩精品| 亚洲天堂av电影| 久久男人资源视频| 一区二区电影免费在线观看| 国产精品高潮呻吟| 久久久777| 亚洲人午夜精品| 在线亚洲一区| 国模私拍一区二区三区| 老司机午夜精品| 亚洲午夜免费福利视频| 免费在线看一区| 亚洲欧美视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 午夜亚洲精品| 免费观看久久久4p| 亚洲午夜电影网| 国产揄拍国内精品对白| 欧美成人免费在线视频| 亚洲欧美三级在线| 亚洲国产日本| 久久精品日产第一区二区| 亚洲精品专区| 欧美大片免费久久精品三p| 日韩一级精品| 一本色道**综合亚洲精品蜜桃冫| 国产精品色在线| 欧美 日韩 国产精品免费观看| 亚洲一区免费视频| 亚洲人体偷拍| 免费高清在线视频一区·| 亚洲欧美日韩视频一区| 91久久线看在观草草青青| 国产日韩精品久久久| 欧美日韩亚洲三区| 免费在线观看一区二区| 羞羞视频在线观看欧美| 中文精品视频| 99re6这里只有精品视频在线观看| 欧美www在线| 久久婷婷人人澡人人喊人人爽| 亚洲一区日本|