长江七号电影动画版:OCCI基础教程(一)

来源:百度文库 编辑:九乡新闻网 时间:2024/07/14 13:25:04
2009-09-21

OCCI基础教程(一)

 

前几天,偶然知道了一个新名词:OCCI,这是虾米东东呢?找了时间看了一下,原来是一套oracle提供的访问oracle数据库的C++接口,用过微软数据库的朋友马上会联想到一个东西,那就是DAO,不错,这东西的原理和DAO是一样的,下面就让我们来看一下OCCI把。(DAO就是Data Access Object的缩写,也是一套访问数据库的库,IT界缩写词很多,有可能你在用着都不自知,这没有关系)

 

 

因为我是直接从oracle网站上查看的,在下面这个地址,有两个压缩包,里面包含了OCCI的演示代码,我们就从这里开始分析吧:

 

http://www.oracle.com/technology/global/cn/sample_code/tech/occi/index.html

 

我们可以先从第二个压缩包的内容开始看起,就是这个包:

 

occiplsql.tar.tar

 

我们下载之后,解压缩,包含三个文件,其中一个是

 

storedproc.cpp

 

我们就从她开始看吧。(其实这个文件是一个PL/SQL的演示程序,里面使用了三种执行存储过程的办法,下面就会讲到;另外,这个程序需要用到一些存储过程,在解压得到的occiplsql_readme.txt文件中有详细的描述,使用schema.sql在自己的数据库中创建存储过程,这里省略)

 

让我们一行一行代码来分析

 

 

 

首先,它调用了文件所需头文件:

 

Java代码

  1. #include    
  2. #include    
  3. #include    
  4.   
  5. #include   

  

 

 

 

 

这里最重要的就是occi.h了,这一看就是occi库文件的头文件,一般我们后面基本上都要导入这个头文件,无需赘言。

 

然后代码紧跟着的就是一个main()函数,让我们看一看下面的代码:

 

 

 

Java代码
  1. //initialize in object mode since we are accessing VARRAY types   
  2. Environment *env = Environment::createEnvironment(Environment::OBJECT);   
  3. Connection *conn = env->createConnection("scott","tiger");   
  4. Statement *stmt = conn->createStatement();  

 

 

 

这三段代码是调用OCCI的基础,初始环境,建立连接,并且创造一个Statement来对数据库进行操作。

 

 

下面看看他如何执行sql语句吧:

 

 

 

 

 

Java代码
  1. //create anonymous block for executing stored proc/function   
  2. stmt->setSQL("begin OCCIDEMO1.GetBookDetails(:1, :2, :3, :4, :5); end;");   
  3. int id = 1;//book to retrieve   
  4.   
  5. //pass IN parameters by setXXX(), indicate OUT parameters    
  6. //by registerOutParam   
  7. stmt->setNumber(1, id);//1 - IN - Id   
  8. stmt->registerOutParam(2, OCCISTRING, 100); //2 - OUT - title,max=100   
  9. stmt->registerOutParam(3, OCCIDOUBLE); //3 - OUT - price   
  10. stmt->registerOutParam(4, OCCIDATE); //4 - OUT - pubdate   
  11. stmt->registerOutParam(5, OCCIVECTOR, 0,   
  12.      "SCOTT.KEYWORDSLIST"); //5 - OUT - keywords(varray)   
  13.   
  14. stmt->execute(); //execute procedure  

 

 

很简单,不是吗?这里调用了存储过程,注册了几个输出函数。这些和.NET平台的存储过程调用很像,尤其跟JSP中的数据库调用很像(简直一摸一样)。注意,里面的输出函数调用了OCCI的变量,就是OCCISTRING,OCCIDOUBLE等等,以OCCI*形式的变量。

 

然后我们往下看:

 

Java代码
  1. //get the OUT parameters   
  2. string title = stmt->getString(2);   
  3. double price = stmt->getDouble(3);   
  4. Date pubdate = stmt->getDate(4); //OCCI Date class   
  5. vector keywords;   
  6. //there are overloaded getVector methods for each vector   
  7. getVector(stmt, 5, keywords);  

 

 

 

 

这里注释的很清楚,得到刚才我们定义的存储过程输出变量的输出值,我们只需从Statement中取出结果就行了,无需赘言。

 

然后下面执行了一些输出函数,打印我们的结果:

 

Java代码

  1. cout << "Book Details : " <<  title << " " << price << " " <<    
  2.      pubdate.toText() << endl;   
  3. cout << "Keywords : ";   
  • for (int i = 0 ; i < keywords.size(); i++)   
  •    cout << keywords[i] << ",";   
  • cout << endl;   
  •   
  • cout << "******Calling GetBookList******" << endl;