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

寶杉的博客

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>
            久久久视频精品| 亚洲一区二区成人在线观看| 久久乐国产精品| 欧美一区二区三区免费视频| 亚洲欧美日韩视频一区| 亚洲桃色在线一区| 亚洲欧美成人一区二区三区| 午夜亚洲性色福利视频| 久久久久久久成人| 欧美精品日韩精品| 国产精品久久97| 在线观看精品| 制服丝袜激情欧洲亚洲| 午夜一级久久| 欧美77777| 日韩视频在线你懂得| 亚洲一区二区欧美| 久久精品国产一区二区三| 蜜桃久久av一区| 国产精品久久久一区二区| 亚洲视频一区二区免费在线观看| 亚洲一区日韩在线| 麻豆91精品91久久久的内涵| 欧美日韩无遮挡| 狠狠噜噜久久| 亚洲影院色无极综合| 美女诱惑一区| 一区二区三区精品国产| 久久漫画官网| 国产精品嫩草影院av蜜臀| 亚洲第一成人在线| 亚洲欧美三级在线| 亚洲国产成人一区| 亚洲精品久久久久久久久久久久久| 亚洲综合日韩在线| 欧美精品18videos性欧美| 国产一区二区视频在线观看 | 一区二区三区日韩欧美| 久久免费视频一区| 国产女人aaa级久久久级| 亚洲精品一区中文| 久久久亚洲国产天美传媒修理工| 日韩视频在线免费观看| 欧美成人视屏| 一区在线观看视频| 久久超碰97中文字幕| 一区二区精品| 欧美精品一区二区三区在线看午夜| 一区二区三区自拍| 久久精品综合| 小嫩嫩精品导航| 国产精品蜜臀在线观看| 亚洲四色影视在线观看| 亚洲黄色免费网站| 免费观看一区| 亚洲国产综合视频在线观看| 久久综合网色—综合色88| 午夜精品久久久| 国产欧美一区二区精品性| 午夜精品久久久久久99热软件 | 欧美夜福利tv在线| 亚洲一区在线观看免费观看电影高清| 欧美—级高清免费播放| 亚洲九九精品| 亚洲人成高清| 欧美日韩激情网| 亚洲一本大道在线| 9色精品在线| 国产精品久久| 久久国产精品99国产| 亚洲欧美日韩精品综合在线观看| 国产精品久久久久久久久久久久久| 亚洲夜间福利| 欧美中文在线免费| 曰韩精品一区二区| 亚洲第一偷拍| 一区二区三区三区在线| 国产精品嫩草影院一区二区| 欧美一区二区精品| 欧美一区二区视频在线观看| 国内精品免费午夜毛片| 欧美18av| 欧美日精品一区视频| 欧美一区二区三区电影在线观看| 欧美一区在线看| 亚洲激情网站免费观看| 99在线热播精品免费99热| 国产九色精品成人porny| 久久久亚洲欧洲日产国码αv| 久久久精品一区二区三区| 亚洲精品一品区二品区三品区| 日韩一二在线观看| 国语自产精品视频在线看抢先版结局| 欧美成人激情视频| 国产精品爱啪在线线免费观看| 久久久久久亚洲精品中文字幕| 美女网站久久| 午夜精品久久久久久99热| 久久免费视频这里只有精品| 一区二区三区欧美在线| 欧美亚洲自偷自偷| 一区二区国产日产| 久久久不卡网国产精品一区| 一区二区三区国产| 久久久久久久久蜜桃| 在线午夜精品自拍| 久久久人成影片一区二区三区| 亚洲欧美成aⅴ人在线观看| 久久这里有精品15一区二区三区| 亚洲一区二区免费在线| 久久看片网站| 欧美综合国产| 欧美日韩亚洲综合| 欧美激情第五页| 国内精品久久久久久 | 在线成人av| 在线视频日韩| 日韩网站在线观看| 麻豆av一区二区三区| 久久人人超碰| 国产视频精品va久久久久久| 亚洲免费大片| 亚洲欧洲偷拍精品| 久久人人97超碰精品888 | 久久一区中文字幕| 国产日韩欧美另类| 国产精品99久久久久久www| 日韩视频二区| 欧美国产成人精品| 亚洲福利视频免费观看| 一区二区三区在线视频播放| 午夜精品一区二区三区电影天堂| 亚洲影院一区| 国产精品黄色在线观看| 99ri日韩精品视频| 一区二区三区久久| 欧美日韩精品免费观看视一区二区 | 99国产精品视频免费观看一公开| 久久久精品一区二区三区| 久久久久国产精品www| 国产日韩欧美日韩| 欧美在线一二三四区| 久久激五月天综合精品| 国产在线国偷精品产拍免费yy| 亚洲欧美日韩另类精品一区二区三区| 亚洲综合好骚| 国产欧美日韩免费| 欧美在线一级视频| 欧美成人激情在线| 亚洲精品在线免费| 欧美少妇一区二区| 亚洲一区二区视频在线观看| 欧美一区2区三区4区公司二百| 国产欧美精品| 久久婷婷影院| 亚洲黄色一区| 午夜视频久久久久久| 国模大胆一区二区三区| 久久一区激情| av不卡在线观看| 久久精品在线观看| 亚洲高清电影| 欧美日韩直播| 欧美一区=区| 亚洲国产精品小视频| 亚洲欧美国产毛片在线| 韩国精品一区二区三区| 欧美激情影音先锋| 性欧美激情精品| 亚洲片在线观看| 久久精品在线视频| 9l视频自拍蝌蚪9l视频成人| 国产情人节一区| 欧美激情一区二区三区在线| 亚洲一区在线观看视频| 欧美激情国产日韩| 午夜精品福利视频| 亚洲人体1000| 国产欧美日韩在线视频| 欧美aa在线视频| 性欧美18~19sex高清播放| 亚洲丶国产丶欧美一区二区三区| 亚洲一二区在线| 亚洲精品视频在线观看网站| 国产一区二区电影在线观看 | 国产一区二区三区免费观看| 欧美精品一区在线观看| 久久爱www.| 亚洲一级在线| 亚洲欧洲日本mm| 欧美va天堂va视频va在线| 欧美一区二区成人6969| 一区二区av| 亚洲国产91色在线| 狠狠色噜噜狠狠色综合久| 国产精品女主播| 欧美精品日韩| 欧美国产三区| 牛人盗摄一区二区三区视频| 久久精品99国产精品日本|