任何SQL语句,PL / SQL块或存储过程调用的特点是它的输入/输出[变量]。
例1:一个SELECT语句把标量的输入变量作为WHERE子句部分的条件;同时SELECT部分则定义了输出的字段,并且在结果集为多行的情况下还是一个VECTOR结构。
例2:INSERT语句写入到一个表中的数据,也就是说,它有输入参数。同样是真正的UPDATE语句。
例3:一个删除语句从表中删除数据。删除的条件同样需要输入,因此DELETE 语句也要输入。
例4:一个存储过程可能有输入或者输出参数,通常,存储过程的参数是标量。但是有特例,存储过程在oracle忠返回一个引用游标,在MS SQL Server 和 Sybase返回的是结果集
例5:一个多功能的SQL语句块则有可能具有标量或矢量的输入与输出参数。
专业的程序里面往往有大量的SQL操作,如大量的:
所以参数对于SQL语句来讲,都可以理解为VECTOR的类型。
下面的图示表示的非常清楚。对于任何的SQL语句或语句块存储过程等,这些SQL都可以作为一个黑盒子一样。它们的输入与输出总是具有VECTOR类型。
Some of the wires may be both input and output.
为什么不整合数据流和SQL呢?相反,而是通过复杂的结构和和调用复杂的一些数据库的API呢?为什么统一和简化他们呢?OTL给了你答案,答案就是otl_stream class.
SQL语句在执行的时候,通过otl_strea对数据进行操作,otl_stream是一个缓冲流,它包括输入与输出两个缓冲区。输入缓冲区用来存放输入参数,输出缓冲区用来存放输出参数。
C++流通常通过操作操作符 >>和<<来使用,_stream同样也重载了这两个符号用来处理输入与输出数据。
s>>variable; s<<variable;
两个箭头的方向表示了数据流的流向
OTL的流与C++的流类似。一个SQL语句或存储过程打开的时候通过一个普通的缓冲流,OTL的逻辑SQL语句部分还是保留。OTL的流把输入与输出缓冲区分开处理。
The OTL stream中有个刷新的函数,刷新他的输入缓冲区当缓冲区满的时候或是重新读取或写入数据的时候,就通过该刷新操作把重新刷新缓冲区的数据。更重要的是OTL的流具有相当简单的接口,对于熟悉C++流的你来说,只要记住简单的几个操作即可。
在OTL流内部有一个简单的变量解析器。所以不需要绑定变量的时候指定变量类型与占位符,所有这些都在OTL流内部动态的处理。OTL流仅需要打开进行读和写。
OTL流可能会抛出otl_exceptionr的异常,所以为了避免程序core down需要在处理OTL流的时候,用try…catch…语句块把相关代码包含起来。
OTL流的数据处理是自动的。当所有的输入变量全部定义后,它就自动的触发SQL去执行,并把输出填到输出缓冲区里面。此时输出就可以去缓冲区里面读取数据。如果缓冲区里面的数据满了后,还有数据未读出,则等等读取缓冲区数据后,再去取其他部分的数据。(如缓冲区只能容1000行数据,但某次SELECT取出了2000条数据,则先取出1000条后,如果缓冲区数据被程序取出后,OTL再自动的去取另外的1000条数据填进缓冲区里面。)
原文地址:http://otl.sourceforge.net/otl3_str.htm