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 dno, eno;               // 定义宿主变量   
  57.     char name[10];  
  58.     float salary;  
  59.   
  60.     printf("输入部门号:");  
  61.     scanf("%d", &dno);  
  62.   
  63.     EXEC SQL DECLARE emp_cursor CURSOR FOR Select empno, ename, sal from emp where deptno=:dno; // 定义游标   
  64.     EXEC SQL OPEN emp_cursor;   // 打开游标   
  65.     EXEC SQL WHENEVER NOT FOUND DO break;   // 游标数据提取完毕后退出循环   
  66.     for(; ;)  
  67.     {  
  68.         EXEC SQL FETCH emp_cursor into :eno, :name, :salary;    // 循环提取数据   
  69.         printf("name = %s(%d), salary = %.2f\n", name, strlen(name), salary);  
  70.     }  
  71.     EXEC SQL CLOSE emp_cursor;  // 关闭游标   
  72.   
  73.     printf("sqlca.sqlerrd[2] = %d\n", sqlca.sqlerrd[2]);        // sqlca.sqlerrd[2]存放着Select语句作用的行数   
  74. }  

运行结果:

输入部门号:20
name = SMITH    (9), salary = 800.00
name = JONES    (9), salary = 2975.00
name = SCOTT    (9), salary = 3000.00
name = ADAMS    (9), salary = 1100.00
name = FORD     (9), salary = 3000.00
sqlca.sqlerrd[2] = 5

相关内容