OTL调用存储过程和函数

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个参数,是入参,是输出参数,是输入输出参数;此函数的返回值是 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个参数,varchar2类型的入参, b varchar2类型的输出参数;此过程中加入了异常处理块(不过这个过程太简单,似乎没有太大用处)。

 C++调用以上两个过程和函数的代码:
#include <string>
#include <iostream>
#define OTL_ORA9I     
 // 使用这个宏就表示使用Oracle9iAPI,而不是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值