OTL调用存储过程和函数

来源:互联网 发布:nba2k16球员动作数据 编辑:程序博客网 时间:2024/05/21 14: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 存储函数 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

原创粉丝点击