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

寶杉的博客

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)用存儲(chǔ)過程,得到出參的例子,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í)候,我是在流里不斷的輸入,但是如果其中的一條語句錯(cuò)誤,異常了,他是否會(huì)把緩存里面的所有清空刷新呢? 我懷疑這樣我入庫的時(shí)候,會(huì)少數(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 | 在线观看欧美成人| 激情欧美国产欧美| 亚洲欧洲精品一区二区三区 | 亚洲二区视频在线| 欧美成人精品一区二区| 欧美国产日韩在线| 日韩西西人体444www| 一区二区三区欧美在线观看| 亚洲欧美日韩中文播放| 久久五月天婷婷| 欧美久久久久久久久久| 国产精品久久久久久户外露出| 国产亚洲一区二区精品| 亚洲国产另类精品专区| 亚洲一区二区三区激情| 久久久久久久久久久久久女国产乱| 欧美成人xxx| 亚洲香蕉网站| 久久久久这里只有精品| 欧美日韩一区二区三区在线视频| 国产精品色网| 亚洲精品看片| 久久久亚洲综合| 亚洲精品一区在线观看香蕉| 欧美一级日韩一级| 欧美日本高清| 狠久久av成人天堂| 亚洲一区免费| 亚洲国产欧美另类丝袜| 欧美一区深夜视频| 欧美日韩一卡| 最新亚洲视频| 久久夜色精品国产欧美乱| 最新亚洲激情| 麻豆av福利av久久av| 国产精品一区在线观看| 在线一区二区三区四区| 欧美黄色一区| 久久久最新网址| 国产日韩在线播放| 亚洲尤物视频在线| 亚洲第一级黄色片| 久久久久欧美| 狠狠色丁香久久婷婷综合_中| 亚洲欧美在线免费观看| 一区二区三区波多野结衣在线观看| 欧美成人高清视频| 欧美片在线观看| 国产欧美大片| 一区二区三区欧美在线| 欧美国产精品人人做人人爱| 欧美亚洲三区| 国产午夜久久久久| 久久国产日韩| 性高湖久久久久久久久| 国产精品无人区| 午夜精品久久久| 亚洲一区二区三区影院| 国产精品精品视频| 亚洲欧美激情一区二区| 一区二区三区**美女毛片| 欧美日韩一级片在线观看| 日韩视频免费在线观看| 亚洲精品专区| 国产精品久久二区| 亚洲小视频在线| 午夜精品亚洲| 在线观看亚洲视频| 欧美黄色片免费观看| 欧美激情精品久久久久久蜜臀 | 妖精成人www高清在线观看| 亚洲日本激情| 国产精品成人一区二区三区夜夜夜| 一个色综合导航| 亚洲一二三四久久| 国内精品久久久久影院薰衣草| 久久久久一区二区三区| 久久三级视频| 夜夜嗨av一区二区三区免费区| 亚洲国产成人久久| 国产精品国产馆在线真实露脸| 久久av在线看| 欧美成人高清视频| 亚洲一区制服诱惑| 久久精品91久久香蕉加勒比| 亚洲欧洲一区二区在线观看| 日韩午夜精品视频| 国产在线不卡| 日韩视频永久免费| 国产一区二区三区久久久| 91久久久亚洲精品| 国产欧美一区二区精品秋霞影院| 美女国产一区| 国产精品久久久久aaaa樱花| 免费看的黄色欧美网站| 国产精品久久国产三级国电话系列| 久久久久久久网| 国产精品v日韩精品v欧美精品网站| 欧美中文字幕视频| 欧美久久久久久久| 免费日韩视频| 国产精品一级久久久| 亚洲国产日韩欧美在线图片| 国产欧美一区二区三区久久| 亚洲精品国偷自产在线99热| 国产综合色一区二区三区| 日韩亚洲欧美精品| 91久久国产综合久久蜜月精品| 亚洲一区二区网站| 欧美成人综合在线| 亚洲裸体俱乐部裸体舞表演av| 国产麻豆午夜三级精品| 欧美激情精品久久久久久黑人| 国产精品毛片a∨一区二区三区| 欧美1区免费| 国产日韩欧美在线一区| 99国产精品视频免费观看| 亚洲福利国产| 久久精品一区二区三区不卡| 午夜精品久久久久久久99水蜜桃| 另类av导航| 看片网站欧美日韩| 国产午夜精品视频| 一区二区三区国产盗摄| 一个色综合av| 欧美日韩在线视频一区二区| 亚洲国产99| 亚洲国产电影| 麻豆精品视频在线| 久久一区二区三区国产精品| 国产精品视频久久久| 亚洲性人人天天夜夜摸| 亚洲一区国产精品| 欧美视频在线免费看| 99国产精品99久久久久久| 99re6这里只有精品| 欧美区高清在线| 亚洲毛片在线观看.| 亚洲美女视频| 欧美日韩激情网| 夜夜精品视频一区二区| 99国产精品99久久久久久粉嫩 | 国产精品成人v| 99精品视频免费观看| 亚洲一区二区三区欧美| 国产精品美女在线观看| 亚洲一区二区欧美| 久久精品一二三| 18成人免费观看视频| 久久先锋影音| 亚洲经典在线看| 亚洲一区二区在线免费观看| 国产精品久久久一区麻豆最新章节 | 欧美日本在线看| 亚洲福利国产| 亚洲免费伊人电影在线观看av| 国产精品视频1区| 久久久久久夜| 亚洲国内精品在线| 亚洲欧美精品suv| 国外成人网址| 欧美日韩国产一区| 性欧美8khd高清极品| 欧美a一区二区| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲自拍另类| 国产午夜精品久久久久久免费视 | 欧美成人精品1314www| 亚洲国产精品久久久久秋霞影院| 蜜乳av另类精品一区二区| 亚洲国产日韩欧美在线动漫| 亚洲一级片在线观看| 国产一区二区福利| 欧美日本一区二区高清播放视频| 亚洲一区二区三区精品视频| 久久亚洲精品网站| 一本色道婷婷久久欧美| 国产一区二区精品丝袜| 欧美精品自拍偷拍动漫精品| 午夜精品影院| 亚洲激情综合| 久久久国产精品一区二区三区| 亚洲人成人77777线观看| 国产精品超碰97尤物18| 女主播福利一区| 午夜日韩福利| 99v久久综合狠狠综合久久| 裸体素人女欧美日韩| 亚洲欧美伊人| 中国女人久久久| 亚洲精品四区| 亚洲高清激情| 伊人久久成人| 韩国美女久久| 国产一区二区三区无遮挡|