/****************************************************************************

** (c) Copyright IBM Corp. 2007 保留所有权利。

** 

** 以下源代码示例("示例")属于国际 

** 商业机器公司或其子公司之一(" IBM "),并且是 

** 有版权和许可证,不得出售。 您可以使用、复制、修改和 

** 在不向 IBM 付费的情况下,以任何形式分发样品,目的是 

** 协助您开发应用程序。

** 

** 示例代码是在 "原样 "的基础上提供给您的,不对以下方面作出保证 

** 任何一种。 IBM 在此,本公司明确声明不作任何保证,无论是明示的还是 

** 隐含保证,包括但不限于以下隐含保证 

** 适销性和特定用途的适用性。 一些辖区确实 

** 不允许排除或限制默示保证,因此上述 

** 限制或排除条款可能不适用于您。 IBM SHALL NOT BE LIABLE FOR 

** 您因使用、复制、修改或执行以下行为而遭受的任何损失 

** 分发样品,即使 IBM 已被告知可能出现以下情况 

** 此类损害赔偿。

*****************************************************************************

**

** 源文件名称: dbpkg.sqC 

**    

** 示例:如何使用软件包 

**

** DB2 使用的应用程序接口:

** sqlaprep -- 预编译程序

** sqlabndx -- BIND

** sqlarbnd -- 重定向软件包

**

** 使用的 sql 语句:

* * 降级包 

**

**                           

*****************************************************************************

**

** 有关示例程序的更多信息,请参阅 README 文件。

**

** 有关开发嵌入式 SQL 应用程序的信息,请参阅《开发嵌入式 SQL 应用程序》一书。

**

** 有关使用 SQL 语句的信息,请参阅《SQL 参考》。

**

** 有关 DB2 API 的信息,请参阅《管理 API 参考》。

**

** 有关编程、编译和运行的最新信息 DB2

** 申请请访问 DB2 信息中心,网址为

**     http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp

****************************************************************************/



#include <string.h>

#include <sql.h>

#include <sqlenv.h>

#include <sqlutil.h>

#include " utilemb.h "

#if ((__cplusplus >= 199711L ) &&!定义了 DB2HP &&!定义了 DB2AIX )|| \

    ( DB2LINUX && ( __LP64__ || (__gnuc__ >= 3)) ) )

   #include <iostream>

   using namespace std; 

#else

   #include < iostream.h >

#endif



类 DbPkg

{

  public:

    int BndFileCreate(char *);

    int PackageCreate(char *);

    int PackageRefresh(char *);

    int PackageDrop( );

};



int DbPkg::BndFileCreate(char *sourceFileBaseName )

{

  struct sqlca sqlca;

  char sourceFileName[8 + 1 + 3 + 1];

  char msgFileName[8 + 1 + 3 + 1];

  结构 sqlopt *pPrecompileOptions;

  struct sqloptions *optionsArray;



  cout << "\n-----------------------------------------------------------";

  cout << ""\nUSE THE DB2 API:" << endl;

  cout << " sqlaprep -- PRECOMPILE PROGRAM" << endl;

  cout << "TO CREATE A BIND FILE." << endl;



  // 创建软件包

  strcpy( sourceFileName, sourceFileBaseName );



#if (defined( DB2NT ))

  strcat( sourceFileName, ".sqx");

#else // UNIX

  strcat( sourceFileName, ".sqC" );

#endif



  strcpy( msgFileName, sourceFileBaseName );

  msgFileName[6 ] = '\0'; // 截断至 6 个字符

  strcat( msgFileName, " _p.msg "); // _p = 预编译



  cout << "\n Create the bind file." << endl;

  cout << " 源文件名 : " << sourceFileName << endl;

  cout << " 绑定文件名 : " << sourceFileBaseName << ".bnd" << endl;

  cout << " 消息文件名: " << msgFileName << endl;



  // 对于 1 个选项,不需要更多的 struct sqloptions,因为

  // struct sqlopt 已经包含一个

  pPrecompileOptions = new sqlopt[1];



  pPrecompileOptions->header.allocated = 1; // 选项数量

  pPrecompileOptions->header.used = 1;



  optionsArray = pPrecompileOptions->option;

  optionsArray[0 ].type = SQL_BIND_OPT;

  optionsArray[0 ].val = 0; // 创建默认 bnd 文件



  // 预编译程序

  sqlaprep( sourceFileName, msgFileName, pPrecompileOptions, &sqlca);

  DB2_API_CHECK( "Bnd文件--创建");



  // 释放分配的内存

  删除 [] pPrecompileOptions;



  return 0;

} //DbPkg::BndFileCreate



