Pro*C/C++(转)
2008-09-05 17:08:45| 分类: Pro*C | 标签: |字号大中小 订阅 [目录]
-------------------------------------------------------------------------------- 连接
在Pro*C/C++中能够使用如下的语句连接到Oracle数据库服务器:
EXEC SQL CONNECT :username IDENTIFIED BY:password [USING :server]; 或EXECSQL CONNECT : user_pwd [USING:server]; 参数说明如下:
·username:数据库用户名。 ·password:用户口令。
·server:连接到数据库。user_pwd:用户名及口令,二者必须用反斜杠(/)隔开 [目录]
-------------------------------------------------------------------------------- 断开
同连接相比,断开相对简单,只需将任何事务回滚,并释放内存、断开连接即可。在Pro*C/C++中可使用如下语句实现该功能:
EXEC SQL ROLLBACK [WORK] [RELEASE];
其中ROLLBACK起到回滚并结束事务,清除任何保存点的作用。RELEASE子句用于释放内存、断开连接。
我们通过编写函数disconnect来实现和数据库的断开。该函数的编写过程中,我们采用了以上介绍的断开数据库连接技术。
该函数无返回值,无参数。函数声明如下: void disconnect();
函数中实现断开数据库连接的代码为: EXEC SQL ROLLBACK WORK RELEASE; [目录]
-------------------------------------------------------------------------------- 动态SQL
在实际工作中,有时我们需要在运行应用程式时接收和处理不同的SQL语句,比如在该程式的功能函数中需要不同的select语句。因为这些SQL语是在程式运行时动态输入的,所以成为动态SQL语句。 动态SQL和静态SQL语句比较:
·静态SQL语句被内嵌到了源程式中,而动态SQL语句则是在应用程式运行时所输入的SQL语句,他被存储到了字符串变量中。因此使用动态SQL比静态SQL更灵活。
·使用动态SQL需要编写更加复杂的代码,而使用静态SQL只需将SQL语句内嵌到应用程式中就能够了。
·假如能够能够确定应用程式所要使用的SQL语句和他的结构,那么使用静态SQL,因为这样不但能够简化编程,而且应用程式的执行性能更好;而假如不能确定要执行何种SQL语句、宿主变量个数,宿主变量数据类型连同SQL语句所涉及到的数据对象,那么就要使用动态SQL。这样可使应用程式更加灵活,但程式编制更加复杂。
在Pro*C/C++应用程式中使用动态SQL共有四种方法:
·动态SQL方法一:适用于不包含宿主变量的SQL语句,并且不能是SELECT语句。 ·动态SQL方法二:适用于宿主变量个数已确定的SQL语句,并且不能是SELECT语句。 ·动态SQL方法三:适用于查询列表已确定的SQL语句。
·动态SQL方法四:适用于查询列表连同宿主变量个数均不能确定的SQL语句 [目录]
-------------------------------------------------------------------------------- 方法三
1.动态SQL方法三
本方法和动态SQL方法二比较类似。不同的是,方法三将PREPARE命令和游标命令结合起来使用。因此,本方法能够接收和处理SELECT语句。但在预编译时,必须要知道查询列表项的列数连同占位符的个数。数据库对象名(例如:表名和列名)能够在运行时指定,但数据库对象名不能是宿主变量。另外,也能够在运行时指定条件、分组连同排序子句。 使用动态SQL方法三的步骤如下: 1)使用PREPARE命令准备SQL语句
该命令用于命名和分析SQL语句。在分析了SQL语句后,能够使用EXECUTE语句多次执行该语句。PREPARE命令的语法如下:
EXEC SQL PREPARE statement_name FROM{:host_string|string_literal}; 参数说明如下:
·statement_name:语句名称,他是个标识符而不是宿主变量。 ·host_string:包含了SQL语句的宿主变量。 ·string_literal:包含了SQL语句的字符串。
2) 使用DECLARE命令定义游标 该命令语法如下:
DECLARE cursor_name CURSOR FORstatement_name; 参数说明如下:
·cursor_name:游标名。
·statement_name:步骤1中的SQL语句标识符。 3) 使用OPEN命令打开游标 该命令的语法如下:
OPEN cursor_name [USING host_variable_list] ; 参数说明如下:
·cursor_name:步骤2中的游标名。
·host_variable_list:宿主变量列表,使用该列表中的项替换SQL语句中的占位符。
需要注意的是,假如SQL语句不是SELECT语句,那么在执行了OPEN命令后即完成了SQL语句的执行,而无需执行FETCH语句。
4) 使用FETCH语句推进游标、检索数据 该语句的语法如下:
FETCH cursor_name INTO host_variable_list; 参数说明如下: cursor_name:游标名。
host_variable_list:宿主变量名列表,将检索到的数据保存到这些宿主变量中。 5) 使用CLOSE命令关闭游标 该命令语法如下: CLOSE cursor_name; [目录]
-------------------------------------------------------------------------------- 方法四
2.动态SQL方法四
使用本方法能够接收和处理各SQL语句,并且在预编译前无需知道查询列表项和输入宿主变量的占位符个数。因为输入宿主变量连同查询列表项的个数在运行应用程式前无法确定,所以需要为他们动态分配内存。为了完成这项认务,必须使用SQLDA结构。
SQLDA结构的作用是处理和保存查询列表项连同宿主变量占位符的信息。在动态方法四中输入宿主变量实际上并不是作为宿主变量使用,他们只是一些占位符,我们也将他称为绑定变量。关于SQLDA的相关知识请参阅第八章,这里不再累述。
应用方法四主要处理查询列表项或宿主变量个数未知的SQL语句。其基本步骤如下: 1)定义用于保存动态SQL语句的宿主字符串
应用程式需要使用宿主变量来存储动态SQL语句,这样就需要定义一个字符串宿主变量。 2)定义SQLDA
应用程式需要使用SQLDA结构来存储查询列表项连同占位符的信息,所以我们必须使用如下语句将该结构包含到应用程式中: EXEC SQL INCLUDE sqlda;
尔后还要定义指向查询描述区的指针。 3)为描述区分配内存
在定SQLDA结构后,为了使用查询描述区和绑定描述区,我们还必须使用函数sqlald()为他们分配内存。当分配描述区时,函数sqlald()会将V[0]到V[N-1]配置为0。该函数语法如下: descriptor_name=sqlald(max_vars,max_name,max_ind_name); 参数说明如下:
·max_vars:查询列表项或占位符的最大个数。
·max_name:查询列表项名称或占位符名称的最大长度。 ·max_ind_name:占位符指示变量名称的最大长度。
4)配置DESCRIBE命令所对应的查询列表项或占位符的最大个数
这一步用于配置DESCRIBE命令能够描述的查询列表项或占位符的最大个数。 5)将SQL语句存储到宿主字符串中
这一步用于接收SQL语句,并将SQL语句保存到宿主变量中。 6)使用PREPARE命令准备动态SQL语句 这一步用于命名和解析SQL语句。 7)使用DECLEAR命令定义游标
8)使用DESCRIBE命令获取绑定变量信息
DESCRIBE BIND VARIABLES命令用于将占位符信息存储到绑定描述区中。 9)重新配置占位符个数
这一步是将DESCRIBE命令获取到的实际占位符个数配置为变量N的值。 10)为绑定变量分配内存并输入数据

