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

寶杉的博客

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>
            国产精品视频观看| 久久久亚洲午夜电影| 久久久91精品国产一区二区精品| 国产精品精品视频| 老司机精品福利视频| 亚洲精品一区二区网址| 亚洲欧美精品中文字幕在线| 麻豆国产va免费精品高清在线| 亚洲日韩第九十九页| 亚洲经典三级| 蜜桃精品久久久久久久免费影院| 亚洲免费av电影| 亚洲在线观看免费视频| 中文精品视频| 久久久精品动漫| 99精品国产热久久91蜜凸| 另类图片国产| 在线播放中文一区| 久久影院午夜片一区| 午夜精品短视频| 国产精品视频xxxx| 午夜久久资源| 亚洲欧美国产三级| 国产欧美日韩精品一区| 欧美亚洲综合久久| 午夜亚洲影视| 国内精品伊人久久久久av影院| 欧美一区二区高清在线观看| 夜色激情一区二区| 国产精品久久久久久久久动漫| 一本久久青青| 一区二区电影免费观看| 欧美午夜激情视频| 欧美一区二区三区免费看 | 亚洲乱码久久| 欧美日韩卡一卡二| 亚洲在线观看视频| 香蕉av福利精品导航| 黄色av日韩| 欧美激情亚洲| 欧美日韩播放| 欧美在线免费视频| 久久久久免费| 亚洲人成网站色ww在线| 亚洲美女免费视频| 国产亚洲成人一区| 欧美激情视频一区二区三区免费| 欧美日韩精品| 久久久福利视频| 欧美国产日韩a欧美在线观看| 国产精品99久久久久久久vr | 欧美激情一区二区三级高清视频 | 亚洲日本一区二区三区| 日韩亚洲国产欧美| 日韩亚洲综合在线| 欧美99在线视频观看| 免费影视亚洲| 亚洲女人天堂成人av在线| 欧美在线高清| 99精品视频免费全部在线| 亚洲在线日韩| 亚洲精品国产日韩| 欧美亚洲网站| 亚洲视频碰碰| 久久先锋资源| 午夜一区二区三区不卡视频| 久久网站热最新地址| 亚洲综合精品自拍| 欧美jjzz| 久久亚洲一区二区三区四区| 欧美久久久久中文字幕| 久久久久91| 欧美天堂亚洲电影院在线观看 | 久久精品一区四区| 欧美日韩精品一区视频 | 亚洲综合国产精品| 亚洲免费观看| 久久精品视频在线播放| 亚洲欧美日韩在线| 亚洲少妇最新在线视频| 久久九九热re6这里有精品| 亚洲手机在线| 欧美激情bt| 免费的成人av| 国产日韩精品在线播放| 一本色道久久综合亚洲精品不卡| 国模精品一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在 | 中国女人久久久| 免费欧美日韩| 欧美成人亚洲| 伊伊综合在线| 欧美亚洲专区| 欧美一区二区三区四区在线观看| 欧美剧在线免费观看网站| 免费不卡中文字幕视频| 国产亚洲精品久久久久婷婷瑜伽 | 亚洲欧洲在线观看| 性久久久久久| 欧美一区二区性| 国产精品影片在线观看| 一区二区欧美视频| 亚洲桃色在线一区| 欧美日韩精品在线播放| 亚洲免费成人av| 中日韩高清电影网| 欧美午夜精品久久久| 99这里只有久久精品视频| 久久婷婷久久一区二区三区| 91久久国产综合久久| 国产乱码精品一区二区三区av| 99re热这里只有精品免费视频| 亚洲国产天堂网精品网站| 欧美在线视频免费| 久久一二三四| 1024亚洲| 欧美电影打屁股sp| 最新亚洲视频| 亚洲综合精品自拍| 国产日韩欧美a| 久久久久一区二区三区四区| 欧美wwwwww| 99这里有精品| 国产精品乱码久久久久久| 亚洲欧美国产高清va在线播| 久久蜜桃资源一区二区老牛| 影音先锋一区| 欧美精品二区| 亚洲第一黄色网| 亚洲美女电影在线| 欧美日韩一区二区三区免费看| 亚洲天堂视频在线观看| 久久久精品日韩欧美| 亚洲欧洲日夜超级视频| 欧美日韩三级| 欧美在线网址| 亚洲精品婷婷| 久久视频一区| 一区二区三区高清在线观看| 国产精品日韩二区| 久久夜色撩人精品| 一区二区黄色| 久久一区二区精品| 男人插女人欧美| 欧美在线网站| 一区二区三区欧美在线观看| 久久亚洲精品一区| 久久国产手机看片| 亚洲性感美女99在线| 欧美激情精品久久久久久| 欧美一区二区三区成人| 一本久久综合亚洲鲁鲁| 亚洲成色www8888| 国产一区二区三区四区五区美女| 欧美日韩a区| 欧美精品v日韩精品v韩国精品v | 久久久久五月天| 亚洲一级片在线看| 亚洲精品在线免费| 欧美va天堂| 久久久一区二区| 午夜精品久久久久久久蜜桃app | 久久成人一区| 亚洲一级特黄| 夜夜嗨av一区二区三区中文字幕 | 国产精品亚洲激情| 久久精品一二三区| aa级大片欧美| 国内外成人免费激情在线视频| 国产精品久久久久久福利一牛影视| 久久久久亚洲综合| 中文久久精品| 性欧美video另类hd性玩具| 欧美中文字幕| 午夜精品久久久久久久蜜桃app| 亚洲嫩草精品久久| 国产欧美一区在线| 国产日韩精品在线观看| 久久深夜福利| 亚洲视屏一区| 亚洲小说欧美另类社区| 国产日产欧美一区| 久久影院亚洲| 欧美成人乱码一区二区三区| 日韩亚洲欧美成人| 久久国产视频网| 久久理论片午夜琪琪电影网| 亚洲大黄网站| 亚洲视频电影图片偷拍一区| 欧美一区二区在线观看| 久久久99国产精品免费| 日韩午夜中文字幕| 久久久久国产精品人| 亚洲欧美中文在线视频| 国产主播在线一区| 欧美亚洲在线播放| 久久亚洲国产精品一区二区 | 中文在线一区| 久久一区二区三区av| 日韩午夜中文字幕|