int DbPkg::PackageCreate(char *sourceFileBaseName )

{

  struct sqlca sqlca;

  char bndFileName[8 + 1 + 3 + 1];

  char msgFileName[8 + 1 + 3 + 1];

  结构 sqlopt *pBindOptions;

  struct sqloptions *optionsArray;



  cout << "\n-----------------------------------------------------------";

  cout << ""\nUSE THE DB2 API:" << endl;

  cout << " sqlabndx -- BIND" << endl;

  cout << "TO CREATE A PACKAGE." << endl;



  // 创建软件包

  strcpy( bndFileName, sourceFileBaseName );

  strcat( bndFileName, ".bnd");

  strcpy( msgFileName, sourceFileBaseName );

  msgFileName[6 ] = '\0'; // 截断至 6 个字符

  strcat( msgFileName, " _b.msg "); // _b = bind



  cout << "\n Create the package." << endl;

  cout << " 绑定文件名 : " << bndFileName << endl;

  cout << " 软件包名称 : " << sourceFileBaseName << endl;

  cout << " 消息文件名: " << msgFileName << endl;



  // 对于 2 个选项,还需要一个 struct sqloptions,因为

  // struct sqlopt 已经包含一个

  pBindOptions = new sqlopt[2];



  pBindOptions->header.allocated = 2; // 选项数量

  pBindOptions->header.used = 2;



  optionsArray = pBindOptions->option;

  optionsArray[0 ].type = SQL_BLOCK_OPT;

  optionsArray[0 ].val = SQL_BL_ALL; // 游标阻塞 = 全部阻塞

  optionsArray[1 ].type = SQL_ISO_OPT;

  optionsArray[1 SQL_CURSOR_STAB; // isol. 水平 = 光标移动。



  // 调用绑定工具

  sqlabndx( bndFileName, msgFileName, pBindOptions, &sqlca);

  DB2_API_CHECK( "软件包 -- 创建");



  // 释放分配的内存

  删除 [] pBindOptions;



  return 0;

} //DbPkg::PackageCreate



int DbPkg::PackageRefresh(char *sourceFileBaseName )

{

  struct sqlca sqlca;

  char packageName[8 + 1];

  结构 sqlopt *pRebindOptions;



  cout << "\n-----------------------------------------------------------";

  cout << ""\nUSE THE DB2 API:" << endl;

  cout << " sqlarbnd -- 重定向软件包" << endl;

  cout << "TO REFRESH A PACKAGE." << endl;



  // 刷新软件包

  pRebindOptions = NULL;

  strcpy( packageName, sourceFileBaseName );

  cout << "\n 刷新软件包:" << packageName << endl;



  // 重新绑定 - 重新创建存储在数据库中的软件包,而不使用 

  // 需要绑定文件

  sqlarbnd( packageName, &sqlca, pRebindOptions );

  DB2_API_CHECK( "软件包 -- 刷新");



  return 0;

} //DbPkg::PackageRefresh



int DbPkg::PackageDrop( )

{

  struct sqlca sqlca;



  cout << "\n-----------------------------------------------------------";

  cout << ""\nUSE THE SQL STATEMENT:" << endl;

  cout << " DROP " << endl;

  cout << "TO DROP A PACKAGE." << endl;



  // 删除软件包

  cout << "\n 执行语句" << endl;

  cout << " DROP PACKAGE dbconn" << endl;



  EXEC SQL DROP PACKAGE dbconn;

  EMB_SQL_CHECK("Package -- Drop");



  return 0;

} //DbPkg::PackageDrop



int main(int argc, char *argv[])

{

  int rc = 0;

  CmdLineArgs 检查;

  DbPkg 包

  DbEmb db;



  char sourceFileBaseName[8 + 1];



  // 检查命令行参数

  rc = check.CmdLineArgsCheck1(argc, argv, db);

  如果 (rc!= 0)

  {

    return rc;

  }



  strcpy( sourceFileBaseName, "dbconn");



  cout << ""\nTHIS SAMPLE SHOWS HOW TO WORK WITH PACKAGES." << endl;



  // 连接到数据库

  rc = db.Connect ();

  如果 (rc!= 0)

  {

    return rc;

  }



  rc = pkg.BndFileCreate(sourceFileBaseName );

  rc = pkg.PackageCreate(sourceFileBaseName );

  rc = pkg.PackageRefresh(sourceFileBaseName );

  rc = pkg.PackageDrop( );



  // 从数据库断开连接

  rc = db.Disconnect ();

  如果 (rc!= 0)

  {

    return rc;

  }



  return 0;

}//main