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

寶杉的博客

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一区在线观看| 欧美怡红院视频| 久久精品国产免费看久久精品| 亚洲国产精品成人va在线观看| 亚洲国产成人tv| 欧美日韩性生活视频| 亚洲欧美日韩国产一区二区三区| 亚洲制服少妇| 亚洲国产成人porn| 亚洲视频在线二区| 怡红院精品视频| 亚洲美女一区| 国内成+人亚洲| 亚洲精品乱码久久久久久久久 | 久久综合色影院| 欧美黄色影院| 久久久国产午夜精品| 免费在线看成人av| 欧美一区二区高清在线观看| 久久精品最新地址| 亚洲一区二区在线播放| 久久这里有精品15一区二区三区| 一区二区欧美精品| 久久高清免费观看| 亚洲免费视频观看| 久久在线免费观看| 午夜精品久久久久久久久| 久久人人爽人人| 午夜精品福利视频| 欧美伦理视频网站| 美女视频黄a大片欧美| 国产精品久久久久久模特| 嫩草成人www欧美| 国产精品一区二区黑丝| 亚洲日本黄色| 亚洲丰满少妇videoshd| 午夜久久资源| 篠田优中文在线播放第一区| 欧美精品123区| 欧美高清视频一区二区三区在线观看| 国产精品美女久久久久久久| 最新成人av在线| 在线看一区二区| 欧美一区二区三区日韩| 亚洲天堂免费在线观看视频| 欧美国产日韩免费| 亚洲高清成人| 亚洲国产高清在线| 久久精品国产综合精品| 欧美一区二区免费| 国产嫩草影院久久久久 | 先锋亚洲精品| 国产精品多人| 宅男噜噜噜66一区二区| 亚洲天堂av电影| 欧美性猛交一区二区三区精品| 亚洲国产欧美在线| 亚洲狼人综合| 欧美精品18+| 99精品视频一区二区三区| 99综合在线| 欧美日韩一区二区在线观看视频| 最新亚洲一区| 亚洲无亚洲人成网站77777 | 性欧美videos另类喷潮| 久久国产精品99精品国产| 国产乱人伦精品一区二区| 亚洲专区国产精品| 久久综合一区二区| 亚洲欧洲综合| 欧美视频一区| 欧美诱惑福利视频| 免费观看久久久4p| 亚洲美女在线视频| 国产精品久久久久久亚洲调教| 亚洲一区精品电影| 久久综合福利| 99re这里只有精品6| 欧美午夜精品伦理| 欧美影院成人| 亚洲人成绝费网站色www| 亚洲综合精品| 精品成人久久| 欧美片第1页综合| 午夜精品偷拍| 欧美激情一区二区三区在线| 在线性视频日韩欧美| 国产精品青草久久久久福利99| 久久久精品国产99久久精品芒果| 亚洲国产电影| 久久精品二区| 日韩视频专区| 国产亚洲欧洲997久久综合| 老司机精品视频网站| 一区二区欧美国产| 麻豆精品视频在线观看| 亚洲午夜91| 亚洲国产精品成人久久综合一区| 国产精品高清免费在线观看| 欧美亚洲综合另类| 亚洲最快最全在线视频| 麻豆成人在线观看| 欧美中文字幕第一页| 亚洲美女网站| 在线观看日韩av| 国产精品一区二区视频| 欧美乱大交xxxxx| 久久蜜桃精品| 欧美一区二区私人影院日本| 亚洲日本aⅴ片在线观看香蕉| 欧美一区二区视频在线观看| 日韩视频免费大全中文字幕| 红桃视频一区| 国产伦精品一区| 欧美视频一区二区三区四区| 久热国产精品视频| 久久激情久久| 欧美一区二区日韩一区二区| 一区二区三区国产在线| 亚洲国产欧美一区二区三区久久 | 日韩午夜电影在线观看| 欧美电影免费网站| 久久在线观看视频| 久久久久.com| 久久精品国产99| 欧美一区二区大片| 欧美一级片久久久久久久| 亚洲一区二区四区| 亚洲天堂av在线免费观看| 亚洲精品视频在线看| 亚洲区欧美区| 亚洲精选在线| 99精品视频免费观看| 日韩午夜激情电影| 亚洲最新在线| 一本色道久久加勒比88综合| 亚洲毛片在线| 一区二区三区欧美亚洲| 一本色道久久综合亚洲精品高清| 亚洲日本成人| 99re66热这里只有精品4| 亚洲精品在线视频| 一本不卡影院| 亚洲欧美日韩综合一区| 欧美一区二区三区免费大片| 性色av一区二区三区| 久久大逼视频| 玖玖在线精品| 亚洲国产婷婷综合在线精品 | 美女久久一区| 亚洲精美视频| 在线亚洲电影| 欧美一区二区高清在线观看| 性刺激综合网| 美女视频黄 久久| 欧美三级视频在线| 国产精品欧美一区喷水 | 欧美大片在线看免费观看| 欧美日本在线看| 国产精品乱码人人做人人爱| 国产日韩欧美在线一区| 亚洲国产精品久久久久秋霞影院 | 国产一区二区无遮挡| 在线免费观看欧美| 亚洲性图久久| 可以看av的网站久久看| 亚洲区一区二区三区| 亚洲欧美精品一区| 女女同性女同一区二区三区91| 欧美区一区二| 极品日韩久久| 亚洲欧美日韩一区| 免费亚洲婷婷| 亚洲欧美99| 欧美成人蜜桃| 国产日韩欧美高清免费| 亚洲精品影视在线观看| 久久gogo国模啪啪人体图| 亚洲人体大胆视频| 久久成人免费日本黄色| 欧美精品在线极品| 很黄很黄激情成人| 亚洲欧美另类在线观看| 亚洲国产精品精华液网站| 亚洲欧美春色| 欧美午夜性色大片在线观看| 在线播放中文一区| 欧美在线观看网站| 亚洲精品视频啊美女在线直播| 欧美一区激情| 国产精品免费aⅴ片在线观看| 亚洲精品1区2区| 麻豆成人在线播放| 亚洲一区区二区| 国产精品成人免费| 一区二区欧美激情|