﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-futual -文章分类-SQL/plsql</title><link>http://www.cppblog.com/strawberry/category/18872.html</link><description>  </description><language>zh-cn</language><lastBuildDate>Mon, 07 May 2012 12:28:39 GMT</lastBuildDate><pubDate>Mon, 07 May 2012 12:28:39 GMT</pubDate><ttl>60</ttl><item><title>OCI函数简单解析</title><link>http://www.cppblog.com/strawberry/articles/171599.html</link><dc:creator>futual</dc:creator><author>futual</author><pubDate>Mon, 16 Apr 2012 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/strawberry/articles/171599.html</guid><wfw:comment>http://www.cppblog.com/strawberry/comments/171599.html</wfw:comment><comments>http://www.cppblog.com/strawberry/articles/171599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/strawberry/comments/commentRss/171599.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/strawberry/services/trackbacks/171599.html</trackback:ping><description><![CDATA[OCL函数参考 
<p>下面的表列出了Open Client库支持的函数。需要注意的是所涉及到的头文件必须由用户提供，Postgres Plus Advance Server本身并不提供这些文件。</p>
<p><strong><font face="Times New Roman">表9-54</font><font face="Times New Roman" color="#ff0000"> </font><font face="Times New Roman">与连接，认证和初始化相关的函数</font></strong></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p><strong>函数名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIEnvCreate</p></td>
<td valign="top" width="371">
<p>创建一个OCI环境</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIEnvInit</p></td>
<td valign="top" width="371">
<p>初始化一个OCI环境句柄</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIInitialize</p></td>
<td valign="top" width="371">
<p>初始化OCI环境</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCILogoff</p></td>
<td valign="top" width="371">
<p>释放一个会话</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCILogon</p></td>
<td valign="top" width="371">
<p>创建一个登录连接</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCILogon2</p></td>
<td valign="top" width="371">
<p>使用不同的方式创建一个登录会话</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIServerAttach</p></td>
<td valign="top" width="371">
<p>建立到数据源的访问路径</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIServerDetach</p></td>
<td valign="top" width="371">
<p>删除到数据源的访问</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCISessionBegin</p></td>
<td valign="top" width="371">
<p>创建一个用户会话</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCISessionEnd</p></td>
<td valign="top" width="371">
<p>结束一个用户会话</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCISessionGet</p></td>
<td valign="top" width="371">
<p>从会话池中获取一个会话</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCISessionRelease</p></td>
<td valign="top" width="371">
<p>释放一个会话</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCITerminate</p></td>
<td valign="top" width="371">
<p>从共享内存子系统中分离</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表9-55与句柄和描述符相关的函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIAttrGet</p></td>
<td valign="top" width="371">
<p>获取句柄属性</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIAttrSet</p></td>
<td valign="top" width="371">
<p>设置句柄属性</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDescriptorAlloc</p></td>
<td valign="top" width="371">
<p>分配并且初始化一个描述符</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDescriptorFree</p></td>
<td valign="top" width="371">
<p>释放一个已分配的描述符</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIHandleAlloc</p></td>
<td valign="top" width="371">
<p>分配并且初始化一个句柄</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIHandleFree</p></td>
<td valign="top" width="371">
<p>释放一个已分配的句柄</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIParamGet</p></td>
<td valign="top" width="371">
<p>获取一个参数描述符</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIParamSet</p></td>
<td valign="top" width="371">
<p>设置一个参数描述符</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表9-56 与绑定，定义和描述相关的函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIBindByName</p></td>
<td valign="top" width="371">
<p>使用名称绑定</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIBindByPos</p></td>
<td valign="top" width="371">
<p>使用位置绑定</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIBindDynamic</p></td>
<td valign="top" width="371">
<p>绑定后设定其他的属性</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIBindArrayOfStruct</p></td>
<td valign="top" width="371">
<p>为批量操作绑定一个数组结构</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDefineByPos</p></td>
<td valign="top" width="371">
<p>定义一个输出变量结合</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDefineDynamic</p></td>
<td valign="top" width="371">
<p>为定义设定其他属性</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDescribeAny</p></td>
<td valign="top" width="371">
<p>描述存在的模式对象</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStmtGetBindInfo</p></td>
<td valign="top" width="371">
<p>获取绑定和指示变量名称和句柄</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表 9-57与语句相关函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStmtExecute</p></td>
<td valign="top" width="371">
<p>执行一个已准备的SQL语句</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStmtFetch</p></td>
<td valign="top" width="371">
<p>获取数据集中一行记录（已经作废）</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStmtFetch2</p></td>
<td valign="top" width="371">
<p>获取数据集中一条记录</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStmtPrepare</p></td>
<td valign="top" width="371">
<p>准备一个SQL语句</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStmtPrepare2</p></td>
<td valign="top" width="371">
<p>准备一个SQL语句</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStmtRelease</p></td>
<td valign="top" width="371">
<p>释放一个语句句柄。</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表9-58与事务相关的函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="356">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCITransCommit</p></td>
<td valign="top" width="356">
<p>提交事务</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCITransRollback</p></td>
<td valign="top" width="356">
<p>回滚事务</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表 9-59其它相关函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="215">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="354">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="215">
<p>OCIClientVersion</p></td>
<td valign="top" width="354">
<p>返回Client库的版本号</p></td></tr>
<tr>
<td valign="top" width="215">
<p>OCIErrorGet</p></td>
<td valign="top" width="354">
<p>返回一条错误消息</p></td></tr>
<tr>
<td valign="top" width="215">
<p>OCIPasswordChange</p></td>
<td valign="top" width="354">
<p>更改密码</p></td></tr>
<tr>
<td valign="top" width="215">
<p>OCIPing</p></td>
<td valign="top" width="354">
<p>确定连接和服务器处于活动状态</p></td></tr>
<tr>
<td valign="top" width="215">
<p>OCIServerVersion</p></td>
<td valign="top" width="354">
<p>获取包含Oracle版本的字符串</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表 9-60与日期和日期时间类型的相关函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateAddDays</p></td>
<td valign="top" width="371">
<p>增加或者减去天数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateAddMonths</p></td>
<td valign="top" width="371">
<p>增加或者减去月份数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateAssign</p></td>
<td valign="top" width="371">
<p>分配日期</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateCheck</p></td>
<td valign="top" width="371">
<p>检查给定的日期是否有效</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateCompare</p></td>
<td valign="top" width="371">
<p>比较两个日期</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateDaysBetween</p></td>
<td valign="top" width="371">
<p>找出两个日期之间的天数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateFromText</p></td>
<td valign="top" width="371">
<p>将一个字符串转换为日期</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateGetDate</p></td>
<td valign="top" width="371">
<p>获取一个日期中的日期部分</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateGetTime</p></td>
<td valign="top" width="371">
<p>获取一个日期中的时间部分</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateLastDay</p></td>
<td valign="top" width="371">
<p>获取每月最后一天的日期</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateNextDay</p></td>
<td valign="top" width="371">
<p>获取明天的日期</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateSetDate</p></td>
<td valign="top" width="371">
<p>设置一个日期中的日期部分</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateSetTime</p></td>
<td valign="top" width="371">
<p>设置一个日期中的时间部分</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateSysDate</p></td>
<td valign="top" width="371">
<p>获取当前系统日期和时间</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateToText</p></td>
<td valign="top" width="371">
<p>将日期转换为字符串</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeAssign</p></td>
<td valign="top" width="371">
<p>赋予日期时间</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeCheck</p></td>
<td valign="top" width="371">
<p>检查日期是否有效</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeCompare</p></td>
<td valign="top" width="371">
<p>比较两个日期时间的值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeConstruct</p></td>
<td valign="top" width="371">
<p>构建一个日期时间描述符</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeConvert</p></td>
<td valign="top" width="371">
<p>将日期时间类型变量转换成其它类型变量</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeFromArray</p></td>
<td valign="top" width="371">
<p>将大小为OCI_DT_ARRAYLEN的数组转换为OCIDateTime描述符。</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeFromText</p></td>
<td valign="top" width="371">
<p>根据指定的格式将字符串转换成OCIDateTime描述符中的Oracle日期时间类型。</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeGetDate</p></td>
<td valign="top" width="371">
<p>获取日期时间类型值中的日期部分。</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeGetTime</p></td>
<td valign="top" width="371">
<p>获取日期时间类型值中的时间部分。</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeGetTimeZoneName</p></td>
<td valign="top" width="371">
<p>获取一个日期时间类型值中时间区域名称部分</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeGetTimeZoneOffset</p></td>
<td valign="top" width="371">
<p>获取一个日期时间类型值中时间区域的(小时，分钟)部分</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeSubtract</p></td>
<td valign="top" width="371">
<p>把两个日期时间型的值作为输入参数，返回这两个值的间隔</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeSysTimeStamp</p></td>
<td valign="top" width="371">
<p>获取系统当前的日期和时间作为一个时间戳，并且带有一个时间区域。</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeToArray</p></td>
<td valign="top" width="371">
<p>将一个OCIDateTime描述符转换成一个数组</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIDateTimeToText</p></td>
<td valign="top" width="371">
<p>根据指定的格式将一个日期类型的值转换成字符串类型的值</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表9-61与数值相关的函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberAbs</p></td>
<td valign="top" width="371">
<p>计算绝对值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberAdd</p></td>
<td valign="top" width="371">
<p>执行数值加法操作</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberArcCos</p></td>
<td valign="top" width="371">
<p>计算反余玄函数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberArcSin</p></td>
<td valign="top" width="371">
<p>计算反正玄函数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberArcTan</p></td>
<td valign="top" width="371">
<p>计算反正切函数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberArcTan2</p></td>
<td valign="top" width="371">
<p>计算反正切的两个数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberAssign</p></td>
<td valign="top" width="371">
<p>将一个数值分配给另外一个变量</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberCeil</p></td>
<td valign="top" width="371">
<p>计算一个数值的ceiling值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberCmp</p></td>
<td valign="top" width="371">
<p>比较数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberCos</p></td>
<td valign="top" width="371">
<p>计算余弦值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberDec</p></td>
<td valign="top" width="371">
<p>对数值进行减一操作</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberDiv</p></td>
<td valign="top" width="371">
<p>对两个数值进行除法操作</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberExp</p></td>
<td valign="top" width="371">
<p>将 e 传递给指定的数值作为幂级数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberFloor</p></td>
<td valign="top" width="371">
<p>计算一个数值的floor值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberFromInt</p></td>
<td valign="top" width="371">
<p>将一个整数转换成一个Oracle数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberFromReal</p></td>
<td valign="top" width="371">
<p>将一个实数转换成一个Oracle数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberFromText</p></td>
<td valign="top" width="371">
<p>将一个字符串转换成一个Oracle数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberHypCos</p></td>
<td valign="top" width="371">
<p>计算双曲余玄值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberHypSin</p></td>
<td valign="top" width="371">
<p>计算双曲正玄值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberHypTan</p></td>
<td valign="top" width="371">
<p>计算双曲正切值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberInc</p></td>
<td valign="top" width="371">
<p>对数值进行加一操作</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberIntPower</p></td>
<td valign="top" width="371">
<p>传递给定的底数做为整型的幂级数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberIsInt</p></td>
<td valign="top" width="371">
<p>测试数值是否为一个整数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberIsZero</p></td>
<td valign="top" width="371">
<p>测试数值是否为0</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberLn</p></td>
<td valign="top" width="371">
<p>计算自然对数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberLog</p></td>
<td valign="top" width="371">
<p>以任意数为底计算对数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberMod</p></td>
<td valign="top" width="371">
<p>对数值进行取模操作</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberMul</p></td>
<td valign="top" width="371">
<p>对数值进行乘法操作</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberNeg</p></td>
<td valign="top" width="371">
<p>对一个数值进行求反操作</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberPower</p></td>
<td valign="top" width="371">
<p>以e为底求幂级数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberPrec</p></td>
<td valign="top" width="371">
<p>将一个数值四舍五入到一个指定数值的小数点位</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberRound</p></td>
<td valign="top" width="371">
<p>将一个数值四舍五入到指定的小数点位</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberSetPi</p></td>
<td valign="top" width="371">
<p>将一个数值初始化为Pi</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberSetZero</p></td>
<td valign="top" width="371">
<p>将一个数值初始化为0</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberShift</p></td>
<td valign="top" width="371">
<p>执行乘10操作,移动指定数值的小数点位</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberSign</p></td>
<td valign="top" width="371">
<p>获取数值的符号</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberSin</p></td>
<td valign="top" width="371">
<p>计算正玄值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberSqrt</p></td>
<td valign="top" width="371">
<p>计算一个数值的平方根</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberSub</p></td>
<td valign="top" width="371">
<p>进行减法操作</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberTan</p></td>
<td valign="top" width="371">
<p>计算正切值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberToInt</p></td>
<td valign="top" width="371">
<p>将一个数值转换成一个整数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberToReal</p></td>
<td valign="top" width="371">
<p>将一个数值转换成一个实数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberToRealArray</p></td>
<td valign="top" width="371">
<p>将一个数值型数组转换成一个实数型数组</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberToText</p></td>
<td valign="top" width="371">
<p>将一个数值转换成一个字符串</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCINumberTrunc</p></td>
<td valign="top" width="371">
<p>在指定的小数位截断一个数值</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表9-62 字符串函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStringAllocSize</p></td>
<td valign="top" width="371">
<p>获取已分配用于存放字符串的内存字节数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStringAssign</p></td>
<td valign="top" width="371">
<p>将字符串赋予一个字符串类型变量</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStringAssignText</p></td>
<td valign="top" width="371">
<p>将文本字符串赋予一个字符串类型变量</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStringPtr</p></td>
<td valign="top" width="371">
<p>获取字符串指针</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStringResize</p></td>
<td valign="top" width="371">
<p>重新设定用于存放字符串内存的大小</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIStringSize</p></td>
<td valign="top" width="371">
<p>获取字符串的长度</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表9-63与磁带和文件I/O相关的接口函数</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>函数名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileClose</p></td>
<td valign="top" width="371">
<p>关闭一个已打开的文件</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileExists</p></td>
<td valign="top" width="371">
<p>测试文件是否存在</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileFlush</p></td>
<td valign="top" width="371">
<p>将缓冲池的数据写到一个文件中</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileGetLength</p></td>
<td valign="top" width="371">
<p>获取文件的长度</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileInit</p></td>
<td valign="top" width="371">
<p>初始化OCIFile包</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileOpen</p></td>
<td valign="top" width="371">
<p>打开一个文件</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileRead</p></td>
<td valign="top" width="371">
<p>将文件内容读取到缓冲区中</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileSeek</p></td>
<td valign="top" width="371">
<p>改变文件中指针的当前位置</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileTerm</p></td>
<td valign="top" width="371">
<p>结束包OCIFile</p></td></tr>
<tr>
<td valign="top" width="220">
<p>OCIFileWrite</p></td>
<td valign="top" width="371">
<p>将长度为buflen的字节写到文件中。</p></td></tr></tbody></table>
<p><font face="Times New Roman"><strong>表9-64 所支持的数据类型</strong></font></p>
<p>
<table border="1">
<tbody>
<tr>
<td valign="top" width="220">
<p align="center"><strong>数据类型名称</strong></p></td>
<td valign="top" width="371">
<p align="center"><strong>描述</strong></p></td></tr>
<tr>
<td valign="top" width="220">
<p>ANSI_DATE</p></td>
<td valign="top" width="371">
<p>ANSI 日期类型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_AFC</p></td>
<td valign="top" width="371">
<p>ANSI 固定字符</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_AVC</p></td>
<td valign="top" width="371">
<p>ANSI 可变字符串</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_BDOUBLE</p></td>
<td valign="top" width="371">
<p>二进制双精度类型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_BIN</p></td>
<td valign="top" width="371">
<p>二进制数据类型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_BFLOAT</p></td>
<td valign="top" width="371">
<p>二进制浮点型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_CHR</p></td>
<td valign="top" width="371">
<p>字符串类型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_DAT</p></td>
<td valign="top" width="371">
<p>Oracle 日期类型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_DATE</p></td>
<td valign="top" width="371">
<p>ANSI 日期类型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_FLT</p></td>
<td valign="top" width="371">
<p>浮点型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_INT</p></td>
<td valign="top" width="371">
<p>整型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_LBI</p></td>
<td valign="top" width="371">
<p>长二进制</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_LNG</p></td>
<td valign="top" width="371">
<p>长整型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_LVB</p></td>
<td valign="top" width="371">
<p>超长的长型二进制</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_LVC</p></td>
<td valign="top" width="371">
<p>超长的长整型数值（或字符串）</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_NUM</p></td>
<td valign="top" width="371">
<p>Oracle数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_ODT</p></td>
<td valign="top" width="371">
<p>OCI数据类型</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_STR</p></td>
<td valign="top" width="371">
<p>以0结束的字符串</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_TIMESTAMP</p></td>
<td valign="top" width="371">
<p>时间戳</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_TIMESTAMP_TZ</p></td>
<td valign="top" width="371">
<p>带有区域的时间戳</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_TIMESTAMP_LTZ</p></td>
<td valign="top" width="371">
<p>带有本地时间区域的时间戳</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_UIN</p></td>
<td valign="top" width="371">
<p>无符号整数</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_VBI</p></td>
<td valign="top" width="371">
<p>VCS格式的二进制数据 </p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_VCS</p></td>
<td valign="top" width="371">
<p>变长字符串</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_VNU</p></td>
<td valign="top" width="371">
<p>变长数值</p></td></tr>
<tr>
<td valign="top" width="220">
<p>SQLT_VST</p></td>
<td valign="top" width="371">
<p>OCI 字符串类型</p></td></tr></tbody></table></p><img src ="http://www.cppblog.com/strawberry/aggbug/171599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/strawberry/" target="_blank">futual</a> 2012-04-16 11:16 <a href="http://www.cppblog.com/strawberry/articles/171599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游标，游标变量 ，自治事务</title><link>http://www.cppblog.com/strawberry/articles/169028.html</link><dc:creator>futual</dc:creator><author>futual</author><pubDate>Mon, 26 Mar 2012 08:51:00 GMT</pubDate><guid>http://www.cppblog.com/strawberry/articles/169028.html</guid><wfw:comment>http://www.cppblog.com/strawberry/comments/169028.html</wfw:comment><comments>http://www.cppblog.com/strawberry/articles/169028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/strawberry/comments/commentRss/169028.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/strawberry/services/trackbacks/169028.html</trackback:ping><description><![CDATA[<p>游标的用法：</p>
<p>--打开游标方式1，最标准的操作方式<br />declare<br />&nbsp; rec scott.emp%ROWTYPE;<br />&nbsp; --游标可以有参数，参数也允许有默认值<br />&nbsp; cursor c1(low number default 0, high number default 10000) return scott.emp%ROWTYPE is<br />&nbsp; select * from scott.emp where sal between low and high;<br />begin<br />&nbsp; open c1(1000,3000);&nbsp;--open游标的时候提供参数<br />&nbsp; loop<br />&nbsp;&nbsp; fetch c1 into rec;<br />&nbsp;&nbsp; exit when c1%NOTFOUND;<br />&nbsp;&nbsp; dbms_output.put_line(rec.empno || ' ' || rec.sal);<br />&nbsp; end loop;<br />&nbsp; close c1;<br />end;</p>
<p>--for循环打开游标，无需open和close，也不用处理exit<br />declare <br />&nbsp; cursor c1(low number default 0, high number default 10000) return scott.emp%ROWTYPE is<br />&nbsp; select * from scott.emp where sal between low and high;<br />begin<br />&nbsp; for rec in c1(1000,3000)<br />&nbsp; loop&nbsp;&nbsp; <br />&nbsp;&nbsp; dbms_output.put_line(rec.empno || ' ' || rec.sal);<br />&nbsp; end loop; <br />end;</p>
<p>--最简单的方式，无需声明游标，将select语句直接作为游标<br />declare <br />&nbsp; low integer;<br />&nbsp; high integer;<br />begin<br />&nbsp; low :=1000;<br />&nbsp; high := 3000;<br />&nbsp; for rec in (select * from scott.emp where sal between low and high)<br />&nbsp; loop&nbsp;&nbsp; <br />&nbsp;&nbsp; dbms_output.put_line(rec.empno || ' ' || rec.sal);<br />&nbsp; end loop; <br />end;</p>
<p>declare<br />&nbsp;&nbsp;&nbsp;&nbsp; cursor cur1 is select * from test for update;&nbsp;--表明游标用来更新<br />&nbsp;&nbsp;&nbsp;&nbsp; rec test%ROWTYPE;<br />begin<br />&nbsp;&nbsp;&nbsp;&nbsp; open cur1;<br />&nbsp;&nbsp;&nbsp;&nbsp; for i in 1..100 loop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch cur1 into rec;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update test set object_name='haha' where current of cur1;&nbsp;--游标可以用来更新，where current of 游标名<br />&nbsp;&nbsp;&nbsp;&nbsp; end loop;<br />&nbsp;&nbsp;&nbsp;&nbsp; commit;<br />&nbsp;&nbsp;&nbsp;&nbsp; close cur1;<br />end;</p>
<p>游标变量的用法：</p>
<p>--游标变量<br />&nbsp;CREATE OR REPLACE PACKAGE emp_data AS<br />&nbsp;&nbsp; TYPE empcurtyp IS REF CURSOR&nbsp;--包中可以声明游标变量类型，但是无法声明游标变量<br />&nbsp;&nbsp;&nbsp;&nbsp; RETURN employees%ROWTYPE;<br />&nbsp;<br />&nbsp;&nbsp; PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp); --游标变量经常用作存储过程的输出参数<br />&nbsp;END emp_data;</p>
<p>&nbsp;CREATE OR REPLACE PACKAGE BODY emp_data AS<br />&nbsp;&nbsp; PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp) IS&nbsp;&nbsp;&nbsp;--存储过程返回游标变量<br />&nbsp;&nbsp; BEGIN<br />&nbsp;&nbsp;&nbsp;&nbsp; OPEN emp_cv FOR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT *<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM employees;<br />&nbsp;&nbsp; END open_emp_cv;<br />&nbsp;END emp_data;</p>
<p>&nbsp;declare<br />&nbsp;&nbsp; cur emp_data.empcurtyp;<br />&nbsp;&nbsp; type rectable is table of employees%ROWTYPE;<br />&nbsp;&nbsp; rec rectable;<br />&nbsp;&nbsp; i number;<br />&nbsp;begin<br />&nbsp;&nbsp; emp_data.open_emp_cv(cur);<br />&nbsp;&nbsp; fetch cur bulk collect into rec;&nbsp; &nbsp;&nbsp;--批量取游标变量的值 <br />&nbsp;&nbsp;&nbsp; i := rec.first;<br />&nbsp;&nbsp;&nbsp; while i &lt;= rec.last loop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(rec(i).first_name || ' ' || rec(i).last_name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i := rec.next(i);<br />&nbsp;&nbsp;&nbsp; end loop;<br />&nbsp;&nbsp; close cur;&nbsp; <br />&nbsp;end;<br />&nbsp;<br />&nbsp;declare<br />&nbsp;&nbsp; cur emp_data.empcurtyp;<br />&nbsp;&nbsp; rec employees%ROWTYPE;&nbsp; <br />&nbsp;&nbsp; i number;<br />&nbsp;begin<br />&nbsp;&nbsp; emp_data.open_emp_cv(cur);<br />&nbsp;&nbsp; fetch cur into rec;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--单条取游标变量的值 <br />&nbsp;&nbsp; loop<br />&nbsp;&nbsp; &nbsp;&nbsp;exit when cur%NOTFOUND;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(rec(i).first_name || ' ' || rec(i).last_name);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; end loop;<br />&nbsp;&nbsp; close cur;&nbsp; <br />&nbsp;end;<br />&nbsp;<br />&nbsp;EXCEPTION<br />&nbsp;&nbsp;WHEN ROWTYPE_MISMATCH THEN<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;WHEN INVALID_CURSOR THEN<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;如果两个游标变量都是强类型，且类型不同，哪怕return的值一样，也不能相互赋值。<br />&nbsp;如下面的赋值是错误的<br />&nbsp;declare<br />&nbsp;&nbsp; type emp_cur_type1 is ref cursor return employees%ROWTYPE;<br />&nbsp;&nbsp; cur1 emp_cur_type1;<br />&nbsp;&nbsp; type emp_cur_type2 is ref cursor return employees%ROWTYPE;<br />&nbsp;&nbsp; cur2 emp_cur_type2;<br />&nbsp;begin<br />&nbsp;&nbsp; open cur1 for select * from employees;<br />&nbsp;&nbsp; cur1 := cur2;&nbsp; &nbsp;-- causes 'wrong type' error<br />&nbsp;&nbsp;...<br />&nbsp;end;</p>
<p>两个游标变量相互赋值后，操作其一相当于操作两者。<br />declare<br />&nbsp; type emp_cur_type is ref cursor return employees%ROWTYPE;<br />&nbsp; cur1 emp_cur_type;<br />&nbsp; cur2 emp_cur_type;<br />&nbsp; rec1 employees%ROWTYPE;<br />&nbsp; rec2 employees%ROWTYPE;<br />begin<br />&nbsp; open cur1 for select * from employees;<br />&nbsp; cur2 := cur1;<br />&nbsp; <br />&nbsp; loop <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch cur1 into rec1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit when cur1%NOTFOUND;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(rec1.first_name || ' ' || rec1.last_name);<br />&nbsp; end loop;<br />&nbsp; <br />&nbsp; dbms_output.put_line('-----------------------------------------------------');<br />&nbsp; --此后将打印不出来内容，因为前面的cur1数据已经取完，指针移到了最后<br />&nbsp; --cur2和cur1指向的是同一个区域，所以操作cur1相当于操作cur2<br />&nbsp; loop <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fetch cur2 into rec2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit when cur2%NOTFOUND;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbms_output.put_line(rec2.first_name || ' ' || rec2.last_name);<br />&nbsp; end loop;</p>
<p>&nbsp; close cur1;<br />&nbsp;-- close cur2;&nbsp;&nbsp; --不能再次关闭，因为cur1和cur2指向的是同一个区域，close cur1后cur2也随之关闭了<br />end;</p>
<p>游标属性：<br />&nbsp;%FOUND, %NOTFOUND, %ROWCOUNT, %ISOPEN<br />&nbsp;<br />隐式游标<br />&nbsp;SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT, SQL%ISOPEN<br />&nbsp;这些属性与最近一次执行的语句相关，如果要用到，最好在待考察语句结束后，马上用变量保存起来。<br />&nbsp;</p>
<p>自治事务：<br />&nbsp;PRAGMA AUTONOMOUS_TRANSACTION;&nbsp;--在声明的任何部分加入这句话都可以，一般在第一句。</p>
<p>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;&nbsp;&nbsp;--将事务隔离级别设置为serializable</p>
<p>create package debugging as<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function log_msg(msg varchar2) return varchar2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pragma restrict_references(log_msg,WNDS,RNDS);&nbsp;&nbsp;--限制函数log_msg写数据表或者读数据表<br />end debugging;</p>
<p>create package body debugging as<br />&nbsp; function log_msg(msg varcahr2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return varchar2 <br />&nbsp; is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pragma autonomous_transaction;&nbsp;&nbsp;&nbsp;--自治事务可以免收上面的限制<br />&nbsp; begin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into debug_output<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; values(msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commit;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return msg;<br />&nbsp; end;<br />end debugging;</p><img src ="http://www.cppblog.com/strawberry/aggbug/169028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/strawberry/" target="_blank">futual</a> 2012-03-26 16:51 <a href="http://www.cppblog.com/strawberry/articles/169028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游标   游标变量   （转）</title><link>http://www.cppblog.com/strawberry/articles/169027.html</link><dc:creator>futual</dc:creator><author>futual</author><pubDate>Mon, 26 Mar 2012 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/strawberry/articles/169027.html</guid><wfw:comment>http://www.cppblog.com/strawberry/comments/169027.html</wfw:comment><comments>http://www.cppblog.com/strawberry/articles/169027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/strawberry/comments/commentRss/169027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/strawberry/services/trackbacks/169027.html</trackback:ping><description><![CDATA[<div class="postText">
<p>环境区域是用来处理SQL语句的一个oracle存储区域。游标是指向它的指针或句柄。通过游标，PL/SQL程序可以控制这个环境区域中被处理的语句。</p>
<p>Oracle中的游标有两种：显式游标、隐式游标。</p>
<p>显示游标是用cursor...is命令定义的游标，它可以对查询语句(select)返回的多条记录进行处理，而隐式游标是在执行插入(insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。</p>
<p>1、显式游标操作</p>
<p>显式游标在块定义部分、包或子程序中声明。当声明了显式游标后，可以通过以下三条命令控制显式游标的操作：打开游标、推进游标、关闭游标。</p>
<p>(1)声明显式游标</p>
<p>--例1</p>
<p><br />declare&nbsp;&nbsp;&nbsp; <br />v_auths auths%rowtype;&nbsp;&nbsp;&nbsp; <br />v_code auths.author_code%type;&nbsp;&nbsp;&nbsp; <br />cursor c_auths is&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; select * from auths where author_code=v_code;</p>
<p>上例是将PL/SQL变量绑定在WHERE子句中，下面将游标参数绑定在游标的WHERE子句中：</p>
<p>--例2</p>
<p><br />delcare&nbsp;&nbsp;&nbsp; <br />cursor c_auths(p_code auths.author_code%type) is&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; select * from auths where author_code=p_code;&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p>(2)打开显式游标</p>
<p>游标操作的第一步是打开游标。</p>
<p>例1，下面的语句是打开上节例1中声明的显式游标c_auths;</p>
<p><br />begin&nbsp;&nbsp;&nbsp; <br />--在打开游标前为绑定变量赋值。&nbsp;&nbsp;&nbsp; <br />v_code:='A00001';&nbsp;&nbsp;&nbsp; <br />--打开游标。&nbsp;&nbsp;&nbsp; <br />open c_auths;&nbsp;&nbsp;</p>
<p><br />例2，如果对于一个带参数的游标</p>
<p><br />begin&nbsp;&nbsp;&nbsp; <br />--打开游标时将参数传入。&nbsp;&nbsp;&nbsp; <br />open c_auths('A00001');&nbsp;&nbsp;</p>
<p><br />打开一个已打开的游标也是合法的。当第二次打开游标时，PL/SQL先自动关闭游标，然后再打开。一次打开多个游标也是PL/SQL所允许的。</p>
<p>(3)推进显式游标</p>
<p>当打开显式游标后，就可以使用FETCH语句来推进游标，返回查询结果集中的一行。每执行完一条FETCH语句后，显式游标会自动指向查询结果集的下一行。</p>
<p>(4)关闭显式游标</p>
<p>当整个结果集都检索完以后，应当关闭游标。关闭游标用来通知PL/SQL游标操作已经结束，并且释放游标所占用的资源(结果集所使用的资源空间)。</p>
<p>2、游标的属性</p>
<p>游标有四个属性：%found、%notfound、%isopen和%rowcount。要注意这些属性只能使用在过程性语句中，而不能使用在SQL语句中。</p>
<p>表tableattribute，表中有两列column1(number类型)和column2(varchar2类型)，现在向表中插入两条记录：</p>
<p>insert into tableattribute values(10,'first');</p>
<p>insert into tableattribute values(20,'second');</p>
<p>...</p>
<p>3、显式游标的推进循环</p>
<p><br />delcare&nbsp;&nbsp;&nbsp; <br />--声明一个变量，这个变量用来接收游标返回的结果集。&nbsp;&nbsp;&nbsp; <br />v_salary auths.salary%type;&nbsp;&nbsp;&nbsp; <br />v_code auths.author_code%type;&nbsp;&nbsp;&nbsp; <br />/*声明游标，该游标的查询结果集是作家代码为"A00001"到"A00006"的工资值。*/&nbsp;&nbsp; <br />cursor c_salary is select salary,author_code from auths where author_code&lt;='A00006';&nbsp;&nbsp;&nbsp; <br />begin&nbsp;&nbsp;&nbsp; <br />--打开游标，并初始化结果集&nbsp;&nbsp;&nbsp; <br />open c_salary;&nbsp;&nbsp;&nbsp; <br />loop&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; --推进游标，将游标的查询结果集中的一行存到变量v_salary中。&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; fetch c_salary into v_salary,v_code;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; --当结果集中没有行时退出循环。&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; exit when c_salary%notfound;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; --如果查询到的作家工资小于或等于200，则增加该作家的工资值。&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; if v_salary&lt;=200 then&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update auths set salary=salary+50 where author_code=v_code;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; end if;&nbsp;&nbsp;&nbsp; <br />end loop;&nbsp;&nbsp;&nbsp; <br />--关闭游标，释放游标占用资源。&nbsp;&nbsp;&nbsp; <br />close c_salary;&nbsp;&nbsp;&nbsp; <br />--提交所做的修改。&nbsp;&nbsp;&nbsp; <br />commit;&nbsp;&nbsp;&nbsp; <br />end;&nbsp;&nbsp;</p>
<p><br />PL/SQL还提供了一种简单类型的循环，可以自动控制游标的打开、推进和关闭，叫做游标的FOR循环。</p>
<p><br />delcare&nbsp;&nbsp;&nbsp; <br />cursor c_salary is&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; select salary form auths where author_code&lt;='A00006';&nbsp;&nbsp;&nbsp; <br />begin&nbsp;&nbsp;&nbsp; <br />--开始游标FOR循环，隐含地打开c_salary游标。&nbsp;&nbsp;&nbsp; <br />for v_salary in c_salary loop&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; --一个隐含的fetch语句在这里被执行。&nbsp;&nbsp;&nbsp; <br />　　if v_salary.salary&lt;=200 then&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update auths set salary=salary+50 where salary=v_salary.salary;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; end if;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; --在循环继续前，一个隐含的c_auths%notfound被检测。&nbsp;&nbsp;&nbsp; <br />　end loop;&nbsp;&nbsp;&nbsp; <br />--现在循环已经结束，c_auths游标的一个隐含的close操作被执行。&nbsp;&nbsp;&nbsp; <br />commit;&nbsp;&nbsp;&nbsp; <br />end;&nbsp;&nbsp;</p>
<p><br />使用current of cursor子句作为条件</p>
<p><br />delcare&nbsp;&nbsp;&nbsp; <br />--声明游标时在select语句中必须加for update of子句。&nbsp;&nbsp;&nbsp; <br />cursor c_salary is&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; select salary form auths where author_code&lt;'A00006' for update of salary;&nbsp;&nbsp;&nbsp; <br />begin&nbsp;&nbsp;&nbsp; <br />for v_salary in c_salary loop&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; if v_salary.salary&lt;=200 then&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --下面的update语句中的current of子句用来表明结果集的当前行。 <br />&nbsp;&nbsp;&nbsp; update auths set salary=salary+50 where current of c_salary;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; end if;&nbsp;&nbsp;&nbsp; <br />end loop;&nbsp;&nbsp;&nbsp; <br />commit;&nbsp;&nbsp;&nbsp; <br />end;&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p>如果在游标的FOR循环中使用子查询，则不用在块定义部分声明显式游标，在FOR循环中子查询隐含声明了一个显式游标。</p>
<p><br />begin&nbsp;&nbsp;&nbsp; <br />--在下面的FOR循环中隐含地声明了一个游标c_salary。&nbsp;&nbsp;&nbsp; <br />　for c_salary in&nbsp;&nbsp;&nbsp; <br />(select salary form auths where author_code&lt;='A00006') loop&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; if c_salary.salary&lt;=200 then&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update auths set salary=salary+50 where salary=c_salary.salary;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; end if;&nbsp;&nbsp;&nbsp; <br />end loop;&nbsp;&nbsp;&nbsp; <br />commit;&nbsp;&nbsp;&nbsp; <br />end;&nbsp;&nbsp;</p>
<p><br />4、隐式游标处理</p>
<p>PL/SQL隐式地打开SQL游标，并在它内部处理SQL语句，然后关闭它。SQL游标用来处理insert、update、delete以及返回一行的select...into语句。</p>
<p>一个SQL游标不管是打开还是关闭，open、fetch和close命令都不能操作它。SQL游标与显式游标类似，也有四个一样的属性。当打开SQL游标之前，SQL游标的属性都为NULL。</p>
<p><br />begin&nbsp;&nbsp;&nbsp; <br />update auths set entry_date_time=sysdate where author_code='A00017';&nbsp;&nbsp;&nbsp; <br />--如果update语句中修改的行不存在(SQL%notfound返回值为true),则向auths表中插入一行。&nbsp;&nbsp;&nbsp; <br />if sql%nofound then&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; insert into auths(author_code,name,sex,birthdate,salary,entry_date_time)&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; values('A000017','qiuys',1,'30-apr-40',88.5,sysdate);&nbsp;&nbsp;&nbsp; <br />end if;&nbsp;&nbsp;&nbsp; <br />end;&nbsp;&nbsp;</p>
<p><br />--如果update语句中修改的行不存在(sql%rowcount=0)</p>
<p><br />declare&nbsp;&nbsp;&nbsp; <br />v_birthdate date;&nbsp;&nbsp;&nbsp; <br />begin&nbsp;&nbsp;&nbsp; <br />select birthdate into v_birthdate from auths where name='qiuys';&nbsp;&nbsp;&nbsp; <br />--如果查询到一条记录，则删除该记录。&nbsp;&nbsp;&nbsp; <br />if sql%found then&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; delete from auths where name='qiuys';&nbsp;&nbsp;&nbsp; <br />end if;&nbsp;&nbsp;&nbsp; <br />exception&nbsp;&nbsp;&nbsp; <br />when no_data_found then&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; dbms_output.put_line('该记录不存在');&nbsp;&nbsp;&nbsp; <br />when too_many_rows then&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; dbms_output_line('存在同名的作家');&nbsp;&nbsp;&nbsp; <br />end;&nbsp;&nbsp;</p>
<p><br />5、游标变量</p>
<p>到目前为止前面所有显式游标的例子都是静态游标－即游标与一个SQL语句关联，并且该SQL语句在编译时已经确定。</p>
<p>而游标变量是一个引用类型(REF)的变量。</p>
<p>(1)游标变量的声明</p>
<p><br />declare&nbsp;&nbsp;&nbsp; <br />--使用%rowtype定义一个游标变量类型。&nbsp;&nbsp;&nbsp; <br />type t_authsref is ref cursor return auths%rowtype;&nbsp;&nbsp;&nbsp; <br />--定义一个记录类型。&nbsp;&nbsp;&nbsp; <br />type t_coderecord is record(&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; author_code article.author_code%type,&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; article_code article.article_code%type);&nbsp;&nbsp;&nbsp; <br />--声明一个记录类型的变量。&nbsp;&nbsp;&nbsp; <br />v_code t_coderecord;&nbsp;&nbsp;&nbsp; <br />--使用t_coderecord作为一个游标变量类型的结果集类型。&nbsp;&nbsp;&nbsp; <br />type t_coderef is ref cursor return t_codeRecord;&nbsp;&nbsp;&nbsp; <br />--使用v_code作为一个游标变量类型的结果集类型。&nbsp;&nbsp;&nbsp; <br />type t_coderef2 is ref cursor return v_code%type;&nbsp;&nbsp;&nbsp; <br />--使用上面的类型声明的两个游标变量。&nbsp;&nbsp;&nbsp; <br />v_authcv t_authsref;&nbsp;&nbsp;&nbsp; <br />v_codecv t_coderef;&nbsp;&nbsp;</p>
<p><br />PL/SQL2.8以上版本中，可以使用一个没有指定结果集类型的游标变量(没有RETURN)来指定多个不同类型的查询。</p>
<p>type t_authsref if ref cursor;</p>
<p>v_cursorvar t_authsref;--声明一个该类型的变量。</p>
<p>(2)打开游标变量</p>
<p>为了将一个游标变更与一个具体的select语句联系起来，open的语法中增加了一个select语句。</p>
<p><br />open cursor_variable for select_statement;&nbsp;&nbsp;&nbsp; <br />declare&nbsp;&nbsp;&nbsp; <br />type t_authorsref is ref cursor return auths%rowtype;&nbsp;&nbsp;&nbsp; <br />v_authscv t_authorsref;&nbsp;&nbsp;&nbsp; <br />--然后打开&nbsp;&nbsp;&nbsp; <br />open v_authscv for select * from auths;&nbsp;&nbsp;</p>
<p><br />3)推进游标变更</p>
<p>(4)关闭游标变更</p>
<p>该操作用来释放查询所占用的资源。但没有释放游标变量占用的存储空间。当变量超出作用域时，它所占用的空间才被释放掉。</p>
<p>下面的块中定义了一个没有指定结果集的游标变量，这样我们就可以使用这个游标变量指向不同的查询，并能够返回不同的记录类型：</p>
<p><br />set serveroutput on size 100000 --设置存储缓冲区大小。&nbsp;&nbsp;&nbsp; <br />declare&nbsp;&nbsp;&nbsp; <br />/*定义游标变更类型t_curref，该游标变量类型没有指定结果集类型，所以该游标变量类型的变量可以返回不同的PL/SQL记录类型。*/&nbsp;&nbsp; <br />type t_curref is ref cursor;&nbsp;&nbsp;&nbsp; <br />--声明一个游标变量类型的变量&nbsp;&nbsp;&nbsp; <br />c_cursorref t_curref;&nbsp;&nbsp;&nbsp; <br />--定义PL/SQL记录类型t_authorrec，该类型的变量用来接收游标变量的返回值。&nbsp;&nbsp;&nbsp; <br />type t_authorrec is record(&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; authorcode auths.author_code%type,&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; name auths.name%type);&nbsp;&nbsp;&nbsp; <br />--定义PL/SQL记录类型t_articlerec,该类型的变量也用来接收游标变量的返回值。&nbsp;&nbsp;&nbsp; <br />type t_articlerec is record(&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; authorcode article.author_code%type,&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; title artitle.title%type);&nbsp;&nbsp;&nbsp; <br />--声明两个记录类型变量。&nbsp;&nbsp;&nbsp; <br />v_author t_authorrec;&nbsp;&nbsp;&nbsp; <br />v_article t_articlerec;&nbsp;&nbsp;&nbsp; <br />begin&nbsp;&nbsp;&nbsp; <br />--打开游标变量c_cursorref，返回t_authorrec类型的记录。&nbsp;&nbsp;&nbsp; <br />open c_cursorref for&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; select author_code,name from auths where author_code in('A00001','A00002','A00003','A00004','A00005');&nbsp;&nbsp;&nbsp; <br />--推进游标变量&nbsp;&nbsp;&nbsp; <br />fetch c_cursorref into v_author;&nbsp;&nbsp;&nbsp; <br />--游标变量的推进循环。&nbsp;&nbsp;&nbsp; <br />while c_cursorref%found loop&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; --将作家代码和相应的作家名字输出到屏幕上。&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; dbms_output.put(v_author.authorcode||':'||v_author.name||' ');&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; fetch c_cursorref into v_author;&nbsp;&nbsp;&nbsp; <br />end loop;&nbsp;&nbsp;&nbsp; <br />dbms_output.new_line;--向屏幕上输出一个回车行。&nbsp;&nbsp;&nbsp; <br />--关闭游标变量，仅仅将游标变量指定的资源释放掉，游标变量本身的存储空间没有释放掉。&nbsp;&nbsp;&nbsp; <br />close c_cursorref;&nbsp;&nbsp;&nbsp; <br />--再次打开游标变量，返回t_articlerec类型的记录。&nbsp;&nbsp;&nbsp; <br />open c_cursorref for&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; select author_code,title from article&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; where author_code in('A00001','A00002','A00003','A00004','A00005');&nbsp;&nbsp;&nbsp; <br />fetch c_cursorref into v_article;&nbsp;&nbsp;&nbsp; <br />while c_cursorref%found loop&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp; <br />end loop;&nbsp;&nbsp;&nbsp; <br />close c_cursorref;&nbsp;&nbsp;&nbsp; <br />end;&nbsp;&nbsp;</p>
<p><br />注意，在上例中，第一次关闭游标变量是可省略的，因为在第二次打开游标变量时，就将第一次的查询丢失掉了。而且游标变量也有游标属性，通常在推进游标变量时使用这些游标属性，例如上例使用了%found属性。</p></div><img src ="http://www.cppblog.com/strawberry/aggbug/169027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/strawberry/" target="_blank">futual</a> 2012-03-26 16:50 <a href="http://www.cppblog.com/strawberry/articles/169027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>