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

寶杉的博客

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 寶杉 閱讀(2588) 評論(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
這個(gè)是OTL調(diào)sql, ODBC的,注意是
#define OTL_ODBC

而不是ORACLE的例子

因?yàn)閛tl + 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í)候,我是在流里不斷的輸入,但是如果其中的一條語句錯誤,異常了,他是否會把緩存里面的所有清空刷新呢? 我懷疑這樣我入庫的時(shí)候,會少數(shù)據(jù)呢? 聯(lián)系我 165621600
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久色中文字幕| 亚洲国产精品电影在线观看| 亚洲永久精品大片| 亚洲视频久久| 久久久国产成人精品| 中文网丁香综合网| 一区二区三区视频在线看| 夜夜嗨av一区二区三区网站四季av| 亚洲精选一区二区| 亚洲综合国产| 老鸭窝亚洲一区二区三区| 久久久av毛片精品| 欧美日韩999| 国产精品视频免费在线观看| 国内精品久久久久影院色| 在线播放国产一区中文字幕剧情欧美| 亚洲人成在线观看一区二区 | 一色屋精品视频免费看| 亚洲国产日韩欧美一区二区三区| 99视频一区| 久久九九精品| 亚洲国产综合视频在线观看| 亚洲国产另类 国产精品国产免费| 一区二区日韩免费看| 久久久久成人精品免费播放动漫| 欧美精品一区在线发布| 国产日韩一区二区三区| 亚洲高清在线| 久久国产精品久久久久久| 欧美大片国产精品| 制服诱惑一区二区| 欧美韩国在线| 一区二区三区在线观看欧美| 一区二区三区欧美在线观看| 美女任你摸久久| 亚洲综合首页| 欧美午夜视频在线观看| 91久久精品国产91性色| 久久亚洲精品一区二区| 99视频精品| 欧美国产专区| 91久久精品一区二区三区| 免费在线观看精品| 国产喷白浆一区二区三区| 亚洲一区二区三区四区中文| 农夫在线精品视频免费观看| 久久成人综合网| 国产伦精品一区| 欧美亚洲色图校园春色| 一本久久青青| 欧美色图一区二区三区| 一本高清dvd不卡在线观看| 免费的成人av| 开心色5月久久精品| 狠狠色丁香婷婷综合久久片| 亚洲欧美三级伦理| 亚洲网站视频福利| 国产精品手机视频| 亚洲欧美三级伦理| 一本色道久久精品| 欧美三级午夜理伦三级中视频| 亚洲一区二区三区午夜| 亚洲综合国产| 制服丝袜激情欧洲亚洲| 国产精品久久久久高潮| 亚洲视频在线二区| 在线亚洲一区二区| 欧美图区在线视频| 午夜精品久久久久久久99热浪潮| 亚洲综合色自拍一区| 国产视频在线观看一区 | 久久久久九九九九| 欧美在线观看天堂一区二区三区| 国产午夜亚洲精品不卡| 玖玖国产精品视频| 免费久久99精品国产| 91久久线看在观草草青青| 亚洲国产精品传媒在线观看| 欧美激情亚洲激情| 亚洲午夜羞羞片| 午夜日韩视频| 激情久久五月天| 亚洲大胆女人| 欧美性猛片xxxx免费看久爱| 久久精品国产v日韩v亚洲| 久久久久久久久久看片| 91久久精品一区二区三区| 亚洲精品久久7777| 国产精品理论片在线观看| 久久综合九色综合欧美狠狠| 暖暖成人免费视频| 午夜精品999| 麻豆av一区二区三区| 这里只有精品丝袜| 久久精品国产77777蜜臀| 亚洲看片免费| 亚洲欧美国产三级| 亚洲三级免费电影| 亚洲免费视频在线观看| 亚洲片在线观看| 亚洲免费人成在线视频观看| 亚洲黄一区二区三区| 亚洲综合成人婷婷小说| 在线看片日韩| 亚洲综合好骚| 一区二区三区国产在线观看| 久久精品国产精品亚洲| 亚洲视频在线观看三级| 久久久久国产精品一区| 欧美亚洲尤物久久| 欧美精品色一区二区三区| 久久久久久9| 国产精品免费一区二区三区在线观看| 蜜桃av一区二区三区| 国产麻豆精品视频| 在线视频日本亚洲性| 亚洲精品美女久久久久| 久久精品亚洲热| 欧美在线电影| 国产精品高潮呻吟久久| 亚洲精品乱码久久久久| 亚洲精品黄网在线观看| 久久一区二区三区四区五区| 亚洲高清在线视频| 久久亚洲色图| 国产老肥熟一区二区三区| 一本久久a久久精品亚洲| 亚洲乱码视频| 欧美国产精品v| 亚洲高清不卡一区| 亚洲福利在线观看| 久久视频精品在线| 男人的天堂成人在线| 一区二区自拍| 久久一区激情| 欧美黄色大片网站| 亚洲福利国产| 欧美1区免费| 欧美激情片在线观看| 亚洲第一二三四五区| 久久久www| 免费观看成人网| 在线观看91精品国产麻豆| 久久免费高清| 欧美激情中文字幕在线| 亚洲巨乳在线| 欧美日韩一区二区三区在线 | 久久精品理论片| 久久一区二区三区国产精品 | 亚洲欧美国产高清va在线播| 久久国内精品自在自线400部| 国产欧美不卡| 久久精品国产一区二区三| 久久乐国产精品| 亚洲成色精品| 欧美精品激情在线观看| 99re视频这里只有精品| 亚洲欧美中文另类| 国内精品伊人久久久久av影院| 久久成人一区二区| 亚洲国产精品ⅴa在线观看| 亚洲视屏一区| 国产专区欧美精品| 蜜臀久久99精品久久久画质超高清 | 欧美成人综合在线| 99re66热这里只有精品3直播| 国产精品久久久久毛片软件 | 国产精品久久久久永久免费观看| 激情av一区| 欧美日韩国产在线播放网站| 午夜精品久久久| 91久久综合| 久久久精品日韩| 99re在线精品| 狠狠色综合网站久久久久久久| 女同一区二区| 亚洲欧美另类在线观看| 欧美夫妇交换俱乐部在线观看| 亚洲欧美日韩精品在线| 在线观看视频一区| 国产精品毛片高清在线完整版| 老司机免费视频久久| 久久亚洲影音av资源网| 亚洲午夜电影网| 伊人一区二区三区久久精品| 欧美韩国日本一区| 欧美一区二区三区久久精品茉莉花| 欧美第一黄色网| 午夜精品视频在线观看一区二区| 亚洲成人在线| 国产麻豆日韩| 欧美日韩国内| 毛片基地黄久久久久久天堂| 小辣椒精品导航| 宅男噜噜噜66国产日韩在线观看| 亚洲丁香婷深爱综合| 久久精品二区三区| 亚洲在线中文字幕| 一本大道av伊人久久综合| 亚洲二区免费|