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

寶杉的博客

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>
            欧美xart系列高清| 美国成人毛片| 亚洲成人在线网| 欧美特黄a级高清免费大片a级| 在线性视频日韩欧美| 亚洲免费在线精品一区| 国内精品一区二区| 欧美不卡福利| 国产精品久久7| 久久久水蜜桃| 欧美激情综合五月色丁香| 亚洲国产色一区| 一区二区三区国产盗摄| 亚洲性视频h| 欧美一级视频免费在线观看| 欧美电影电视剧在线观看| 国内偷自视频区视频综合| 亚洲激情成人在线| 亚洲国产国产亚洲一二三| 国产日韩精品一区二区三区| 久久国产日本精品| 欧美一区亚洲| 久久精品国产在热久久 | 免费毛片一区二区三区久久久| 欧美高清不卡在线| 美女精品在线| 在线观看视频免费一区二区三区| 亚洲精品一区二区三| 伊人久久成人| 亚洲欧洲精品天堂一级| 久久蜜臀精品av| 亚洲欧美高清| 精品成人一区二区三区| 亚洲人成在线播放| 欧美性开放视频| 亚洲欧美春色| 狼狼综合久久久久综合网| 亚洲黄色小视频| 亚洲人www| 久久久中精品2020中文| 欧美国产1区2区| 亚洲美女av黄| 快播亚洲色图| 久久一二三区| 国产精品福利av| 99精品国产高清一区二区| 亚洲天堂av图片| 久久国产精品亚洲va麻豆| 国产精品网红福利| 久久精品水蜜桃av综合天堂| 亚洲人成在线观看网站高清| 欧美成人精品激情在线观看| 在线观看国产精品淫| 一区二区三区不卡视频在线观看 | 午夜一级在线看亚洲| 一区二区三区在线观看国产| 欧美一区二区精品| 久热精品在线视频| 日韩午夜电影av| 欧美日韩精品综合| 欧美在线欧美在线| 亚洲成在线观看| 中日韩在线视频| 亚洲激情视频网站| 国产精品久久久久久久久久尿 | 一二三区精品福利视频| 宅男在线国产精品| 欧美激情综合网| 亚洲另类在线一区| 欧美在线播放高清精品| 国产伦精品一区二区三区| 久久视频国产精品免费视频在线 | 亚洲欧洲一区二区在线观看 | 91久久在线视频| 国产亚洲毛片| 国产精品成人免费视频| 亚洲高清在线精品| 亚洲精品一二三区| 欧美成人精品激情在线观看| 久久久久久久久岛国免费| 久久免费视频这里只有精品| 亚洲免费影院| 久久精品99| 亚洲天堂男人| 欧美大胆成人| 午夜一区不卡| 亚洲精品婷婷| 亚洲精品乱码久久久久久| 黄色国产精品一区二区三区| 在线播放中文一区| 亚洲第一成人在线| 尤物在线精品| 亚洲电影激情视频网站| 一区二区三区在线免费视频| 国产美女精品一区二区三区 | 亚洲欧美日韩国产中文| 欧美在线黄色| 亚洲激情在线观看视频免费| 欧美激情亚洲综合一区| 羞羞答答国产精品www一本| 久久免费午夜影院| 亚洲精品日本| 久久国产日韩欧美| 91久久午夜| 亚洲精品久久久久| 久久夜色精品国产欧美乱| 免费观看一区| 亚洲色诱最新| 亚洲精品国产精品国自产在线| 亚洲一二三区视频在线观看| 欧美高清在线| 欧美激情一区在线观看| 欧美激情亚洲激情| 欧美激情91| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久久亚洲综合| 免费亚洲电影| 国产精品日韩电影| 欧美一级网站| 妖精视频成人观看www| 欧美婷婷在线| 欧美一区二区高清在线观看| 亚洲欧美一区在线| 国产日韩欧美不卡| 美女网站在线免费欧美精品| 久久久久久色| 亚洲一级二级| 亚洲午夜视频在线观看| 欧美性感一类影片在线播放| 亚洲欧美文学| 欧美在线视频一区| 日韩视频一区| 亚洲一区二区影院| 欧美性jizz18性欧美| 一区二区三区免费网站| 亚洲手机成人高清视频| 亚洲欧美日韩综合| 亚洲高清视频的网址| 亚洲美女电影在线| 国内外成人免费激情在线视频网站| 蜜臀a∨国产成人精品| 国产精品入口麻豆原神| 亚洲欧洲在线播放| 激情视频一区| 亚洲欧美精品在线| 亚洲三级影院| 亚洲一区二区久久| 久久青草福利网站| 亚洲国产精品成人久久综合一区| 亚洲电影网站| 久久婷婷蜜乳一本欲蜜臀| 亚洲欧美乱综合| 国产精品视频免费在线观看| 亚洲午夜影视影院在线观看| 亚洲男人的天堂在线观看| 亚洲午夜日本在线观看| 免费看的黄色欧美网站| 久久久久一区二区| 国产美女精品免费电影| 亚洲免费在线视频一区 二区| 一区二区三区欧美成人| 欧美不卡在线视频| 欧美激情黄色片| 亚洲国产1区| 欧美成人首页| 亚洲精品免费电影| 日韩视频一区二区三区在线播放免费观看 | 久久精品三级| 欧美性大战久久久久久久| 亚洲国产成人av在线| 国产精品综合| 亚洲欧美综合v| 欧美女同视频| 浪潮色综合久久天堂| 狠狠综合久久| 欧美成人免费播放| 国产精品日韩高清| 亚洲午夜在线观看| 欧美一区二区福利在线| 国色天香一区二区| 一区二区欧美激情| 亚洲电影免费观看高清完整版| 亚洲黄一区二区| 精品999久久久| 亚洲色无码播放| 亚洲免费成人av| 免费观看日韩av| 欧美一区二区三区在线观看视频| 另类av导航| 亚洲欧美区自拍先锋| 免费试看一区| 久久久久久91香蕉国产| 中国亚洲黄色| 日韩视频永久免费| 黄色日韩网站| 国产视频亚洲精品| 国产精品一区=区| 欧美日韩中文精品| 欧美精品免费看| 免费不卡亚洲欧美|