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("连接失败\n");  
  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\n", 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("\nF: 第一行,P:前一行,N:下一行,L:最后一行\n");  
  66.         printf("C: 当前行,X:退出\n请输入具体操作:");  
  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\n", name, strlen(name), salary);  
  98.     }  
  99.   
  100.     printf("sqlca.sqlerrd[2] = %d\n", sqlca.sqlerrd[2]);        // sqlca.sqlerrd[2]存放着Select语句作用的行数   
  101. }  

相关内容