今天和一个朋友聊起来在网络游戏里面使用oracle数据库 。他们开发使用OTL,OTL是什么?
google了一下,查到一个文档:
http://otl.sourceforge.net/
使用OTL调用Oracle的存储函数
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上的说明不一样。
--------
一开始提出“狗年是从立春开始”观点的叶春生教授无疑是这场争论的焦点人物。昨天晚上,记者拨通他的电话时,他刚刚结束另一家媒体的采访,电话中的声音略显疲惫。
“我的观点很明确,春节是从农历正月初一开始算起,但算生肖必须从立春开始。”叶春生肯定地说,“其实这也不是什么新的观点了,你翻开任何一本皇历,上面都是这么标注的。”
叶春生告诉记者,春节在每年农历正月初一是近代才确定下来的。“1912年,孙中山先生宣布废除旧历,采用公历纪年。到了1914年,时任民国 大总统袁世凯颁布法令,规定每年农历正月初一为春节。在此之前,传统上以立春作为岁首,更早的时候也有过以冬至为岁首的情况。”
“因此,狗年应该是以立春为起点,因为立春在24节气中位列第一,表示春天的开始,也标志着新的一年的到来。”叶春生表示,“也因为这样,立春 不仅是一个节气,更是一个节日。古代帝王都会在立春这一天举行祭祀活动,以求新的一年国泰民安。而农历中像这样既是节气又是节日的很多,比如清明、冬至 等。”
一个农历年出现仨属相
因为有一个闰七月,农历今年有385天,除了年头上有一个立春以外,年尾腊月十七还有一个立春(2007年2月4日)。如果按照叶春生的观点,将会出现一个有趣的现象:农历今年出生的孩子有3种属相——正月初七前属鸡,正月初七到腊月十六属狗,腊月十七以后属猪。
“没错,类似这样‘两头春’的年份就会出现这样的情况。这种情况在农历中并不罕见,基本上十几年就会有一次。”叶春生说道,“如果再精确一点,农历正月初七7时25分以后出生的孩子才属狗,因为立春是在那一刻。”
“所以大家也要注意,除了年头有‘小鸡仔’,年尾还有一批‘小猪仔’出世。”叶春生笑道。