您的位置:首页 > 其它

OTL调用存储过程和函数

2009-08-11 10:29 267 查看
OTL简单介绍:

OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++操控关系数据库的模板库,最新版本4.0.104,参见http://otl.sourceforge.net/,下载地址http://otl.sourceforge.net/otlv4_h.zip
优点:a. 跨平台
b. 运行效率高,与C语言直接调用API相当
c. 开发效率高,起码比ADO.net使用起来更简单,更简洁
d. 部署容易,不需要ADO组件,不需要.net framework 等
缺点:
a. 只有C++才可以使用她
b. 说明以及范例不足(暂时性的)
总的说来,对于C++程序员而言,使用OTL操作关系数据库是最好的选择,其网站上有很多的范例,本人在这里对使用OTL调用Oracle的存储过程和存储函数(存储函数比存储过程多个返回值)作一个示范,而其他的比如查询、更新等在这里就不作介绍,直接看otl.sourceforge.net的范例 。

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 <string>
#include <iostream>
#define OTL_ORA9I // 使用这个宏就表示使用Oracle9i的API,而不是ODBC API;我这里就先用oci来演示
//#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<char[20], in>, :b<char[20], out>); end;";
otl_stream o_proc( 1, str_sql.c_str(), db );

o_proc<<p_a;
o_proc>>p_b;

cout <<"p_b = "<< p_b<< endl<<endl;

//演示调用存储函数并取返回值
int f_a = 1;
int f_b = 2;
int f_c = 0;
int f_d = 0;
// 注意下面字符串 和 上面的有什么不同?还要特别注意那个赋值符号 :=
str_sql = "begin :result<int,out> := FUNC_TEST(:a<int,in>, :b<int,inout>, :c<int,out>); end;";
otl_stream o_func(1, str_sql.c_str(), db);

o_func<<f_a<<f_b;
o_func>>f_d>>f_b>>f_c; // 注意顺序

cout<<"f_b = "<<f_b<<", f_c = "<<f_c<<", f_d = "<<f_d<<endl;

db.logoff();
}
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

备注:

更多例子请到 http://otl.sourceforge.net/otl3_examples.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: