当前位置: 首页 > 工具软件 > OTL > 使用案例 >

oracle otl,使用OTL调用Oracle的存储函数

双志强
2023-12-01

OTL介绍:

OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++操控关系数据库的模板库,最新

版本4.0.104,参见,下载地址otlv4_h.zip。

优点:a. 跨平台

b. 运行效率高,与C语言直接调用API相当

c. 开发效率高,使用起来更简单,更简洁

d. 部署容易,不需要ADO组件, framework 等

缺点:

a. 只有C++才可以使用她

b. 说明以及范例不足(暂时性的)

总的说来,对于C++程序员而言,使用OTL操作关系数据库是最好的选择,其网站上有很多的范例,本人在这

里对使用OTL调用Oracle的存储函数(存储函数比存储过程多个返回值)作一个

示范,而其他的比如查询、更新、存储过程等就太简单了,直接看的范例。

Oracle 存储函数 TEST 代码:

( a In Integer, b Out Integer, c in out Integer, d In Long ) Return Long

is

begin

b := a;

c := 2 * c;

Return( '' );

end;

说明:Oracle中的long不是C/C++中的长整型,而是varchar_long,对应着OTL中的otl_long_string,这是一

种很复杂的类型,本人就用它来举例。

C++调用TEST的代码:

#include

#include

//#define OTL_ORA9I // 使用这个宏就表示使用Oracle9i的API,而不是ODBC API

#define OTL_ODBC    // 使用这个宏就表示使用通用的ODBC API

#include "otlv4.h"

using namespace std;

void main( void )

{

otl_connect::otl_initialize();

try {

otl_connect db;

db.rlogon( "Driver={Microsoft ODBC for

Oracle};Server=ZZZ;Uid=XXX;Pwd=YYY;" );

// db.set_max_long_size(?); 如果varchar_long长

度非常长,超过默认值的话,你需要这一句

otl_stream o( 1, "{

:E = call

TEST(  :A,:B,:C,:D

t; ) }", db );

o.set_commit(0);

int a = 1;

int b = 0;

int c = 2;

otl_long_string d( "abc", 0, 3 );

otl_long_string e;

o << a << c << d;

o >> e >> b >> c;

cout << "b = " <<

b   << '\n';

cout << "c = " <<

c   << '\n';

cout << "e = " << e.v

<< '\n';

//mit();

db.logoff();

}

catch( otl_exception& p ) {

cerr << p.msg << "\n"

<< p.stm_text

<< "\n"

<< p.sqlstate

<< "\n"

<< p.var_info

<< "\n"

<< endl;

}

}

说明:"{ :E = call

TEST(  :A,:B,:C,:D

t; ) }"这一句中的A、B、C、D、E就是一个名字,随各人喜欢可写成其他任何名称。但这个格式需要注

意,它不是

"{ call :Name1 := function( Name2 }"

也不是

"{ call :Name1 \\:= function( Name2 }"

而是

"{ :Name1 = call function( Name2 }"

这一点和上的说明不一样。

评论列表

非凡2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

星星也用上了OTL,感觉怎么样?

firingme2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

OTL和DTL都是ODBC Based的,感觉不好。用过DTL,很烦琐。DTL是模拟STL,而OTL是模拟iostream,都是C++的经典设计。不过都是没学到人家的精髓。

周星星2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

to 非凡:

^_^,感觉还不错,第一次使用OTL,第一次使用Oracle,第一次调用存储函数,但仍然算很顺利,其间问题主要出在Oracle身上。

to firingme:

从源代码上看OTL也可以直接调用Oracle和DB2的API,只要更改一个宏;DTL没听说过;“没学到人家的精髓”---有一点点赞同,我觉得otl_long_string设计得就有点不科学,呵呵!

firingme2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

这种东西,等boost的吧。其他人开发的,我不敢用。boost1.33里头已经加入了iostreams,相信马上针对数据库和网络的stream类型全部都要冒出来了……OTL和DTL的确不算什么好东西,我宁愿自己写几个简单的包装类用起来更舒坦。

cc54162013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

请问星星,你在windows底下用otl,都需要什么配置呀,我怎么编译可以通过,但运行出现

Error while trying to retrieve text for error ORA-12154

周星星2013-1-17 23:03:00

to cc5416:

不知道为什么,我什么也没有设置呀!

cc54162013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

在我的机器上#define OTL_ORA8I程序异常

只有使用#define OTL_ODBC才能运行

还有关于查询的,星星有没有好例子呀?

我怎么都调不通呢

cc5416(愤怒的话梅)2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

汗自己,写出来了

BlueICE2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

我最反感一些人说别人的东西如何如阿不好,还不如自己如何如何,你能写出这样的创意的东西还公布源代码吗,你不行,至少你没有这样作过,那么你没有权利说这样的话。再者,也许你会作,但你会如此执着的写这样长的代码,我觉的作这样的工作值得我们尊敬,同样一些使用这个库的朋友link oci.lib都没有加,想想我们国家的计算机水平,当然我也曾经这样。所以我们没有什么理由说如何如何,如果你觉得不好,只能证明你没有好好的去用,OciClasses你用过吗,这个东西比起OTL可以说差远了,但CodeGuru的网上还有很多人感谢OciClasses的作者!谦虚,一些未尝不是一件好事!

七猫的垃圾箱2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

to:firingme

写好后能OPEN吗?我很期待,因为我觉得在方便上,DTL和OTL都很方便了,虽然DTL效率可能是有些问题,不过既然DTL全基于ODBC,效率不会成为瓶颈,

OTL是使用的ORACLE和DB2的原生API,ODBC的支持是后来才加入的,一个头文件5万多行吧,可以去看看此人简历。

吴春福2013-1-17 23:03:00

请教如何把取出的字段都以字符串输入

我现在用otl从oracle取出数据,但由于收到的sql语句是动态的,所以我无法先确定字段的属性,请教各位高人,如何把取出的字段都以字符串输入

我从一些网站上找到一些如下的代码,但看不懂,请教有没有中文解释改类的使用及参数的使用

otl_stream i;

i.set_all_column_types(otl_all_num2str );

gdb.set_max_long_size(20000);    //read long longraw

string f1;

char f2[200];

string f10;

otl_value f3;

otl_column_desc* desc;

int desc_len;

i.open(1, sqlstr.c_str(),gdb);

desc=i.describe_select(desc_len);

雅木2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

现在要写一个程序同时连接oracle 7\8\9,由于几乎都是基于oci的,而3个版本的oci的dll和lib是不一样的,所以不知道该怎么做了,请楼上的各位大哥,大伸援手,不吝赐教.~~

小山坡2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

otl_stream类构造函数的第一参数otl_stream(const int arr_size,

这个参数有什么作用?详细一点

小山坡2013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

otl的例子1中

create table test_tab(f1 number, f2 varchar2(30))

insert into test_tab values(:f1,:f2)

为何insert语句中 :f1 中只能是float,不能是int, double,

long?????

dayn92013-1-17 23:03:00

re: 使用OTL调用Oracle的存储函数

感觉......他咋就不像做数据库的呢?

发表评论

您还没有登录,请[登录]或[注册]

 类似资料: