OTL 4.0, OTL 流概念
OTL stream concept
任何 SQL 语句,PL/SQL 块 或者是存储过程调用都是用input/output[变量]表示。
Example 1. SELECT 语句有一个用于WHERE子句的标量的 input 变量。SELECT 语句同时定义了输出 列. 潜在的, 输出 列是矢量参数,因为SELECT语句可能返回多行。
Example 2. INSERT 语句往表中写数据, 即它有输入参数. UPDATE 语句亦是如此。
Example 3. DELETE 从表中删除行,需要输入删除标准,所有DELETE语句有输入参数。
Example 4.存储过程可能含有 input 和(或) output 参数。通常,存储过程的参数是标量。有一个特例:存储过程返回一个指针(cursor)(ORACL)或者是结果集(MSSQL、Sybase)。
Example 5. 任意一个 PL/SQL 块都可能有标量或矢量的输入输出 参数。
工业化数据库服务器有bulk (or array)操作:
- bulk INSERT
- bulk UPDATE
- bulk DELETE
- bulk SELECT
因此,如果语句在bulk中执行,INSERT/UPDATE/DELETE语句中的参数可能是矢量的。
The picture is clear: 使用SQL或程序上的扩展的任何交互,都可以看作是带输入输出流的黑盒。你可以不关心黑盒的内部工作(只需要依据黑盒的定义)。需要关注的是黑盒的输入输出线。
有些线路可能既是输入又是输出。
为什么不把数据流和SQL结合起来呢?这是为了避免使用多构造和产生太费解的数据库API。为什么不统一并简化他们?OTL的otl_stream class回答了这些问题。
由于SQL语句有可能在bulk中执行,所以otl_stream 是一个缓存的数据流.。从概念上讲,otl_stream有两个独立的缓冲:输入输出。输入缓存由所有的输入变量共同组成。同样的,输出缓存由所有的输出变量共同组成。
C++ 流 通常通过操作符 >> 和 <<操作。流的引用在操作符的左边。
s>>variable;
s<<variable;
两个箭头符号表示了数据流动的方向:
- >> -- 从流到数据容器(变量)
- << -- 从数据容器(变量)到流
OTL 流和缓存的C++流类似。SQL 语句或存储过程调用被当作初试缓存流打开。OTL 流操作和C++流操作保持一致。但有一个例外——the OTL 有独立的输入输出流而C++的可能重叠。
The OTL 流有一个flush函数用来在缓冲区满时刷新缓存和一组用来读写不同类型数据的>>和<<操作符。OTL流的最大优点是它针对SQL语句和任何类型的存储过程调用的统一接口。这就意味着应用程序开发者只需要记住很少几个类似他所熟悉的并正在使用的C++流的构造语法和函数名称。
在OTL流内部有一个小型解析器用来解析绑定变量及其类型的声明(declarations of bind variables and their data types)。没有必要声明C++主变量并用特别的绑定调用将它们和占位符绑定。所以必要的缓存都在流内部动态创建。流仅仅需要为读写数值将其打开。
OTL流需要用到OTL异常。即任何OTL流都潜在的会抛出otl_exception 类型的异常。为了截获异常并防止程序中断,请用相应try & catch 块包装OTL代码段。
otl_stream的功能及其自动化:当流所有的输入变量都定义了的时候(换句话说,所有的输入缓存都填满),它将触发黑盒里面的流执行。当黑盒里面的操作时输出缓存获取输出。执行完毕后输出的值可以从流中读取。如果是SELECT语句并且它返回了超出缓冲区大小的行集,在读完输出缓冲区后,流会自动获取输出缓存中剩下行集。