Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2895896
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: C/C++

2012-01-10 17:51:06

在Pro*C中的滚动游标可以方便的获得当前记录的前面一条,后面一条,以及第一条、最后一条。
 
很多开发人员一般采用如下的方法,循环FETCH 直到最后一条。
while (1)
{
  fetch 游标名  into 变量列表;
  if (sqlca.sqlcode=1403) then break;
}
如果使用滚动游标,会更加方便获得最后一条。
 
下面给出一个简单的例子
 
SQL> SELECT EMPNO,ENAME FROM EMP ORDER BY EMPNO;
     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER
 
已选择14行。
 
/home/cpicsrv/yansp > cat test.pc
#include
#include
exec sql include sqlca;
main()
{
  exec sql begin declare section;
     char *username="scott";
     char *password="tiger";
     char *dbserver="10.223.18.116/yansp";
     char ename[10];
     int      empno;
  exec sql end   declare section;
  exec sql whenever sqlerror  stop;
 
  exec sql declare mycursor scroll cursor
           for select empno,ename from emp order by empno;
  exec sql connect :username identified by :password using :dbserver;
  if (sqlca.sqlcode!=0)
  {
    printf("Connect to database failed!\n");
    printf("Error message is %s.\n",sqlca.sqlerrm.sqlerrmc);
  }
 
  exec sql open mycursor;
 
  exec sql fetch first mycursor into :empno,:ename; /*取游标中第一条记录*/
  printf("First:empno=[%d],ename=[%s]\n",empno,ename);
 
  exec sql fetch next mycursor into :empno,:ename; /*取游标中下一条记录*/
  printf("Next:empno=[%d],ename=[%s]\n",empno,ename);
 
  exec sql fetch prior mycursor into :empno,:ename; /*取游标中上一条记录*/
  printf("Prior:empno=[%d],ename=[%s]\n",empno,ename);
 
  exec sql fetch last mycursor into :empno,:ename; /*取游标中最后一条记录*/
  printf("Last:empno=[%d],ename=[%s]\n",empno,ename);
 
  exec sql close mycursor;
  exec sql commit work release;
}

/home/cpicsrv/yansp > proc parse=none test.pc
Pro*C/C++: Release 10.2.0.1.0 - Production on Tue Jan 10 18:08:55 2012
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
System default option values taken from: /home/oracle/oracle/product/10.2.0/client_1/precomp/admin/pcscfg.cfg
 
/home/cpicsrv/yansp > gcc $ORACLE_HOME/lib/libclntsh.so test.c -o test

/home/cpicsrv/yansp > ./test
First:empno=[7369],ename=[SMITH    ]
Next:empno=[7499],ename=[ALLEN    ]
Prior:empno=[7369],ename=[SMITH    ]
Last:empno=[7934],ename=[MILLER   ]
阅读(2612) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~