1、Oracle中的游标
    Oracle使用两种游标: 显式游标和隐式游标. 不管语句返回多少条记录, Oracle为每条使用的SQL语句隐式地定义一个游标. Oracle为每个DELETE ,
UPDATE, INSERT 等SQL命令隐式地声明游标. 用户声明并使用显式游标处理SELECT语句返回的多条记录.
    游标是ORACLE和PRO*C存放查询结果的工作区域。一个游标(已命名的)与一条SELECT语句相关联。操作游标有由4条命令:
(1)DECLARE CURSOR;(2)OPEN CURSOR;(3)FETCH;(4)CLOSE CURSOR。
A. 定义游标
        一个游标必须首先定义, 才能使用它。语法为:
        EXEC SQL DECLARE 〈游标名〉CORSOR FOR
        SELECT 〈列〉
        FROM 〈表〉
        例如:
        EXEC SQL DECLARE CSOR, CURSOR FOR
        SELECT ENAME , JOB, SAL
        FROM EMP
        WHERE DEPTNO=:DEPTNO;
        当赋给一个与查询相关联的游标CURSOR之后, 当SELECT查询EMP时可从
        数据库中返回多行,这些行就是CURSOR的一个活动区域。
        注意:
        1) 定义游标必须在对游标操作之前完成;
        2) PRO*C不能引用没有定义的游标;
        3) 游标定义后,其作用范围是整个程序。所以对一个程序来讲, 同时定义两个相同的游标是错误的。
B. 申请游标
        在定义游标之后, 应用程序在使用游标变量之前, 必须首先调用ALLOCATE语句
        申请游标, 也就是为游标变量分配内存区域, ALLOCATE 语法格式为:
        EXEC SQL ALLOCATE :cursor_variable;
        C. 打开游标
        打开游标的OPEN语句主要用来输入主变量的内容,这些主要是WHERE中使用
        的主变量。打开游标的语句是:EXEC SQL OPEN 〈游标名〉
        当打开游标后,可以从相关的查询中取出多于一行的结果。所有满足查询标准的
        行组成一集合,叫做“游标活动集”。通过取操作,活动集中的每一行或每一组是一
        个一个返回的,查询完成后, 游标就可关闭了。如图所示:
        
        注意:1)游标处于活动集的第一行前面;
                    2)若改变了输入主变量就必须重新打开游标。
D. 取数据
        从活动集中取出一行或一组把结果送到输出主变量中的过程叫取数据。输出主变量
        的定义在取数据语句中。取数据的语句如下:
        EXEC SQL FETCH〈游标名〉INTO:主变量1,主变量2,……
        FETCH的工作过程如图所示:
        
        如图所示的查询结果指满足查询条件的查询结果。使用FETCH应注意以下几点:
        <1> 游标必须先定义再打开。
        <2> 只有在游标打开之后才能取数据,即执行FETCH语句。
        <3> FETCH语句每执行一次,从当前行或当前组取数据一次,下一行或下一组向上移一次。游标每次所指的行或组都为当前行或当前组,而FETCH
                每次都是取游标所指定的行或组的数据。
        <4> 当游标活动集空之后,ORCLE返回一个SQLCA。SQLCA(=1403)。
        <5> 若希望此游标再操作, 必须先关闭再打开它。
        <6> 在C程序中可以开辟一个内存空间,来存放操作结果,这样就能利用开辟的空间来灵活操纵查询的结果。
E.关闭游标
        取完活动集中所有行后,必须关闭游标,以释放与该游标有关的资源。
        关闭游标的格式为:
        EXEC SQL CLOSE 游标名;
        例如:
        EXEC SQL CLOSE C1;
        ORACLE V5.0版支持SQL格式“CURRENT OF CURSOR”。这条语句将指向一个
        游标中最新取出的行, 以用于修改和删除操作。该语句必须有取操作之后使用,
        它等同存储一个ROWID,并使用它。
F. 释放游标
        CLOSE语句在关闭游标变量时, 并未释放游标变量所点用的内存. 所以, 以游标变
        量关闭之后应用程序可以重新打开游标变量, 实现各种游标操作. 需要关闭游标变
        量并释放经所点用的内存. 方法如下:
        EXEC SQL FREE :cursor_name;
        
2、函数事例:

