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

寶杉的博客

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>
            欧美美女日韩| aa亚洲婷婷| 欧美日韩午夜精品| 六月丁香综合| 欧美sm视频| 欧美成人综合一区| 欧美精品日韩精品| 欧美日韩国产黄| 国产精品系列在线播放| 国产精品yjizz| 国产在线高清精品| 欧美影院一区| 国产精品一区免费在线观看| 国产精品乱人伦一区二区 | 国产精品毛片va一区二区三区 | 亚洲毛片一区二区| 99精品视频免费全部在线| 亚洲一区二区视频| 久久国产精彩视频| 欧美久久视频| 黄色成人av网| 这里是久久伊人| 久久综合激情| 99国产精品视频免费观看一公开| 亚洲欧美精品中文字幕在线| 久久人体大胆视频| 国产精品日本一区二区| 在线日韩视频| 新狼窝色av性久久久久久| 蘑菇福利视频一区播放| av成人免费在线| 久久人人看视频| 国产精品一页| 一本色道久久88综合亚洲精品ⅰ | 黄色欧美日韩| 亚洲视频每日更新| 欧美国产先锋| 午夜亚洲福利| 欧美色综合网| 亚洲国产欧美一区| 久久婷婷综合激情| 亚洲亚洲精品三区日韩精品在线视频 | 国产精品一卡| 一本久久综合亚洲鲁鲁五月天| 久久综合影视| 午夜久久久久久| 欧美日韩一区二区三区免费看| 一区二区亚洲| 久久影院午夜论| 欧美一区二区三区另类| 国产精品高潮呻吟| 中文精品在线| 亚洲理伦在线| 欧美日本高清一区| 亚洲人成7777| 最近看过的日韩成人| 亚洲欧美视频一区二区三区| 欧美日韩免费一区| 欧美片网站免费| 亚洲无吗在线| 欧美日韩精品欧美日韩精品一| 一区二区视频免费完整版观看| 久久成人免费电影| 亚洲欧美激情四射在线日 | 嫩草成人www欧美| 国产亚洲欧美中文| 久久不射电影网| 亚洲午夜av在线| 欧美性猛交一区二区三区精品| 一区二区国产精品| 亚洲天堂免费观看| 国产精品视频网| 久久久999精品| 久久久成人网| 亚洲精品四区| 亚洲精品一区二区在线| 欧美日韩国产小视频| 亚洲永久在线| 欧美伊人久久| 亚洲国产婷婷香蕉久久久久久99| 亚洲国产精品一区| 欧美视频二区| 久久久综合精品| 欧美激情网友自拍| 午夜久久久久久久久久一区二区| 欧美一级大片在线观看| 在线日韩中文| 99热在这里有精品免费| 国产精品亚洲不卡a| 久久一区二区视频| 欧美伦理在线观看| 久久精品一区二区三区不卡牛牛| 久久夜色精品一区| 一区二区三区免费在线观看| 99一区二区| 伊人久久婷婷| 一区二区不卡在线视频 午夜欧美不卡'| 欧美视频在线免费看| 久久久久久久久久久一区| 欧美激情aⅴ一区二区三区| 午夜精品国产| 欧美高清影院| 久久久综合视频| 欧美视频网址| 欧美成人一区二区| 国产精品乱码久久久久久| 欧美成人一区二区三区片免费| 国产精品久久一区主播| 欧美电影资源| 韩国久久久久| 亚洲欧美日韩一区二区三区在线观看| 在线观看日韩欧美| 亚洲一区二区网站| 99亚洲一区二区| 久久精品国产v日韩v亚洲| 亚洲美女尤物影院| 久久久久国产成人精品亚洲午夜| 亚洲成人影音| 亚洲综合成人婷婷小说| 亚洲电影av| 国产欧美亚洲一区| 亚洲精品乱码久久久久久黑人| 国产日韩在线亚洲字幕中文| 亚洲精品资源美女情侣酒店| 精品999在线观看| 亚洲欧美自拍偷拍| 亚洲在线第一页| 欧美日韩国产小视频在线观看| 欧美成人一区在线| 亚洲国产精品精华液2区45 | 久久久久久成人| 久久国产精彩视频| 国产精品日本| 亚洲综合久久久久| 亚洲影院色无极综合| 欧美日韩国内自拍| 亚洲国产综合在线看不卡| 国模叶桐国产精品一区| 欧美在线综合视频| 久久综合色播五月| 在线观看欧美激情| 免费日本视频一区| 亚洲国产天堂久久综合| 亚洲精品综合| 欧美日韩另类一区| 亚洲一区二区av电影| 亚洲欧美影院| 国产一级一区二区| 久久久欧美精品sm网站| 欧美激情视频在线免费观看 欧美视频免费一| 国产曰批免费观看久久久| 久久成人综合视频| 麻豆九一精品爱看视频在线观看免费 | 欧美一区二区三区免费视频| 久久精品国产第一区二区三区最新章节| 国产精品久久久久久久久免费樱桃 | 男女av一区三区二区色多| 亚洲国产日韩欧美在线99 | 亚洲欧美精品在线| 国产午夜精品久久久| 久久经典综合| 亚洲福利在线观看| 一区电影在线观看| 国产日韩欧美中文在线播放| 久久精品一本| 亚洲精品少妇网址| 欧美在线在线| 亚洲精品日韩精品| 欧美三区美女| 久久精品国产亚洲a| 亚洲第一在线综合在线| 中文网丁香综合网| 国内在线观看一区二区三区| 男人的天堂亚洲在线| 亚洲私人影院| 欧美成人免费一级人片100| 亚洲一二三四区| 欧美日韩一级视频| 欧美日韩一区二区精品| 久久亚洲综合网| 亚洲精品欧美精品| 国产亚洲一二三区| 欧美人成网站| 久久精品国产综合| 99视频热这里只有精品免费| 美女脱光内衣内裤视频久久影院| 一区二区三区欧美在线观看| 国产亚洲一区二区在线观看| 欧美激情视频在线播放| 久久精品二区亚洲w码| 夜夜精品视频| 亚洲国产精品毛片| 久久一区亚洲| 欧美在线日韩在线| 亚洲欧美久久久| 一本色道久久综合亚洲精品小说| 激情欧美一区二区| 国产亚洲一区二区在线观看 | 国产视频一区在线观看一区免费| 欧美日韩国产免费观看|