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

寶杉的博客

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>
            在线观看久久av| 欧美午夜电影网| 玖玖视频精品| 亚洲欧美在线播放| 中文网丁香综合网| 99精品欧美一区| 亚洲精品在线看| 亚洲九九精品| 亚洲巨乳在线| 中文av字幕一区| 欧美一级片一区| 女女同性精品视频| 最新高清无码专区| 亚洲国产mv| 亚洲天堂激情| 久久高清免费观看| 另类av导航| 欧美日韩在线另类| 国产精品一区二区三区四区 | 伊人久久久大香线蕉综合直播| 国产亚洲日本欧美韩国| 国产一区二区日韩精品欧美精品| 亚洲成人在线免费| 在线亚洲精品| 久久夜色撩人精品| 亚洲伦理精品| 欧美中文字幕第一页| 欧美国产精品久久| 国产精品久久久久久久久久免费| 国产午夜亚洲精品理论片色戒| 亚洲激情影院| 欧美资源在线| 亚洲激情另类| 性高湖久久久久久久久| 欧美福利在线观看| 国产毛片一区二区| 亚洲欧洲精品一区二区三区不卡 | 亚洲影院在线观看| 久久综合伊人77777蜜臀| 亚洲经典在线| 欧美一区二区三区在线看| 欧美大片在线影院| 国产婷婷色综合av蜜臀av| 99精品视频一区二区三区| 久久综合999| 亚洲夜间福利| 欧美日韩一区在线观看视频| 亚洲国产天堂网精品网站| 久久经典综合| 亚洲影院污污.| 在线视频精品| 欧美国产欧美亚州国产日韩mv天天看完整 | 久久综合福利| 欧美在线视频a| 国产精品拍天天在线| 一区二区三区精密机械公司| 欧美刺激性大交免费视频| 久久国产精品99精品国产| 国产精品麻豆成人av电影艾秋| 一本色道久久精品| 亚洲另类春色国产| 欧美色大人视频| 亚洲免费视频在线观看| 在线视频精品一区| 国产精品久久婷婷六月丁香| 亚洲午夜久久久| 99亚洲伊人久久精品影院红桃| 欧美日本在线一区| 一本久久知道综合久久| 亚洲韩国精品一区| 欧美另类99xxxxx| 亚洲无吗在线| 亚洲视频1区| 国产精品香蕉在线观看| 久久se精品一区精品二区| 欧美一区二区三区免费在线看 | 日韩午夜精品| 欧美大片国产精品| 欧美国产日韩一区二区在线观看 | 久久久综合网| 久久夜精品va视频免费观看| 国产伦理精品不卡| 狂野欧美激情性xxxx| 亚洲综合三区| 国产在线乱码一区二区三区| 午夜在线精品| 久久久久www| 国内伊人久久久久久网站视频| 欧美h视频在线| 免费久久久一本精品久久区| 亚洲作爱视频| 一区二区三区**美女毛片 | 亚洲淫性视频| 激情综合色综合久久| 久久久久久色| 欧美日韩国产999| 国产精品99久久久久久有的能看| 性一交一乱一区二区洋洋av| 国产日韩在线看片| 欧美福利精品| 欧美国产视频日韩| 午夜国产一区| 国内伊人久久久久久网站视频| 欧美一区二区日韩| 美女视频黄a大片欧美| 日韩视频一区二区三区| 欧美一区二区黄| 亚洲国产日日夜夜| 欧美一二区视频| 亚洲成人资源网| 午夜在线电影亚洲一区| 黄色一区二区在线| 亚洲视频一区在线| 国产中文一区二区三区| 国产精品99久久久久久有的能看| 国产精品欧美一区二区三区奶水| 亚洲黄色小视频| 国产精品男女猛烈高潮激情| 欧美激情一区二区三区在线| 国产精品超碰97尤物18| 亚洲国产日韩一区二区| 国产伦理一区| 9久re热视频在线精品| 韩国av一区二区三区四区| 亚洲视频免费观看| **欧美日韩vr在线| 久久精视频免费在线久久完整在线看| 亚洲精品国久久99热| 亚洲在线1234| 狠狠网亚洲精品| 欧美+日本+国产+在线a∨观看| 国产日产欧美a一级在线| 亚洲久久在线| 最近中文字幕日韩精品| 久久五月激情| 久久久久国产精品午夜一区| 国产日韩欧美一区二区三区四区| 亚洲经典一区| 亚洲看片免费| 久久免费高清视频| 久久综合影视| 国产欧美精品一区二区三区介绍| 亚洲无亚洲人成网站77777| 亚洲国产天堂久久综合网| 裸体一区二区三区| 久久精品免费电影| 国内精品一区二区| 亚洲综合另类| 久久综合久久久| 国产情人节一区| 亚洲一区二区三区四区五区午夜| 欧美日韩亚洲视频一区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 一区二区黄色| 亚洲欧美综合v| 欧美日韩999| 亚洲欧美国产精品桃花 | 亚洲欧美一区二区精品久久久| 欧美日本不卡| 日韩一二三区视频| 99视频精品全国免费| 欧美区一区二区三区| 欧美国产极速在线| 激情视频一区二区| 欧美精品免费观看二区| 欧美激情一区二区三级高清视频 | 亚洲网站视频福利| 国产乱码精品一区二区三区不卡 | 一区二区三区www| 亚洲国产裸拍裸体视频在线观看乱了中文 | 一区二区91| 葵司免费一区二区三区四区五区| 亚洲大片一区二区三区| 亚洲国产一区视频| 国产精品激情电影| 在线视频你懂得一区| 久久精品夜色噜噜亚洲a∨| 国产日韩av一区二区| 美女精品在线| 亚洲黄色在线观看| 久久久成人网| 在线欧美亚洲| 国产精品福利在线观看| 亚洲一区二区三区在线看| 模特精品在线| 国产日韩一级二级三级| 欧美日本韩国| 亚洲区第一页| 国产在线视频欧美| 欧美视频在线观看免费| 性久久久久久久久| 亚洲伦理一区| 久久人人九九| 欧美一区1区三区3区公司| 国产日产亚洲精品| 亚洲国产精品福利| 亚洲天堂av在线免费| 久久精品综合一区| 亚洲欧美大片| 精品二区视频|