• <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>

            寶杉的博客

            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 寶杉 閱讀(2570) 評(píng)論(4)  編輯 收藏 引用 所屬分類(lèi): 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  回復(fù)  更多評(píng)論   

            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  回復(fù)  更多評(píng)論   

            2008-08-06 14:25 by harvey
            忘了對(duì)以上例子的說(shuō)明了。

            以上是OTL中調(diào)用存儲(chǔ)過(guò)程,得到出參的例子,OTL說(shuō)明書(shū)里是有的,但我也找了很久才找到的。網(wǎng)址是 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  回復(fù)  更多評(píng)論   

            2008-08-06 14:28 by harvey
            這個(gè)是OTL調(diào)sql, ODBC的,注意是
            #define OTL_ODBC

            而不是ORACLE的例子

            因?yàn)閛tl + oracle的例子網(wǎng)上非常多,
            而otl + sqlServer的例子網(wǎng)上很少,

            在這希望能起到拋磚引玉的作用。

            # re: OTL 4.0, OTL concept  回復(fù)  更多評(píng)論   

            2008-10-14 19:18 by xiao_xiao
            我在用到otl_stream時(shí)候,我是在流里不斷的輸入,但是如果其中的一條語(yǔ)句錯(cuò)誤,異常了,他是否會(huì)把緩存里面的所有清空刷新呢? 我懷疑這樣我入庫(kù)的時(shí)候,會(huì)少數(shù)據(jù)呢? 聯(lián)系我 165621600
            国产精品99久久久精品无码 | 青草国产精品久久久久久| 欧美亚洲国产精品久久高清 | 精品国际久久久久999波多野| 久久精品国产91久久综合麻豆自制 | 久久不见久久见免费影院www日本| 久久成人精品| 亚洲国产精品久久久天堂| 99热都是精品久久久久久| 亚洲国产成人久久笫一页| 久久久国产精品亚洲一区| 久久久精品波多野结衣| 中文字幕无码免费久久| 久久精品中文字幕第23页| 精品国产乱码久久久久久郑州公司| 狠狠色综合网站久久久久久久| 狠狠综合久久AV一区二区三区| 亚洲国产精品人久久| 久久久无码精品亚洲日韩按摩| 久久久久久亚洲精品无码| 国产91久久精品一区二区| 国产精品久久久久久久久久影院| 94久久国产乱子伦精品免费| 国产成人精品综合久久久| 欧美伊人久久大香线蕉综合69 | 欧美黑人激情性久久| 亚洲精品综合久久| 精品久久久久中文字幕一区| 人人狠狠综合久久亚洲婷婷| 一本久久知道综合久久| 久久久久久亚洲精品无码| 久久久久这里只有精品| 久久国产乱子精品免费女| a级成人毛片久久| 成人妇女免费播放久久久| 久久久久人妻一区精品性色av| 久久精品国产亚洲AV久| 色综合久久夜色精品国产| 久久久无码精品亚洲日韩京东传媒 | 久久久久人妻一区精品色| 久久综合九色综合网站|