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

寶杉的博客

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香蕉国产| 美女视频黄 久久| 日韩亚洲在线| 日韩午夜激情av| 一区二区欧美激情| 亚洲午夜一区| 性欧美办公室18xxxxhd| 午夜日韩在线观看| 久久福利视频导航| 免费观看国产成人| 亚洲人午夜精品| 亚洲精品日韩一| 一区二区三区四区在线| 亚洲一卡久久| 欧美在线999| 欧美xart系列在线观看| 欧美色中文字幕| 国产真实乱偷精品视频免| 在线视频国内自拍亚洲视频| 99精品视频一区| 欧美在线免费视频| 欧美大片在线看| 日韩一级在线观看| 久久成人免费日本黄色| 欧美极品影院| 国产日韩欧美综合在线| 亚洲第一精品夜夜躁人人爽| 夜色激情一区二区| 久久精品欧洲| 亚洲三级电影全部在线观看高清| 亚洲一区成人| 欧美高清视频一区二区三区在线观看| 国产精品美女主播| 亚洲国产精品久久久久秋霞影院| 亚洲一区激情| 欧美激情一区二区三区蜜桃视频| 亚洲主播在线观看| 欧美国产综合视频| 极品日韩av| 亚洲综合精品一区二区| 欧美h视频在线| 亚洲免费影院| 久久黄色影院| 日韩一级大片| 99精品视频免费| 久久亚洲国产精品一区二区| 亚洲美洲欧洲综合国产一区| 久久久精品五月天| 国产免费观看久久| 亚洲一级网站| 国产午夜亚洲精品不卡| 一区二区三区视频在线| 欧美福利在线| 久久久亚洲精品一区二区三区| 国产精品免费观看在线| 亚洲天堂免费观看| 亚洲美女黄网| 欧美日韩视频在线观看一区二区三区 | 免播放器亚洲一区| 精品不卡一区| 麻豆freexxxx性91精品| 性做久久久久久久久| 国产精品一区二区久久精品| 亚洲女与黑人做爰| 亚洲影视中文字幕| 国产日韩欧美综合精品| 久久青青草综合| 久久久五月婷婷| 91久久久久久| 亚洲精品久久久久久久久久久| 可以看av的网站久久看| 亚洲电影免费观看高清| 欧美福利精品| 欧美国产精品va在线观看| 亚洲美女黄色| 艳女tv在线观看国产一区| 国产精品高潮在线| 久久成人精品电影| 久久精品国产99国产精品| 黄色一区二区三区| 欧美激情乱人伦| 久久成人免费电影| 久久蜜桃香蕉精品一区二区三区| 在线看一区二区| 亚洲精品中文字幕在线| 国产精品久久久久久久app| 午夜精品国产更新| 久久成人精品视频| 夜夜爽www精品| 91久久久久久久久久久久久| 亚洲激情视频在线播放| 欧美日韩在线影院| 久久国产精品72免费观看| 久久精品日产第一区二区三区| 亚洲激情精品| 亚洲天堂免费在线观看视频| 国内外成人免费视频| 亚洲第一在线综合在线| 亚洲看片免费| 亚洲午夜未删减在线观看| 国产精品视频一| 欧美不卡高清| 国产精品久久久久久久app| 另类亚洲自拍| 欧美色另类天堂2015| 久久亚洲色图| 欧美日韩视频在线一区二区| 麻豆国产va免费精品高清在线| 欧美日韩免费观看一区二区三区| 久久久久久一区二区| 欧美三日本三级三级在线播放| 久久在线91| 国产乱码精品| 一区二区三区成人| 亚洲人体偷拍| 久久夜色精品国产欧美乱| 亚洲欧美国产三级| 欧美啪啪一区| 亚洲福利视频免费观看| 国产在线欧美| 午夜在线观看免费一区| 亚洲一级黄色片| 欧美日韩视频专区在线播放 | 欧美亚洲视频一区二区| 欧美成黄导航| 久久米奇亚洲| 国产欧美精品va在线观看| 亚洲免费福利视频| 亚洲日韩第九十九页| 欧美在线观看www| 欧美日韩色综合| 亚洲精选在线观看| 亚洲精品久久久久久一区二区| 久久电影一区| 久久综合一区| 一区二区三区在线视频观看| 一区二区国产在线观看| 欧美+亚洲+精品+三区| 男女激情视频一区| 精品999在线播放| 久久精品视频一| 噜噜噜在线观看免费视频日韩| 国产日韩欧美二区| 亚洲欧美电影院| 亚洲欧美日本日韩| 国产精品啊v在线| 亚洲午夜电影| 欧美一区二区久久久| 国产精品日韩专区| 性做久久久久久免费观看欧美 | 一本不卡影院| 欧美理论在线播放| 日韩午夜在线电影| 亚洲自拍高清| 国产偷自视频区视频一区二区| 亚洲欧美日韩综合一区| 欧美精品精品一区| 99re在线精品| 欧美一区二区三区另类| 亚洲欧美色一区| 久久精品国产精品| 一区二区三区在线免费观看| 免费成人在线观看视频| 亚洲图中文字幕| 国产精品入口麻豆原神| 欧美一区二区| 黄色亚洲大片免费在线观看| 久久亚洲综合网| 一二三四社区欧美黄| 久久精品国产91精品亚洲| 亚洲成人在线网| 亚洲免费观看高清在线观看| 日韩视频一区二区三区在线播放免费观看| 久久久久免费观看| 欧美一区二区三区另类| 国产亚洲一本大道中文在线| 久久久久久伊人| 日韩午夜电影av| 久久av二区| 日韩视频在线观看| 国产亚洲免费的视频看| 欧美大片在线观看一区二区| 亚洲第一毛片| 国产精品萝li| 亚洲视频在线二区| 亚洲美女黄网| 国产午夜一区二区三区| 欧美一区二区播放| 欧美日韩一区二区免费在线观看| 久久久国产午夜精品| 亚洲三级视频| 狠狠干综合网| 国产欧美精品一区aⅴ影院| 欧美日韩国产综合视频在线观看| 欧美综合激情网| 亚洲一区精品视频| 99视频精品免费观看| 亚洲国产网站| 嫩草成人www欧美|