OTL简单介绍:
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++操控关系数据库的模板库,采用这种方式访问数据库。
优点:a. 跨平台
b. 运行效率高,与C语言直接调用API相当
c. 开发效率高,起码比ADO.net使用起来更简单,更简洁
d. 部署容易,不需要ADO组件,不需要.net framework 等
缺点:
a. 只有C++才可以使用她
b. 说明以及范例不足(暂时性的)
总的说来,对于C++程序员而言,使用OTL操作关系数据库是最好的选择,本人在这里对使用OTL调用Oracle的存储过程和存储函数(存储函数比存储过程多个返回值)作一个示范,而其他的比如查询、更新等在这里就不作介绍。
Oracle 存储函数 FUNC_TEST 代码:
CREATE OR REPLACE FUNCTION FUNC_TEST(
a In Integer, b in out Integer, c out Integer)
Return Integer
is
d Integer;
begin
c := 10 * b;
d := a + b;
b := a;
Return d;
end;
/
说明:此函数有3个参数,a 是入参,b 是输出参数,c 是输入输出参数;此函数的返回值是 Integer 类型的,在存储函数执行完之后,倒数第二句返回 d 的值。
Oracle 存储过程 PROC_TEST 代码:
CREATE OR REPLACE PROCEDURE PROC_TEST
(a IN varchar2,b out varchar2)
IS
tmpVar NUMBER;
BEGIN
tmpVar := 0;
b := a;
EXCEPTION
WHEN NO_DATA_FOUND THEN
Null;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END PROC_TEST;
/
说明:此过程有2个参数,a 是varchar2类型的入参, b 是varchar2类型的输出参数;此过程中加入了异常处理块(不过这个过程太简单,似乎没有太大用处)。
C++调用以上两个过程和函数的代码:
#include
#include
#define OTL_ORA9I
//#define OTL_ODBC // 使用这个宏就表示使用通用的ODBC API
#include "otlv4.h"
using namespace std;
void main( void )
{
otl_connect::otl_initialize();
try
{
otl_connect db;
string str_sql = "";
db.rlogon( "user/password@testdb", 1); // 自动提交
//演示调用存储过程
char p_a[] = "192.168.1.1";
char p_b[20];
memset(p_b, 0, sizeof(p_b));
str_sql = "begin PROC_TEST(:a
otl_stream o_proc( 1, str_sql.c_str(), db );
o_proc<
cout <<"p_b = "<< p_b<< endl<
int f_a = 1;
int f_b = 2;
int f_c = 0;
int f_d = 0;
// 注意下面字符串 和 上面的有什么不同?还要特别注意那个赋值符号 :=
str_sql = "begin :result
o_func<
cout<<"f_b = "<
}
catch( otl_exception& p ) {
cerr << p.msg << "/n"
<< p.stm_text << "/n"
<< p.sqlstate << "/n"
<< p.var_info << "/n"
<< endl;
}
}
执行结果:
p_b = 192.168.1.1
f_b = 1, f_c = 20, f_d = 21