OTL 4.0, OTL 数据流概念(2010.4.23更新)

本文介绍了OTLstream的概念及其在批量SQL操作中的应用。OTLstream作为一种缓冲流,能够简化数据库API的使用,支持批量INSERT、UPDATE等操作。文章还解释了OTLstream如何通过输入/输出缓冲区管理数据流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 原文地址:http://otl.sourceforge.net/otl3_str.htm

OTL stream的概念


    任何SQL指令,PL/SQL块或存储过程调用都通过其输入/输出[变量]来表现其各自的特色。

示例1:一个SELECT指令在其WHERE语句中标定了输入变量,并且也定义了输出列。这意味着输出列为列向量,因为SELECT指令可能返回多行。
示例2:一个INSERT指令向一个表写入数据,例如:它有输入参数。UPDATA也是如此。
示例3:一个DELETE指令从一个表中删除行,标准的删除语句需要输入,因此DELETE指令也有输入参数。
示例4:一个存储过程可能有输入和(或)输出参数。通常,存储过程的参数是游标,这是个特例。然而:存储过程返回一个引用游标(Oracle)或结果集(MS SQL Server or Sybase)。
示例5:一个任意的PL/SQL块可能有输入和(或)输出参数,这个参数可能是游标,也可能是向量


工业标准的数据库有批量操作:

  • bulk INSERT
  • bulk UPDATE
  • bulk DELETE
  • bulk SELECT
  • 因此,执行批量操作的INSERT/UPDATE/DELETE指令其参数可能是向量。

    下图清晰的表现出了:任何与SQL或其程序性扩展的交互作用都可看成是一个带有输入/输出的黑箱。不管黑箱里面是什么(依照黑箱的定义),也不管通过输入(输出)信号线向盒子里发送(接收)的信号是什么

    一些信号线可能是双向的。

    为什么不将数据流这个概念和SQL接合起来呢?替换掉这些成倍增长的构造过程和越来越让人费解的数据库API?为什么不让它们统一起来,并且简单化?OTL回答了这些问题,答案就是otl_stream class.

    因为一个SQL指令可能是以批量形式完成的,故otl_stream是一个缓冲流。从概念上讲,otl_stream分为两个缓冲区:输入和输出缓冲区。输入缓冲区由所有的存放在一起的输入变量组成;相应地,输出缓冲区也由所有的存放在一起的输出变量组成。
    C++
    数据流通常通过>><<操作符进行操控。这种流操作涉及的是左操作符:
       s>>variable;
       s<<variable;
    双箭头符号指定了数据的流向

    ·  >> -- 从数据流到变量容器中

    · << --  从变量容器到数据流中

    OTL流类似于C++的数据缓冲流,一个SQL指令或存储过程可以像普通的缓冲流那样打开。OTL流操作的逻辑流程与C++流操作一致,只有一个例外--OTL将输入与输出缓冲区分开了,这些缓冲区可能是递归的。

        OTL流有一个flush函数,用于当输入缓冲区满时提交数据并清除缓冲区,还有一系列用于读写不同数据类型对象的>><<操作符集。对不同类型的SQL指令和存储过程调用提供统一的接口是OTL流最大的优势。这就是说应用程序开发者只需要记住的是一些语义概念和函数名称,而这些早在开始用C++流工作时就已经熟知了。

        OTL流内部有一个用来解析declarations of bind variables and their data types的小型解析器。不必要去预先声明众多的C/C++变量,通过一些特殊的函数绑定调用将他们与占位符进行绑定。OTL流会动态创建所必须的缓冲区。对值进行读写时只要打开流就可以了。

        OTL流的接口使用了OTL异常规范。这就是说任何OTL流操作都可能会抛出otl_exception类型的异常。为了获取异常和防止程序异常终止,请将OTL流操作代码用try & catch代码块包装起来。

        otl_stream机制自动化程度很高:当流中所有的输入变量定义完后(换句话说,输入缓冲区填充完毕后),流中的阻塞区块就会自动的触发执行。在阻塞区块执行的过程中输出缓冲区也将会填充。执行完毕后,我们就可以从流中读取输出结果。如果是在执行一个SELECT指令,并且输出缓冲区不足以容纳所有的输出结果时,当输出缓冲区被读取完毕后,流会自动的将下一批结果集填充至输出缓冲区。 

     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值