一个使用Pro*C实现增删改查的小例子

来源:互联网 发布:js实现扑克牌自动洗牌 编辑:程序博客网 时间:2024/05/20 05:09

http://blog.csdn.net/t0nsha/article/details/5795800



环境:

WinXPSP3 + VC6 + ORACLE 11g

步骤:

1)新建demo.pc,内容如下:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. // 全程说明段  
  4. EXEC SQL BEGIN DECLARE SECTION;  
  5.     VARCHAR username[20];  
  6.     VARCHAR password[20];  
  7. EXEC SQL END DECLARE SECTION;  
  8.   
  9. // 说明通讯区  
  10. EXEC SQL INCLUDE sqlca;  
  11.   
  12. // 外部函数说明  
  13. void insert(),update(),del(),query();  
  14.   
  15. main()  
  16. {  
  17.     char operate[5];  
  18.   
  19.     // 登录到oracle  
  20.     strcpy(username.arr,"SCOTT"); // 用户名  
  21.     username.len=strlen(username.arr);  
  22.     strcpy(password.arr,"x"); // 密码  
  23.     password.len=strlen(password.arr);  
  24.   
  25.     EXEC SQL WHENEVER SQLERROR GOTO logon_error;  
  26.     EXEC SQL CONNECT :username IDENTIFIED BY :password;  
  27.     printf("/nConnect to ORACLE as user: %s",username.arr);  
  28.       
  29.     for(;;)  
  30.     {  
  31.         printf("/n***********************");  
  32.         printf("/n* 1.Query     *");  
  33.         printf("/n* 2.Update    *");  
  34.         printf("/n* 3.Insert    *");  
  35.         printf("/n* 4.Delete    *");  
  36.         printf("/n* 5.Exit      *");  
  37.         printf("/n***********************");  
  38.         printf("/n Enter selection:/n");  
  39.         gets(operate);  
  40.   
  41.         switch(operate[0])  
  42.         {  
  43.             case '1':query();  
  44.                  break;  
  45.             case '2':update();  
  46.                  break;  
  47.             case '3':insert();  
  48.                  break;  
  49.             case '4':del();  
  50.                  break;  
  51.             case '5':break;  
  52.             default :printf("/n/n invalid selection/n");  
  53.                  break;  
  54.         }  
  55.         if(operate[0]=='5')  
  56.             break;  
  57.     }  
  58.   
  59.     // 结束处理   
  60.     EXEC SQL COMMIT RELEASE;  
  61.     printf("/n/n very good !/n/n");  
  62.     exit(0);  
  63.   
  64. // 登录出错处理  
  65. logon_error:  
  66.     printf("/n invalid username/password/n");  
  67.     printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);  
  68.     EXEC SQL WHENEVER SQLERROR CONTINUE;  
  69.     EXEC SQL ROLLBACK RELEASE;  
  70.     exit(1);  
  71. }  
  72.   
  73. // 更新处理  
  74. void update()  
  75. {  
  76.     EXEC SQL BEGIN DECLARE SECTION;  
  77.         int emp_number;  
  78.         VARCHAR emp_name[20];  
  79.         VARCHAR job[50];  
  80.         short ind_job;  
  81.     EXEC SQL END DECLARE SECTION;  
  82.   
  83.     char empnum[8];  
  84.   
  85.     printf("/n/nEnter employee number(press RETURN to abort):");  
  86.     gets(empnum);  
  87.     if(!strcmp(empnum,""))  
  88.     {  
  89.         printf("/n");  
  90.         return;  
  91.     }  
  92.     emp_number = atoi(empnum);  
  93.     EXEC SQL WHENEVER SQLERROR GOTO sqlerror;  
  94.     EXEC SQL WHENEVER NOT FOUND GOTO notfound;  
  95.   
  96.     EXEC SQL SELECT ENAME,JOB  
  97.         INTO :emp_name,:job:ind_job  
  98.         FROM EMP  
  99.         WHERE EMPNO = :emp_number;  
  100.     emp_name.arr[emp_name.len]='/0';  
  101.     switch(ind_job)  
  102.     {  
  103.         case -1:strcpy(job.arr,"NULL");  
  104.             job.len=strlen(job.arr);  
  105.             break;  
  106.         case 0:job.arr[job.len]='/0';  
  107.             break;  
  108.         default:if(ind_job>0)  
  109.             printf("/n/nWARNING: Job truncated./n");  
  110.             break;  
  111.     }  
  112.     printf("/n/nNumber Employee Name Job/n");  
  113.     printf("----------------------------------/n");  
  114.     printf("%-9d%-15s%-8s/n",emp_number,emp_name.arr,job.arr);  
  115.     printf("/nEnter new employee name:");  
  116.     gets(emp_name.arr);  
  117.     emp_name.len=strlen(emp_name.arr);  
  118.     printf("/n/nEnter new job:");  
  119.     gets(job.arr);  
  120.     job.len=strlen(job.arr);  
  121.     ind_job=0;  
  122.     if(!strcmp(job.arr,""))  
  123.         ind_job=-1;  
  124.     EXEC SQL UPDATE EMP  
  125.         SET ENAME= :emp_name,JOB=:job:ind_job  
  126.         WHERE EMPNO= :emp_number;  
  127.     printf("/n/nEmployee %d updated./n",emp_number);  
  128.     EXEC SQL COMMIT;  
  129.     return;  
  130.   
  131. notfound:  
  132.     printf("/n/nWARNING: Employee %d does not exist./n",emp_number);  
  133.     return;  
  134. sqlerror:  
  135.     printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);  
  136.     EXEC SQL WHENEVER SQLERROR CONTINUE;  
  137.     EXEC SQL ROLLBACK;  
  138.     exit(1);  
  139. }  
  140.   
  141. // 插入处理  
  142. void insert()  
  143. {  
  144.     EXEC SQL BEGIN DECLARE SECTION;  
  145.         int emp_number;  
  146.         VARCHAR emp_name[20];  
  147.         VARCHAR job[20];  
  148.         short ind_job;  
  149.     EXEC SQL END DECLARE SECTION;  
  150.   
  151.     char empnum[8];  
  152.     printf("/n/nEnter employee number(press RETURN to abort):");  
  153.     gets(empnum);  
  154.     if(!strcmp(empnum,""))  
  155.     {  
  156.         printf("/n");  
  157.         return;  
  158.     }  
  159.     emp_number = atoi(empnum);  
  160.     EXEC SQL WHENEVER SQLERROR GOTO sqlerror;  
  161.     EXEC SQL WHENEVER NOT FOUND GOTO resume;  
  162.   
  163.     EXEC SQL SELECT ENAME INTO :emp_name  
  164.         FROM EMP  
  165.         WHERE EMPNO = :emp_number;  
  166.     printf("/n/nWARNING: Employee %d alread exist./n",emp_number);  
  167.   
  168.     return;  
  169.   
  170. resume:  
  171.     printf("/n/nEnter employee name:");  
  172.     gets(emp_name.arr);  
  173.     emp_name.len=strlen(emp_name.arr);  
  174.   
  175.     printf("/n/nEnter job:");  
  176.     gets(job.arr);  
  177.     job.len=strlen(job.arr);  
  178.     ind_job=0;  
  179.     if(!strcmp(job.arr,""))  
  180.         ind_job = -1;  
  181.     EXEC SQL INSERT INTO EMP(EMPNO,ENAME,JOB)  
  182.         VALUES(:emp_number,:emp_name,:job:ind_job);  
  183.       
  184.     printf("/n/nEmployee %d inserted. /n",emp_number);  
  185.     EXEC SQL COMMIT;  
  186.     return;  
  187.       
  188. sqlerror:  
  189.     printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);  
  190.     EXEC SQL WHENEVER SQLERROR CONTINUE;  
  191.     EXEC SQL ROLLBACK;  
  192.     exit(1);  
  193. }  
  194.   
  195. // 查询处理  
  196. void query()  
  197. {  
  198.     EXEC SQL BEGIN DECLARE SECTION;  
  199.         int emp_number;  
  200.         VARCHAR emp_name[20];  
  201.         VARCHAR job[20];  
  202.         short ind_job;  
  203.     EXEC SQL END DECLARE SECTION;  
  204.   
  205.     char empnum[8];  
  206.     printf("/n/nEnter Employee number (press RETURN to abort):");  
  207.     gets(empnum);  
  208.     if(!strcmp(empnum,""))  
  209.     {  
  210.         printf("/n");  
  211.         return;  
  212.     }  
  213.   
  214.     emp_number = atoi(empnum);  
  215.     EXEC SQL WHENEVER SQLERROR GOTO sqlerror;  
  216.     EXEC SQL WHENEVER NOT FOUND GOTO notfound;  
  217.     EXEC SQL SELECT ENAME,JOB  
  218.         INTO :emp_name,:job:ind_job  
  219.         FROM EMP  
  220.         WHERE EMPNO = :emp_number;  
  221.     emp_name.arr[emp_name.len]='/0';  
  222.     switch(ind_job)  
  223.     {  
  224.         case -1:strcpy(job.arr,"NULL");  
  225.             job.len=strlen(job.arr);  
  226.             break;  
  227.         case 0:job.arr[job.len]='/0';  
  228.             break;  
  229.         default:if(ind_job >0 )  
  230.             printf("/n/nWARNING: Job truncated./n");  
  231.             break;  
  232.     }  
  233.     printf("/n/nNumber Employee Name Job/n");  
  234.     printf("------------------------------------------/n");  
  235.     printf("%-9d%-15s%-8s/n",emp_number,emp_name.arr,job.arr);  
  236.     return;  
  237.   
  238. notfound:  
  239.     printf("/n/nWARING: Employee %d does not exist./n",emp_number);  
  240.     return;  
  241. sqlerror:  
  242.     printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);  
  243.     EXEC SQL WHENEVER SQLERROR CONTINUE;  
  244.     EXEC SQL ROLLBACK;  
  245.     exit(1);  
  246. }  
  247.   
  248. // 删除处理  
  249. void del()  
  250. {  
  251.     EXEC SQL BEGIN DECLARE SECTION;  
  252.         int emp_number;  
  253.     EXEC SQL END DECLARE SECTION;  
  254.       
  255.     char empnum[8];  
  256.   
  257.     printf("/n/nEnter employee number(press RETURN to abort):");  
  258.     gets(empnum);  
  259.     if(!strcmp(empnum,""))  
  260.     {  
  261.         printf("/n");  
  262.         return;  
  263.     }  
  264.     emp_number = atoi(empnum);  
  265.     EXEC SQL WHENEVER SQLERROR GOTO sqlerror;  
  266.     EXEC SQL WHENEVER NOT FOUND GOTO notfound;  
  267.     EXEC SQL DELETE   
  268.         FROM EMP  
  269.         WHERE EMPNO = :emp_number;  
  270.     printf("/n/nEmployee %d deleted./n",emp_number);  
  271.     EXEC SQL COMMIT;  
  272.     return;  
  273.   
  274. notfound:  
  275.     printf("/n/nWARING: Employee %d does not exist./n",emp_number);  
  276.     return;  
  277. sqlerror:  
  278.     printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);  
  279.     EXEC SQL WHENEVER SQLERROR CONTINUE;  
  280.     EXEC SQL ROLLBACK;  
  281.     exit(1);  
  282. }  

2)将demo.pc预编译成demo.c:

[c-sharp] view plaincopy
  1. proc demo.pc  

3)将demo.c编译成demo.obj:

[c-sharp] view plaincopy
  1. cl demo.c /nologo /c /I F:/app/tonko/product/11.1.0/db_1/precomp/public  

4)将demo.obj链接成demo.exe:

[c-sharp] view plaincopy
  1. link demo.obj /nologo /LIBPATH:F:/app/tonko/product/11.1.0/db_1/precomp/LIB orasql11.lib  

5)执行demo.exe进行测试。

0 0