⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5.html

📁 介绍linux下文件和设备编程
💻 HTML
📖 第 1 页 / 共 3 页
字号:
在Pro*C/C++中可以使用如下的语句连接到Oracle数据库服务器:<p>EXEC SQL CONNECT :username IDENTIFIED BY:password [USING :server];<p>或EXECSQL CONNECT : user_pwd [USING:server];<p>参数说明如下:<p>&nbsp;&nbsp;&nbsp; &middot;username:数据库用户名。<p>&nbsp;&nbsp;&nbsp; &middot;password:用户口令。<p>&nbsp;&nbsp;&nbsp; &middot;server:连接到数据库。user_pwd:用户名及口令,二者必须用反斜杠(/)隔开<p><br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I223" ID="I223"></A><center><b><font size=+2>断开</font></b></center><br>同连接相比,断开相对简单,只需将所有事务回滚,并释放内存、断开连接即可。在Pro*C/C++中可使用如下语句实现该功能:<p>EXEC SQL ROLLBACK [WORK] [RELEASE];<p>其中ROLLBACK起到回滚并结束事务,清除所有保存点的作用。RELEASE子句用于释放内存、断开连接。<p>我们通过编写函数disconnect来实现与数据库的断开。该函数的编写过程中,我们采用了以上介绍的断开数据库连接技术。<p>该函数无返回值,无参数。函数声明如下:<p>void disconnect();<p>函数中实现断开数据库连接的代码为:<p>EXEC SQL ROLLBACK WORK RELEASE;<p><p><br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I224" ID="I224"></A><center><b><font size=+2>动态SQL</font></b></center><br>&nbsp;&nbsp;&nbsp; 在实际工作中,有时我们需要在运行应用程序时接收和处理不同的SQL语句,比如在该程序的功能函数中需要不同的select语句。因为这些SQL语是在程序运行时动态输入的,所以成为动态SQL语句。<p>动态SQL与静态SQL语句比较:<p>&nbsp;&nbsp;&nbsp; &middot;静态SQL语句被内嵌到了源程序中,而动态SQL语句则是在应用程序运行时所输入的SQL语句,它被存储到了字符串变量中。因此使用动态SQL比静态SQL更灵活。<p>&nbsp;&nbsp;&nbsp; &middot;使用动态SQL需要编写更加复杂的代码,而使用静态SQL只需将SQL语句内嵌到应用程序中就可以了。<p>&nbsp;&nbsp;&nbsp; &middot;如果能够能够确定应用程序所要使用的SQL语句和它的结构,那么使用静态SQL,因为这样不仅可以简化编程,而且应用程序的执行性能更好;而如果不能确定要执行何种SQL语句、宿主变量个数,宿主变量数据类型以及SQL语句所涉及到的数据对象,那么就要使用动态SQL。这样可使应用程序更加灵活,但程序编制更加复杂。<p>在Pro*C/C++应用程序中使用动态SQL共有四种方法:<p>&nbsp;&nbsp;&nbsp; &middot;动态SQL方法一:适用于不包含宿主变量的SQL语句,并且不能是SELECT语句。<p>&nbsp;&nbsp;&nbsp; &middot;动态SQL方法二:适用于宿主变量个数已经确定的SQL语句,并且不能是SELECT语句。<p>&nbsp;&nbsp;&nbsp; &middot;动态SQL方法三:适用于查询列表已经确定的SQL语句。<p>&nbsp;&nbsp;&nbsp; &middot;动态SQL方法四:适用于查询列表以及宿主变量个数均不能确定的SQL语句<center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I225" ID="I225"></A><center><b><font size=+2>方法三</font></b></center><br>1.动态SQL方法三<p>&nbsp;&nbsp;&nbsp; 本方法与动态SQL方法二比较类似。不同的是,方法三将PREPARE命令与游标命令结合起来使用。因此,本方法可以接收和处理SELECT语句。但在预编译时,必须要知道查询列表项的列数以及占位符的个数。数据库对象名(例如:表名和列名)可以在运行时指定,但数据库对象名不能是宿主变量。另外,也可以在运行时指定条件、分组以及排序子句。<p>使用动态SQL方法三的步骤如下:<p>1)使用PREPARE命令准备SQL语句<p>该命令用于命名和分析SQL语句。在分析了SQL语句后,可以使用EXECUTE语句多次执行该语句。PREPARE命令的语法如下:<p>EXEC SQL PREPARE statement_name FROM{:host_string|string_literal};<p>参数说明如下:<p>&nbsp;&nbsp;&nbsp; &middot;statement_name:语句名称,它是一个标识符而不是宿主变量。<p>&nbsp;&nbsp;&nbsp; &middot;host_string:包含了SQL语句的宿主变量。<p>&nbsp;&nbsp;&nbsp; &middot;string_literal:包含了SQL语句的字符串。<p>2) 使用DECLARE命令定义游标<p>该命令语法如下:<p>DECLARE cursor_name CURSOR FORstatement_name;<p>参数说明如下:<p>&nbsp;&nbsp;&nbsp; &middot;cursor_name:游标名。<p>&nbsp;&nbsp;&nbsp; &middot;statement_name:步骤1中的SQL语句标识符。<p>3) 使用OPEN命令打开游标<p>该命令的语法如下:<p>OPEN cursor_name [USING host_variable_list] ;<p>参数说明如下:<p>&nbsp;&nbsp;&nbsp; &middot;cursor_name:步骤2中的游标名。<p>&nbsp;&nbsp;&nbsp; &middot;host_variable_list:宿主变量列表,使用该列表中的项替换SQL语句中的占位符。<p>需要注意的是,如果SQL语句不是SELECT语句,那么在执行了OPEN命令后即完成了SQL语句的执行,而无需执行FETCH语句。<p>4) 使用FETCH语句推进游标、检索数据<p>该语句的语法如下:<p>FETCH cursor_name INTO host_variable_list;<p>参数说明如下:<p>cursor_name:游标名。<p>host_variable_list:宿主变量名列表,将检索到的数据保存到这些宿主变量中。<p>5) 使用CLOSE命令关闭游标<p>该命令语法如下:<p>CLOSE cursor_name;<p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I226" ID="I226"></A><center><b><font size=+2>方法四</font></b></center><br>2.动态SQL方法四<p>&nbsp;&nbsp;&nbsp; 使用本方法可以接收和处理各SQL语句,并且在预编译前不需要知道查询列表项和输入宿主变量的占位符个数。因为输入宿主变量以及查询列表项的个数在运行应用程序前无法确定,所以需要为它们动态分配内存。为了完成这项认务,必须使用SQLDA结构。<p>&nbsp;&nbsp;&nbsp; SQLDA结构的作用是处理和保存查询列表项以及宿主变量占位符的信息。在动态方法四中输入宿主变量实际上并不是作为宿主变量使用,它们只是一些占位符,我们也将它称为绑定变量。关于SQLDA的相关知识请参阅第八章,这里不再累述。<p>应用方法四主要处理查询列表项或宿主变量个数未知的SQL语句。其基本步骤如下:<p>1)定义用于保存动态SQL语句的宿主字符串<p>应用程序需要使用宿主变量来存储动态SQL语句,这样就需要定义一个字符串宿主变量。<p>2)定义SQLDA<p>应用程序需要使用SQLDA结构来存储查询列表项以及占位符的信息,所以我们必须使用如下语句将该结构包含到应用程序中:<p>EXEC SQL INCLUDE sqlda;<p>尔后还要定义指向查询描述区的指针。<p>3)为描述区分配内存<p>在定SQLDA结构后,为了使用查询描述区和绑定描述区,我们还必须使用函数sqlald()为它们分配内存。当分配描述区时,函数sqlald()会将V[0]到V[N-1]设置为0。该函数语法如下:<p>descriptor_name=sqlald(max_vars,max_name,max_ind_name);<p>参数说明如下:<p>&nbsp;&nbsp;&nbsp; &middot;max_vars:查询列表项或占位符的最大个数。<p>&nbsp;&nbsp;&nbsp; &middot;max_name:查询列表项名称或占位符名称的最大长度。<p>&nbsp;&nbsp;&nbsp; &middot;max_ind_name:占位符指示变量名称的最大长度。<p>4)设置DESCRIBE命令所对应的查询列表项或占位符的最大个数<p>这一步用于设置DESCRIBE命令可以描述的查询列表项或占位符的最大个数。<p>5)将SQL语句存储到宿主字符串中<p>这一步用于接收SQL语句,并将SQL语句保存到宿主变量中。<p>6)使用PREPARE命令准备动态SQL语句<p>这一步用于命名和解析SQL语句。<p>7)使用DECLEAR命令定义游标<p>8)使用DESCRIBE命令获取绑定变量信息<p>DESCRIBE BIND VARIABLES命令用于将占位符信息存储到绑定描述区中。<p>9)重新设置占位符个数<p>这一步是将DESCRIBE命令获取到的实际占位符个数设置为变量N的值。<p>10)为绑定变量分配内存并输入数据<p>如果存在绑定变量占位符,那么应用程序必须为其赋值并分配内存。<p>11)打开游标<p>12)使用DESCRIBE命令获取查询列表信息<p>如果动态SQL语句是SELECT语句,我们还必须使用DESCRIBE SELECT LIST命令将查询列表项的信息存储到查询描述区中。另外需要注意两点:<p>&nbsp;&nbsp;&nbsp; &middot;该命令将F设置为实际的查询列表数,如果SQL语句不是SELECT语句,则变量F被设置为0。<p>&nbsp;&nbsp;&nbsp; &middot;NUMBER值长度不可用,必须使用函数sqlprc()获取精度和标度。<p>13)重新设置查询列表项<p>这一步用于将DESCRIBE命令获取到的实际查询列表项个数设置为查询列表项的最大个数。<p>14)重新设置每个查询列表项的长度和数据类型<p>在使用FETCH命令获取查询列表项数据前,为显示结果可能需要重新设置某些元素的长度和数据类型。<p>15)利用FETCH命令检索数据<p>执行此命令后,数据被存储到了查询描述区中。<p>16)获取并处理查询列表值<p>在执行了FETCH命令后,可以通过数组V和数组I中的元素来处理检索到的数据。<p>17)关闭游标<p>在推进游标、检索完数据后,执行如下命令关闭游标:<p>EXEC SQLCLOSE s_cursor;<p>18)释放空间使用函数free()释放由函数malloc()所分配的内存,使用函数sqlclu()释放为查询描述区以及绑定描述区所分配的空间<p><br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I227" ID="I227"></A><center><b><font size=+2>检测错误和状态改变</font></b></center><br>在Pro*C/C++中,用于检测错误和状态改变的方法有如下两种:<p>&nbsp;&nbsp;&nbsp; &middot;定义状态变量SQLSTATE或SQLCODE,在执行了SQL语句后检查它们的值,并根据需要执行相应的操作。<p>&nbsp;&nbsp;&nbsp; &middot;使用SQLCA。SQLCA被定义在头文件sqlca.h中。<p>在该程序中我们使用了SQLCA进行错误检测。关于SQLCA的详细描述请参阅第八章相关说明,这里不再累述。<p>WHENEVER语句用于检测并处理错误,使用该语句的语法如下:<p>EXEC SQL WHENEVER&lt;condition&gt;&lt;action&gt;<p>1)条件(condition)<p>Oracle可自动检测以下条件:<p>&nbsp;&nbsp;&nbsp; &middot;SQLWORING:当Oracle返回警告信息时会设置sqlworn[0]为“W”。使用该条件必须定义SQLCA。<p>&nbsp;&nbsp;&nbsp; &middot;SQLERROR:出现严重错误,此时SQLCODE为负值。<p>&nbsp;&nbsp;&nbsp; &middot;NOT FOUND:当Oracle不能找到满足条件的记录时SQLCODE被置为+1403。<p>2)操作(action)<p>当Oracle检测到以上条件时,应用程序可以执行如下操作:<p>&nbsp;&nbsp;&nbsp; &middot;CONTINUE:继续运行下一条语句。<p>&nbsp;&nbsp;&nbsp; &middot;DO:执行错误处理函数。<p>&nbsp;&nbsp;&nbsp; &middot;GOTO lable_name:转移到标号处执行。STOP:停止执行,回滚事务。<p><br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I228" ID="I228"></A><center><b><font size=+2>SQLCA</font></b></center><br>SQLCA是一个数据结构,它的成员包含了SQL语句执行后的错误、警告和状态信息。在ORACLE_HOME\pro80\c\include目录下的sqlca.h文件中定义了SQLCA结构。<p>使用如下语句可以将SQLCA包含到应用程序中:<p>EXEC SQL INCLUDE SQLCA;<p>或 #include&lt;sqlca.h&gt;<p>其部分结构成员如下:<p>&nbsp;&nbsp;&nbsp; &middot;sqlcaid:标识SQL通讯区的字符串成员,它被初始化为“SQLCA”。<p>&nbsp;&nbsp;&nbsp; &middot;sqlcabc:整数成员,用于保存SQLCA的字节长度。<p>&nbsp;&nbsp;&nbsp; &middot;sqlcode:整数成员,它保存着SQL语句执行后的状态代码。Sqlcode的值和含义见表8-1:<p><p><br>Sqlcode的值<p>含义<p><br>0 执行SQL语句成功<p><br>&gt;0 执行了该语句但检测到异常情况<p><br>&lt;0 出现严重错误,语句没有执行<p>&nbsp;&nbsp;&nbsp; &middot;sqlwarn:用于设置警告标记的单字符数组,通过赋“W”来设置警告标记。<p>&nbsp;&nbsp;&nbsp; &middot;sqlerrm:包含了成员sqlerrml及sqlerrmc的一个结构,其中sqlerrml用于保存错误文本长度,sqlerrmc用于保存错误文本。<p>Sqlerrmc最多可以保存70个字符的错误消息,使用函数sqlglm可以获得完整的错误消息文本,该函数的语法如下:<p>voidsqlglm(char *message_buffer,size_t *buffer_size,size_t *message_lenth);<p>参数说明如下:<p>&nbsp;&nbsp;&nbsp; &middot;message_buffer:存储错误消息的文本缓冲区(尾部以空格填充)。<p>&nbsp;&nbsp;&nbsp; &middot;buffer_size:缓冲区的字节长度。<p>&nbsp;&nbsp;&nbsp; &middot;message_lenth:错误消息的实际长度。<p>注意,调用该函数前必须确保SQLCODE或sqlca.sqlcode不等于0。该函数只能用于非线程应用。<p>SQLCA中还包括其它结构成员,包括sqlerrp、sqlerrd、sqlext等,由于这些成员的作用相对次要或在程序中没有使用,故这里暂不作介绍。<p><p><br><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I229" ID="I229"></A><center><b><font size=+2>SQLDA</font></b></center><br>SQLDA结构的作用是处理和保存查询列表项以及宿主变量占位符的信息。<p>当SQL语句所包含的查询列表项或绑定变量的个数不能确定时,我们就需要使用SQLDA结构来定义和描述查询列表项或绑定变量占位符。因此,该结构也被称为描述区,绑定变量列表所对应的绑定变量列表所对应的描述区就称为绑定描述区。<p>SQLDA结构保存在ORACLE_HOME\pro80\include目录下的sqida.h文件中。利用如下语句可以将该结构包含至应用程序中:<p>EXEC SQL INCLUDE sqlda;<p>尔后还要定义指向查询描述区和绑定描述区的指针:<p>SQLDA *bind_dp;<p>SQLDA *selectdp;<p>该结构的内容如下:<p>struct SQLDA<br>{<br>long&nbsp;&nbsp; N;<br>char&nbsp;&nbsp; **V;<br>long&nbsp;&nbsp; *L;<br>short&nbsp;&nbsp; *T;<br>short&nbsp;&nbsp; **I;<br>long&nbsp;&nbsp; F;<br>char&nbsp;&nbsp; **S;<br>short&nbsp;&nbsp; *M;<br>short&nbsp;&nbsp; *C;<br>char&nbsp;&nbsp; **X;<br>short&nbsp;&nbsp; *Y;<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -