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
#include
#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, :b); end;";
        otl_stream o_proc( 1, str_sql.c_str(), db );

        o_proc<         o_proc>>p_b;

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

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

        cout<<"f_b = "<         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

你可能感兴趣的:(C++)