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

寶杉的博客

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成人在线| 国产精品xvideos88| 日韩午夜一区| 欧美黑人一区二区三区| 欧美在线网站| 亚洲午夜在线视频| 国产伦精品一区二区三区| 国产日韩精品入口| 国产视频精品xxxx| 国产日韩欧美高清| 激情久久久久久久| 欧美精品三级日韩久久| 欧美成人精品h版在线观看| 欧美成人按摩| 日韩图片一区| 午夜亚洲视频| 欧美激情精品久久久久久久变态 | 亚洲人成网站999久久久综合| 亚洲理伦电影| 久久精品视频导航| 亚洲美女啪啪| 久久久国产精品亚洲一区 | 麻豆成人在线| 国产精品草草| 亚洲国产福利在线| 午夜精品久久久久久久99樱桃| 老司机午夜免费精品视频| 亚洲精品中文字幕在线观看| 久久动漫亚洲| 国产精品成人va在线观看| 在线电影欧美日韩一区二区私密| 亚洲一区二区高清| 欧美大成色www永久网站婷| 亚洲小说欧美另类社区| 欧美国产一区二区| 精品动漫3d一区二区三区免费 | 在线精品亚洲一区二区| 午夜影视日本亚洲欧洲精品| 亚洲精品乱码久久久久久蜜桃91| 性欧美1819性猛交| 欧美三区免费完整视频在线观看| 亚洲国产欧美日韩精品| 久久久久免费观看| 亚洲欧美激情诱惑| 国产精品xnxxcom| 一区二区三区四区五区精品视频| 免费在线观看一区二区| 午夜视频一区在线观看| 欧美日韩一区三区| 久久视频国产精品免费视频在线| 嫩草国产精品入口| 尤物99国产成人精品视频| 欧美一级淫片播放口| 亚洲最快最全在线视频| 欧美连裤袜在线视频| 亚洲人成网站在线播| 欧美成人黑人xx视频免费观看| 欧美一区二区高清在线观看| 国产日韩精品在线播放| 久久久国产成人精品| 欧美在线关看| 在线播放中文一区| 欧美成人三级在线| 欧美大秀在线观看| 一本色道久久精品| 一区二区高清| 国产伦精品一区二区三区免费 | 在线亚洲精品| 中文精品99久久国产香蕉| 国产精品毛片在线| 久久爱另类一区二区小说| 欧美一级理论片| 一区三区视频| 老司机精品视频一区二区三区| 久久久久成人精品| 91久久久在线| 99热在这里有精品免费| 国产精品三级视频| 久久综合九色综合欧美就去吻| 麻豆av一区二区三区| 一本色道久久综合狠狠躁篇怎么玩 | 小辣椒精品导航| 影音先锋久久久| 亚洲精品在线观| 国产精品中文在线| 嫩模写真一区二区三区三州| 欧美理论电影网| 欧美影片第一页| 蜜桃av一区二区三区| 亚洲一区视频在线| 久久久久中文| 亚洲午夜影视影院在线观看| 久久xxxx精品视频| 中文在线一区| 久久麻豆一区二区| 亚洲资源av| 欧美成人高清视频| 久久国产婷婷国产香蕉| 欧美日韩精品久久| 老司机一区二区| 国产精品免费在线| 亚洲国产成人精品视频| 久久精品视频在线| 欧美剧在线免费观看网站| 亚洲欧美精品在线观看| 久久精品一区二区三区中文字幕| 亚洲日本成人在线观看| 亚洲砖区区免费| 亚洲国产毛片完整版 | 夜夜嗨av色综合久久久综合网| 国产手机视频一区二区| 亚洲精品久久久久久久久久久| 国内精品免费午夜毛片| 亚洲色图在线视频| 亚洲蜜桃精久久久久久久| 久久国产日本精品| 香蕉av福利精品导航| 欧美日韩亚洲一区二| 亚洲第一久久影院| 亚洲第一二三四五区| 午夜精品婷婷| 亚洲免费影视| 欧美调教vk| 亚洲精选在线| 日韩亚洲精品视频| 蜜桃av噜噜一区| 麻豆91精品91久久久的内涵| 国产亚洲精品高潮| 欧美影院精品一区| 久久网站免费| 在线不卡欧美| 鲁大师影院一区二区三区| 麻豆av一区二区三区| 在线观看日韩| 免费看精品久久片| 亚洲国产日韩一级| a4yy欧美一区二区三区| 欧美精品一区二区精品网| 亚洲欧洲一区二区在线播放| 99精品视频免费观看| 欧美日韩999| 亚洲美女尤物影院| 亚洲一区二区三区久久| 国产精品久久久一区二区| 亚洲一区二区视频在线| 欧美在线免费视频| 国内成人精品一区| 久久综合九色综合欧美就去吻| 欧美国产精品中文字幕| 9国产精品视频| 国产精品五月天| 久久久久免费视频| 亚洲精品久久久久久久久| 午夜精品久久久99热福利| 国产午夜精品久久久久久免费视 | 久久av最新网址| 红杏aⅴ成人免费视频| 美女被久久久| 夜夜嗨av色综合久久久综合网 | 一本色道久久加勒比精品| 欧美天天影院| 久久国内精品自在自线400部| 欧美一区二区三区在线看| 欧美亚洲网站| 欧美激情国产日韩精品一区18| 亚洲三级视频在线观看| 欧美午夜视频在线观看| 欧美中文在线观看国产| 欧美激情精品久久久久久久变态 | 一区免费观看| 欧美三区不卡| 久久精品免费电影| 亚洲精品一区二区在线观看| 欧美自拍偷拍| 洋洋av久久久久久久一区| 国产精品午夜在线观看| 久久婷婷综合激情| 亚洲天堂网站在线观看视频| 葵司免费一区二区三区四区五区| 亚洲精品在线视频观看| 国产美女精品| 欧美日韩国产综合在线| 久久久久久成人| 亚洲视频高清| 亚洲盗摄视频| 久久亚洲精品一区二区| 亚洲欧美日韩综合| 亚洲日本视频| 精品不卡在线| 国产毛片一区二区| 欧美日韩综合久久| 欧美激情网站在线观看| 久久精品国产99国产精品| 在线亚洲欧美| 99精品视频免费在线观看| 亚洲电影观看| 欧美国产一区在线| 免费日韩精品中文字幕视频在线| 久久精品72免费观看|