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

寶杉的博客

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  回復(fù)  更多評論   

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  回復(fù)  更多評論   

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

以上是OTL中調(diào)用存儲過程,得到出參的例子,OTL說明書里是有的,但我也找了很久才找到的。網(wǎng)址是 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  回復(fù)  更多評論   

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

而不是ORACLE的例子

因為otl + oracle的例子網(wǎng)上非常多,
而otl + sqlServer的例子網(wǎng)上很少,

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

# re: OTL 4.0, OTL concept  回復(fù)  更多評論   

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

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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ⅴ国产紧身牛仔裤| 日韩一级网站| 亚洲一品av免费观看| 亚洲精品久久久蜜桃| 亚洲国产一区在线观看| 一区视频在线播放| 亚洲国产91精品在线观看| 国产午夜精品理论片a级大结局| 欧美日韩在线一二三| 欧美性做爰毛片| 欧美亚韩一区| 国产精品欧美风情| 很黄很黄激情成人| 一区二区三区亚洲| 欧美一区二粉嫩精品国产一线天| 欧美激情视频在线免费观看 欧美视频免费一| av成人天堂| 欧美在线亚洲一区| 欧美日韩国产bt| 亚洲精品久久久久| 久久综合国产精品台湾中文娱乐网| 国产精品久久网站| 欧美日韩亚洲一区在线观看| 欧美国产精品劲爆| 欧美日韩在线观看一区二区| 国产日韩欧美一区二区三区在线观看| 韩国成人福利片在线播放| 亚洲精品国产品国语在线app| 亚洲一区二区免费视频| 欧美国产高清| 亚洲国产精品福利| 久久免费视频观看| 亚洲一区尤物| 国产精品成人在线观看| 亚洲激情国产| 老牛影视一区二区三区| 亚洲欧美日韩一区二区三区在线 | 在线亚洲欧美专区二区| 欧美www在线| 久久精品视频播放| 国产综合香蕉五月婷在线| 欧美在线视频一区二区三区| 亚洲美女在线观看| 欧美日韩另类视频| 亚洲性图久久| 亚洲一区二区少妇| 红桃视频一区| 亚洲国产精品久久久久秋霞不卡| 在线视频中文亚洲| 国产亚洲精品bv在线观看| 蘑菇福利视频一区播放| 欧美日韩八区| 久热精品视频在线观看| 欧美大胆a视频| 一本色道久久综合| 欧美综合国产| 亚洲激情成人| 亚洲欧美激情视频在线观看一区二区三区 | 99视频精品全国免费| 欧美日韩在线影院| 久久综合精品一区| 亚洲国产日韩欧美一区二区三区| 欧美国产欧美综合| 久久精品亚洲热| 欧美极品欧美精品欧美视频| 亚洲综合色网站| 牛牛影视久久网| 欧美一区二区三区在线观看| 欧美一区二区三区电影在线观看| 国产日韩欧美在线播放| 最新国产成人在线观看| 亚洲激情影院| 欧美日韩国语| 午夜日韩在线| 免费美女久久99| a4yy欧美一区二区三区| 欧美在线观看天堂一区二区三区| 91久久精品美女高潮| 亚洲视频在线一区观看| 黄色成人av网| 一本高清dvd不卡在线观看| 激情婷婷久久| 欧美在线观看一区二区三区| 亚洲免费激情| 欧美激情在线观看| 国产精品视频福利| 亚洲免费成人| 一区二区三区高清在线| 欧美大片免费观看在线观看网站推荐| 久久夜色精品国产欧美乱极品| 国产亚洲网站| 久久久久久久尹人综合网亚洲| 久久综合图片| 亚洲精品色婷婷福利天堂| 午夜国产一区| 另类av一区二区| 亚洲激情视频| 国产精品成人久久久久| 欧美亚洲网站| 亚洲高清自拍| 欧美理论在线| 亚洲激情在线| 亚洲欧美一区在线| 国产精品久久毛片a| 久久久精品欧美丰满| 亚洲国产精品成人综合色在线婷婷| 91久久夜色精品国产九色| 久热精品视频| 亚洲欧美日韩第一区 | 99视频一区二区三区| 欧美色123| 欧美精品久久99| 亚洲专区一二三| 亚洲精品裸体| 欧美激情一区二区三级高清视频| 欧美一区二区高清在线观看| 激情小说亚洲一区| 欧美性做爰毛片| 国产精品久久久免费| 欧美福利专区| 欧美了一区在线观看| 猛干欧美女孩| 欧美精品啪啪| 国产精品观看| 国产欧美日韩视频| 国产性做久久久久久| 国内精品视频一区| 国产一区二区看久久| 国产区在线观看成人精品| 欧美视频中文字幕在线| 国产精品久久久久久久久久免费 | 午夜欧美视频| 久久综合九色九九| 欧美电影免费观看高清完整版| 久久久蜜桃精品| 欧美一区二区三区成人| 欧美与黑人午夜性猛交久久久| 亚洲欧美日韩国产另类专区| 亚洲制服丝袜在线| 亚洲欧美在线aaa| 久久se精品一区二区| 久久精品国产亚洲aⅴ| 欧美成人午夜| 亚洲欧洲偷拍精品| 性色av一区二区三区在线观看| 久久亚洲综合色一区二区三区| 久久精品在线| 国产亚洲欧美色| 日韩一级在线| 欧美国产日韩精品免费观看| 99视频精品全国免费| 欧美一区二区日韩一区二区| 免费观看久久久4p| 国产精品久久国产精品99gif| 黄页网站一区| 欧美在线地址| 性欧美xxxx视频在线观看| 欧美日本一区二区三区| 亚洲高清免费在线| 久久亚洲免费| 久久久久久久久蜜桃| 国产综合久久| 欧美伊人久久久久久午夜久久久久| 亚洲日本aⅴ片在线观看香蕉| 久久久夜精品| 最新国产成人av网站网址麻豆 | 国产精品推荐精品| 午夜精品福利一区二区蜜股av| 亚洲国产成人久久| 欧美日本不卡| 亚洲日本成人| 99在线精品视频在线观看| 欧美日韩国产123区| 欧美v亚洲v综合ⅴ国产v| 在线观看视频免费一区二区三区| 久久精品国产第一区二区三区最新章节| 亚洲欧洲日本mm| 国产精品日本精品| 免费影视亚洲| 欧美国内亚洲| 亚洲一区亚洲| 麻豆成人在线播放| 亚洲综合精品| 久久精品麻豆| 亚洲宅男天堂在线观看无病毒| 午夜精品福利在线| 亚洲国产精品第一区二区| 99riav1国产精品视频| 狠狠做深爱婷婷久久综合一区| 欧美激情视频一区二区三区在线播放| 欧美国产一区二区在线观看| 亚洲欧美日韩第一区| 久久久久久网| 欧美一级网站| 欧美高清在线一区二区| 久久精品30| 国产精品电影在线观看| 亚洲高清123| 国内成人在线|