频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

使用OTL调用Oracle的存储函数

来源: 作者: 出处:巧巧读书 2007-08-08 进入讨论组

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 存储函数 TEST 代码:
( a In Integer, b Out Integer, c in out Integer, d In Long ) Return Long
is
begin
    b := a;
    c := 2 * c;
    Return( '<' || d || '>' );
end;
说明:Oracle中的long不是C/C++中的长整型,而是varchar_long,对应着OTL中的otl_long_string,这是一种很复杂的类型,本人就用它来举例。

C++调用TEST的代码:
#include <string>
#include <iostream>
//#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<varchar_long,out> = call TEST(  :A<int,in>,:B<int,out>,:C<int,inout>,:D<varchar_long,in&g 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';

        //db.commit();
        db.logoff();
    }
    catch( otl_exception& p ) {
        cerr << p.msg << "\n"
            << p.stm_text << "\n"
            << p.sqlstate << "\n"
            << p.var_info << "\n"
            << endl;
    }
}

说明:"{ :E<varchar_long,out> = call TEST(  :A<int,in>,:B<int,out>,:C<int,inout>,:D<varchar_long,in&g t; ) }"这一句中的A、B、C、D、E就是一个名字,随各人喜欢可写成其他任何名称。但这个格式需要注意,它不是
"{ call :Name1<int,out> := function( Name2<int,in> }"
也不是
"{ call :Name1<int,out> \\:= function( Name2<int,in> }"
而是
"{ :Name1<int,out> = call function( Name2<int,in> }"
这一点和otl.sourceforge.net上的说明不一样。
打开: http://www.qqread.com/oracle/2007/08/u325137.html 更多文章 更多内容请看存储过程网络存储—光纤通道Oracle 10g基础应用专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章