原文地址: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指令,并且输出缓冲区不足以容纳所有的输出结果时,当输出缓冲区被读取完毕后,流会自动的将下一批结果集填充至输出缓冲区。