Welcome 微信登录

首页 / 数据库 / MySQL / Oracle教程:使用滚动游标

源代码:xx.pc
  1. /* 
  2.     功能:演示了Oracle滚动游标操作 
  3.  
  4.     定义游标时注意事项: 
  5.     1. DECLARE CURSOR语句必须是使用游标的第一条语句 
  6.     2. 游标名称是一个标识符,而不是宿主变量,其长度是可以任意的,但只有前31个字符有效 
  7.     3. 游标所对应的SELECT语句不能包含INTO子句 
  8.     4. 游标语句(DECLARE,OPEN,FETCH,CLOSE)必须在同一个预编译单元内 
  9. */  
  10. #include <stdio.h>   
  11. #include <string.h>   
  12. #include <stdlib.h>   
  13.   
  14. #include <sqlca.h>   
  15. #pragma comment(lib, "orasql10.lib")   
  16.   
  17. int connect();  
  18. void cursor();  
  19. void sql_error();  
  20.   
  21. void main()  
  22. {  
  23.     EXEC SQL WHENEVER SQLERROR DO sql_error();  // 安装错误处理句柄   
  24.     if(connect() == 0)  
  25.     {  
  26.         cursor();  
  27.         EXEC SQL COMMIT RELEASE;                // 提交事务,断开连接   
  28.     }  
  29.     else  
  30.         printf("连接失败 ");  
  31. }  
  32.   
  33. int connect()                   // connect to oracle database   
  34. {  
  35.     char username[10], password[10], server[10];  
  36.   
  37.     strcpy(username, "scott");  
  38.     strcpy(password, "zzb888888");  
  39.     strcpy(server, "orcl");  
  40.   
  41.     EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;  
  42.   
  43.     if(sqlca.sqlcode == 0)  
  44.         return 0;  
  45.     else  
  46.         return sqlca.sqlcode;  
  47. }  
  48.   
  49. void sql_error()                // print error infomation   
  50. {  
  51.     printf("%.*s ", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);  
  52. }  
  53.   
  54. void cursor()                   // 游标操作   
  55. {  
  56.     int eno;                    // 定义宿主变量   
  57.     char name[10], action;  
  58.     float salary;  
  59.   
  60.     EXEC SQL DECLARE emp_cursor SCROLL CURSOR FOR Select empno, ename, sal from emp;    // 定义游标   
  61.     EXEC SQL OPEN emp_cursor;   // 打开游标   
  62.     EXEC SQL WHENEVER NOT FOUND DO BREAK;   // 游标数据提取完毕后退出循环   
  63.     for(; ;)  
  64.     {  
  65.         printf(" F: 第一行,P:前一行,N:下一行,L:最后一行 ");  
  66.         printf("C: 当前行,X:退出 请输入具体操作:");  
  67.         scanf("%c", &action);  
  68.         fflush(stdin);  
  69.   
  70.         switch(action)  
  71.         {  
  72.         case "F":  
  73.         case "f":  
  74.             EXEC SQL FETCH FIRST emp_cursor into :eno, :name, :salary;  
  75.             break;  
  76.         case "P":  
  77.         case "p":  
  78.             EXEC SQL FETCH PRIOR emp_cursor into :eno, :name, :salary;  
  79.             break;  
  80.         case "N":  
  81.         case "n":  
  82.             EXEC SQL FETCH NEXT emp_cursor into :eno, :name, :salary;  
  83.             break;  
  84.         case "L":  
  85.         case "l":  
  86.             EXEC SQL FETCH LAST emp_cursor into :eno, :name, :salary;  
  87.             break;  
  88.         case "C":  
  89.         case "c":  
  90.             EXEC SQL FETCH CURRENT emp_cursor into :eno, :name, :salary;  
  91.             break;  
  92.         case "X":  
  93.         case "x":  
  94.             EXEC SQL CLOSE emp_cursor;  
  95.             return;  
  96.         }  
  97.         printf("name = %s(%d), salary = %.2f ", name, strlen(name), salary);  
  98.     }  
  99.   
  100.     printf("sqlca.sqlerrd[2] = %d ", sqlca.sqlerrd[2]);        // sqlca.sqlerrd[2]存放着Select语句作用的行数   
  101. }  
Oracle 培训笔记:归档模式备份恢复Oracle教程:使用非滚动游标相关资讯      Oracle教程 
  • Oracle中纯数字的varchar2类型和  (07/29/2015 07:20:43)
  • Oracle教程:Oracle中查看DBLink密  (07/29/2015 07:16:55)
  • [Oracle] SQL*Loader 详细使用教程  (08/11/2013 21:30:36)
  • Oracle教程:Oracle中kill死锁进程  (07/29/2015 07:18:28)
  • Oracle教程:ORA-25153 临时表空间  (07/29/2015 07:13:37)
  • Oracle教程之管理安全和资源  (04/08/2013 11:39:32)
本文评论 查看全部评论 (0)
表情: 姓名: 字数