int DbsTblLineList (int nOpr)
{
int nList;
int i; EXEC SQL DECLARE tbl_line_cfg_cur CURSOR FOR
SELECT GATE_ID, LINE_IP, LINE_PORT
FROM TBL_LINE_CFG ORDER BY GATE_ID; EXEC SQL OPEN tbl_line_cfg_cur;
if (sqlca.sqlcode != )
{
printf (ERROR , "error code [%d], reason[%s] \n", sqlca.sqlcode, ( char * )sqlca.sqlerrm.sqlerrmc); return -;
} i = ;
nList = ; while ()
{
/***********************
* 从库表中FETCH数据,查询
************************/
memset (saGateId, 0x00, sizeof(saGateId));
memset (saLineIp, 0x00, sizeof(saLineIp));
naLinePort = ; EXEC SQL FETCH tbl_line_cfg_cur INTO
:saGateId, :saLineIp, :naLinePort;
if (sqlca.sqlcode != && sqlca.sqlcode != )
{
printf ("fetch tbl_line_cfg_cur error sqlcode[%d]", sqlca.sqlcode);
EXEC SQL CLOSE tbl_line_cfg_cur; return -;
}
if (sqlca.sqlcode == )
{
EXEC SQL CLOSE tbl_line_cfg_cur; i++;
lGateList[i].nList = -; break;
} lGateList[i].nList = nList;
memcpy (lGateList[i].saGateId, saGateId, );
memcpy (lGateList[i].saLineIp, saLineIp, );
trimspace (lGateList[i].saLineIp);
lGateList[i].naLinePort = naLinePort; i++;
nList++;
} return ;
}

PRO*C 函数事例 3 -- 游标使用的更多相关文章

  1. PRO*C 函数事例 2 -- 数据库操作

    Pro*C Oracle 的嵌入式开发,数据库处理部分最好能提取到一个模块,按照对不同数据库表的操作分成不同的.pc文件(如 DbsInstStat.pc).将此模块编译成库(c文件编译时链接此库), ...

  2. PRO*C 函数事例 1 -- 数据库连接、事务处理

    1.程序结构        每一个Pro*C程序都包括两部分:(1)应用程序首部:(2)应用程序体        应用程序首部定义了ORACLE数据库的有关变量, 为在C语言中操纵ORACLE数据库做 ...

  3. Mybatis下配置调用Oracle自定义函数返回的游标结果集

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  4. C++转C#函数事例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...

  5. Oracle之函数中使用游标

    create or replace function getcustprodinstaddr(in_CustId in number,in_area_code in number) return va ...

  6. postgresql 游标,函数,存储过程使用例子

    CREATE OR REPLACE FUNCTION cursor_demo() RETURNS refcursor AS --返回一个游标 $BODY$ declare --定义变量及游标 unbo ...

  7. mybatis中调用游标,存储过程,函数

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  8. mysql 游标 demo

    一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...

  9. MySQL中的存储过程和函数使用详解

    一.对待存储过程和函数的态度 在实际项目中应该尽量少用存储过程和函数,理由如下: 1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了. 2.调试麻烦,在db中报一个错误和在 ...

随机推荐

  1. 设计模式——原型模式(Prototype Pattern)

    原型模式:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML 图: 原型类: package com.cnblog.clarck; /** * 原型类 * * @author c ...

  2. A potentially dangerous Request.Form value was detected from the client的解决办法

    网上找了这么多,这条最靠谱,记录下来,以备后用 <httpRuntime requestValidationMode="2.0"/> <pages validat ...

  3. HDU 4117 GRE Words

    这道题不难想到这样的dp. dp[字符串si] = 以si为结尾的最大总权值. dp[si] = max(dp[sj]) ,1.j < i,2.sj是si的子串. 对于第二个条件,是一个多模版串 ...

  4. 基于Qt的相似QQ好友列表抽屉效果的实现

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shuideyidi/article/details/30619167     前段时间在忙毕业设计, ...

  5. 成都夏季招聘会IT行业缺口大!

    上个周末成都的夏季招聘会在新会展中心举行,我们传智播客的专业市场调查员也深入当中.了解IT行业招聘情况,我们发如今IT软件行业专区招聘的公司特别多,可是去应聘的人却非常少.这意味着IT行业正处于供不应 ...

  6. 【LOJ6052】「雅礼集训 2017 Day11」DIV(杜教筛)

    点此看题面 大致题意: 求\(1\sim n\)内所有满足\(a>0\)的约数\(a+bi\)的\(a\)之和. 解题思路 首先,我们设\(x=(a+bi)(c+di)(1\le x\le n) ...

  7. POJ 3635 Full Tank? 【分层图/最短路dp】

    任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  8. 对接融云即时通讯组件SDK,轻松实现App聊天室

    我好像特别喜欢做聊天室类的东东,刚折腾完微软的SignalR又折腾App.本来想研究研究XMPP的,由于服务器的搭建问题,先采用一个第三方的吧,看看效果如何.听到弟弟说他们公司用到了融云,我也下载个S ...

  9. c语言实现数组的转置

    #include<stdio.h> int main (){ int i,j,m,n; ][],b[][]; printf("请输入行列式的行数:\n"); scanf ...

  10. 【luogu T24743 [愚人节题目5]永世隔绝的理想乡】 题解

    题意翻译 我们来说说王的故事吧. 星之内海,瞭望之台.从乐园的角落告知汝等.汝等的故事充满了祝福.只有无罪之人可以进入——『永世隔绝的理想乡(Garden of Avalon)』! 题目背景 zcy入 ...