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

寶杉的博客

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>
            91久久久在线| 欧美不卡视频一区| 99一区二区| 亚洲精品韩国| 欧美日韩一区二区精品| 亚洲性夜色噜噜噜7777| 亚洲综合视频1区| 两个人的视频www国产精品| 欧美激情亚洲激情| 国产精品性做久久久久久| 欧美尤物巨大精品爽| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精品久久久久久下一站| 亚洲一区图片| 精品999成人| 亚洲黄色精品| 国产嫩草一区二区三区在线观看| 国内激情久久| 一区二区电影免费在线观看| 久久九九免费| 亚洲图片在线| 韩国欧美国产1区| 亚洲精品精选| 蜜乳av另类精品一区二区| 日韩视频一区二区在线观看| 亚洲天堂av在线免费| 久久成人精品无人区| 亚洲经典视频在线观看| 一区二区国产精品| 亚洲国产精品一区二区尤物区| 欧美午夜视频网站| 久久久久在线| 国产精品国产三级国产专区53| 亚洲国产欧美不卡在线观看| 翔田千里一区二区| 理论片一区二区在线| 午夜精品久久久久久99热| 久久久人成影片一区二区三区观看 | 日韩一级成人av| 免费欧美在线| 国产精品一区一区| 亚洲精品一级| 亚洲片国产一区一级在线观看| 久久综合五月天婷婷伊人| 欧美日韩黄色一区二区| 在线观看中文字幕亚洲| 久久深夜福利| 国产精品一区二区三区四区| 亚洲人精品午夜在线观看| 影音先锋久久久| 久久er精品视频| 久久精品日韩欧美| 久久福利电影| 欧美亚洲专区| 国产精品美女| 亚洲一区二区三区四区在线观看 | 国模精品娜娜一二三区| 亚洲一区二区三区精品在线观看 | 一区二区三区视频在线看 | 99视频精品免费观看| 欧美大色视频| 亚洲精品国产拍免费91在线| 亚洲国产精品久久久久婷婷884 | 国产亚洲精品一区二区| 国产精品99久久久久久久久| 国产精品久久999| 亚洲精品一区久久久久久| 日韩视频一区二区三区在线播放免费观看| 亚洲精品乱码久久久久久黑人 | 一区在线免费观看| 欧美激情 亚洲a∨综合| 伊人成年综合电影网| 亚洲国产精品传媒在线观看 | 欧美色网一区二区| 99re这里只有精品6| 亚洲一区二区欧美日韩| 欧美一区二区三区在线| 在线观看日韩av电影| 亚洲三级电影全部在线观看高清| 91久久久亚洲精品| 亚洲午夜激情免费视频| 欧美中文字幕在线| 亚洲二区在线观看| 亚洲性av在线| 久久久久久国产精品mv| 黄网动漫久久久| 欧美大片免费观看| 一区二区三区日韩精品| 久久久国产精品一区| 在线播放国产一区中文字幕剧情欧美| 亚洲麻豆av| 欧美一区二区三区在| 亚洲电影在线观看| 欧美日韩极品在线观看一区| 亚洲欧美一区二区三区久久| 男人的天堂亚洲在线| 国产精自产拍久久久久久| 久久福利毛片| 欧美伊人久久久久久午夜久久久久| 国产性猛交xxxx免费看久久| 91久久久久久| 亚洲丶国产丶欧美一区二区三区| 99视频超级精品| 久久综合综合久久综合| 中文在线资源观看网站视频免费不卡| 久久精品女人| 欧美在线免费观看视频| 亚洲国产综合在线看不卡| 欧美一级一区| 亚洲精品乱码久久久久久日本蜜臀 | 一本大道av伊人久久综合| 久久国产主播| 日韩视频在线观看一区二区| 久久综合给合| 亚洲女爱视频在线| 国产精品免费区二区三区观看| 亚洲第一网站免费视频| 午夜在线视频观看日韩17c| 亚洲电影免费观看高清完整版在线观看 | 亚洲第一福利视频| 亚洲午夜性刺激影院| 欧美在线日韩| 欧美激情视频网站| 美国十次了思思久久精品导航| 亚洲欧洲日本一区二区三区| 国产日韩欧美在线| 国产精品扒开腿做爽爽爽视频| 欧美成人精品高清在线播放| 蜜臀av性久久久久蜜臀aⅴ| 亚洲影院在线| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美体内谢she精2性欧美| 欧美a级一区| 久久一区精品| 欧美在线视频免费观看| 亚洲欧美综合国产精品一区| 久久精品官网| 欧美日韩国产系列| 欧美激情五月| 欧美日韩的一区二区| 牛牛国产精品| 欧美成人精品1314www| 久久人人97超碰精品888| 久久xxxx| 久热精品视频在线观看| 欧美在线视频一区| 欧美在线视频免费观看| 尤物精品在线| 亚洲电影视频在线| 亚洲精品视频一区二区三区| 亚洲免费观看在线观看| 一本大道av伊人久久综合| 亚洲视屏在线播放| 欧美一区二区三区男人的天堂| 韩日视频一区| 国内精品久久久久影院 日本资源| 国产区精品视频| 欧美激情国产日韩| 欧美精品啪啪| 久久精品免费电影| 亚洲精品影视| 久久精品成人一区二区三区蜜臀| 影音先锋中文字幕一区| 亚洲黄色成人久久久| 一区二区高清视频| 性久久久久久| 亚洲精品一二三| 国产一区在线播放| 亚洲国产欧美日韩另类综合| 99re66热这里只有精品4| 亚洲欧美日本另类| 亚洲啪啪91| 亚洲一区精品电影| 久久伊伊香蕉| 羞羞色国产精品| 免费在线亚洲欧美| 一本色道久久88精品综合| 欧美成人免费一级人片100| 亚洲国产综合在线| 欧美国产日本在线| 99国产精品久久久久久久久久| 免费精品99久久国产综合精品| 亚洲欧美日韩精品综合在线观看 | 亚洲精品国产视频| 国产精品网站在线观看| 亚洲高清在线观看| 亚洲看片网站| 久久久91精品国产一区二区三区| 亚洲性色视频| 9色国产精品| 久久成人精品无人区| 亚洲永久精品大片| a4yy欧美一区二区三区| 狼人社综合社区| 亚洲视频免费| 欧美日韩精品一区二区三区| 永久91嫩草亚洲精品人人| 国内在线观看一区二区三区| 国产精品99久久99久久久二8| 亚洲毛片在线|