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

寶杉的博客

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  回復  更多評論   

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
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久免费看| 欧美福利一区| 欧美啪啪一区| 欧美一级精品大片| 久久精品系列| 一本色道久久综合狠狠躁篇的优点| 亚洲国产精品电影在线观看| 欧美精品www| 午夜影院日韩| 久久免费黄色| 亚洲尤物精选| 黄色亚洲网站| 亚洲美女福利视频网站| 国产精品日韩在线播放| 久久综合中文色婷婷| 欧美电影在线观看完整版| 亚洲一区二区不卡免费| 欧美一区二区视频免费观看| 1024成人| 亚洲一区二区三区中文字幕| 亚洲国产精品久久久久久女王| 一区二区三区|亚洲午夜| 国产一区二区三区在线观看视频| 亚洲激情六月丁香| 国产色综合久久| 最近看过的日韩成人| 狠狠爱综合网| 一本色道婷婷久久欧美| 亚洲黄色高清| 久久国产加勒比精品无码| 9国产精品视频| 欧美 日韩 国产精品免费观看| 欧美一区二区三区免费观看| 欧美日本亚洲韩国国产| 美女黄毛**国产精品啪啪| 国产精品色一区二区三区| 亚洲黄网站在线观看| 国内精品美女在线观看| 亚洲男女自偷自拍| 99亚洲一区二区| 老司机午夜精品视频在线观看| 久久爱www久久做| 欧美色精品在线视频| 亚洲国产一区二区三区高清| 1769国产精品| 久久久久久9| 久久久噜噜噜久久中文字幕色伊伊 | 久久先锋资源| 国产精品亚洲一区| 一区二区三区不卡视频在线观看| 亚洲精品视频免费观看| 乱人伦精品视频在线观看| 久久日韩粉嫩一区二区三区| 国产日韩精品一区二区三区 | 亚洲国产一区二区三区a毛片| 国内视频精品| 久久精品国产在热久久| 久久人人看视频| 国产在线精品自拍| 欧美永久精品| 鲁大师影院一区二区三区| 黄色在线成人| 美女在线一区二区| 亚洲电影免费观看高清完整版| 亚洲黄色在线看| 免费欧美日韩| 亚洲精品国产拍免费91在线| 一区二区欧美在线观看| 欧美婷婷六月丁香综合色| 妖精成人www高清在线观看| 亚洲午夜一级| 国产麻豆午夜三级精品| 久久激情一区| 欧美大秀在线观看| 日韩视频免费在线| 国产精品av免费在线观看| 亚洲一区二区在线免费观看视频 | 欧美福利小视频| 日韩亚洲欧美高清| 亚洲综合大片69999| 国产伦一区二区三区色一情| 久久精品72免费观看| 欧美mv日韩mv国产网站| 亚洲每日在线| 国产精品视频一区二区三区| 久久久久国产精品一区三寸 | 久久精品国产精品亚洲综合 | 国产精品你懂的| 久久精品九九| 亚洲精品一区二区三区不| 亚洲欧美综合网| 在线成人黄色| 欧美日韩在线一区| 欧美专区一区二区三区| 亚洲人成在线观看| 久久久亚洲综合| 在线视频日本亚洲性| 黑丝一区二区| 国产精品久久久久久久久久尿| 欧美一区二区| 日韩一区二区精品在线观看| 久久另类ts人妖一区二区| 亚洲视频www| 一区二区三区不卡视频在线观看 | 国产精品草莓在线免费观看| 久久国产婷婷国产香蕉| 亚洲经典在线| 欧美成年人视频| 性久久久久久久久久久久| 亚洲国产精品综合| 国产毛片一区| 国产精品v欧美精品v日韩 | 99视频超级精品| 你懂的国产精品| 久久激情视频| 午夜精品理论片| 99精品热视频只有精品10| 激情久久影院| 国产亚洲午夜| 国产女人精品视频| 国产精品久久久久久久久久久久 | 毛片基地黄久久久久久天堂| 亚洲图片在线观看| 亚洲欧洲精品一区二区精品久久久| 久久亚洲国产精品一区二区 | 欧美伊人久久大香线蕉综合69| 日韩午夜电影| 亚洲伦理中文字幕| 亚洲精品国产精品久久清纯直播| 亚洲大片av| 国内精品美女在线观看| 国产一区二区三区在线免费观看 | 国产区日韩欧美| 国产精品美女久久久| 国产精品青草久久| 国产精品国产亚洲精品看不卡15 | 一区二区三区在线观看欧美| 国产欧美日韩伦理| 国产欧美欧美| 国产亚洲激情| 精品福利电影| 亚洲国产乱码最新视频| 亚洲精品国产精品国自产在线 | 亚洲国产视频一区二区| 在线观看国产精品淫| 亚洲狠狠婷婷| 99re热这里只有精品免费视频| 日韩午夜在线观看视频| 中文网丁香综合网| 亚洲一区二区网站| 久久国产高清| 久久一区二区三区av| 免费不卡在线视频| 亚洲精品视频啊美女在线直播| 99精品国产在热久久| 亚洲一区二区在线视频| 久久精品女人的天堂av| 欧美高清视频一二三区| 欧美日韩在线一区| 国产婷婷成人久久av免费高清 | 国产免费观看久久| 一区二区三区自拍| 99热在线精品观看| 欧美一级在线视频| 久久中文精品| 日韩一级免费| 欧美中文在线观看国产| 欧美激情国产精品| 国产精品最新自拍| 亚洲国产影院| 亚洲免费网站| 欧美黄色一区二区| 亚洲欧美视频在线观看视频| 猫咪成人在线观看| 国产精品a久久久久| 在线观看一区二区精品视频| 亚洲午夜av| 欧美www在线| 亚洲少妇自拍| 欧美激情视频免费观看| 黑丝一区二区三区| 亚洲欧美国产三级| 亚洲国产裸拍裸体视频在线观看乱了中文 | 另类av导航| 国产精品综合网站| 亚洲最新合集| 久久亚洲风情| 亚洲欧美日本国产有色| 欧美精品一区二| 136国产福利精品导航| 久久精品成人欧美大片古装| 国产欧美精品一区aⅴ影院| 99re亚洲国产精品| 免费不卡在线视频| 久久精品国产久精国产爱|