导师布置了一作业:

主要目的是学习数据库最基本的操作:创建用户、创建库表,和用程序访问数据库的相关技能(编码、编译等)
1,交易流水表(包含但不限于以下字段):交易日期、交易流水(用sequence实现)、交易机构、交易柜员、交易时间、交易渠道、交易金额、用户账号、用户号、交易状态(0-成功 1-失败 )、响应码、响应信息
2,功能:编写程序 
A往交易流水表增加一条记录(信息来源是一个定长字符串,字符串包含交易要素:机构、柜员、账号、金额 等,程序解析这个字符串,然后插表)
B 生成统计文件,查询流水表,按机构、渠道等不同维度统计交易信息,生成类似下面的报表文件
 
交易日期           渠道      机构      成功笔数    成功金额    失败笔数    失败金额
20140101        柜面      10022011        100     30000   12      2000
20140101        柜面      10022012        100     30000   10      1000
20140101        网银      10022000        2000    450000  50      10000
20140102        柜面      10022011        100     30000   12      2000
20140102        柜面      10022012        100     30000   10      1000
20140102        网银      10022000        2000    450000  50      10000
 
首先是连接数据库,这个简单:

  1. int ConnectDB() {
  2. /*connect to database*/
  3. EXEC SQL BEGIN DECLARE SECTION;
  4. char s_conn[];
  5. EXEC SQL END DECLARE SECTION;
  6.  
  7. memset( s_conn, 0x00, sizeof( s_conn ));
  8. sprintf( s_conn, "finance/oracle@orcl" );
  9. EXEC SQL CONNECT :s_conn ;
  10. if ( != sqlca.sqlcode) {
  11. printf("failed!:%s\n", sqlca.sqlerrm.sqlerrmc);
  12. exit();
  13. }
  14. else {
  15. printf("success!:%s\n", sqlca.sqlerrm.sqlerrmc);
  16. }
  17.  
  18. return ;
  19. }
  1. void insert(){
  2. EXEC SQL BEGIN DECLARE SECTION;
  3. char buf[][];
  4. EXEC SQL END DECLARE SECTION;
  5.  
  6. static char input[]="2014-05-17,10022002,yannic,2014-05-17,incase,1000,1003,3,1,1,success";
  7. int i=;
  8.  
  9. char *p=strtok(input,",");
  10. while(p!=NULL)
  11. {
  12. strcpy(buf[i++],p);
  13. p=strtok(NULL,",");
  14. }
  15. for(i=;i<;i++)
  16. {
  17. printf("%d %s \n",i,buf[i]);
  18. }
  19.  
  20. /*将string转换为number*/
  21. organization=atoi(buf[]);
  22. money=atoi(buf[]);
  23. user_account=atoi(buf[]);
  24. user_id=atoi(buf[]);
  25. state=atoi(buf[]);
  26. answer_id=atoi(buf[]);
  27.  
  28. ConnectDB();
  29. EXEC SQL insert into business values(,:buf[],:organization,:buf[],:buf[],:buf[],:money,:user_account,:user_id,:state,:answer_id,:buf[]);
  30. if ( != sqlca.sqlcode) {
  31. printf("[%s]\n",sqlca.sqlerrm.sqlerrmc );
  32. }
  33. EXEC SQL COMMIT WORK RELEASE; /* 提交事务并断开数据库连接 */
  34.  
  35. }

最后是查询了,要把结果生成报表输出到文件中,最麻烦的是要打印成Excel的样式,要很有耐心呢:

  1. void selectDB()
  2. {
  3. FILE *fp;
  4. int i=0;
  5. ConnectDB();
  6.  
  7. /*定义游标*/
  8. EXEC SQL DECLARE emp_cursor CURSOR FOR
  9. select t.trade_date,t.channel,t.ORGANIZATION,
  10. NVL(s.SUCCESS,0) as succeed,//查询成功的记录,如果没有就默认为0.使用函数NVL(字段,0),设置默认值为0.
  11. NVL(s.success_money,0) as succeed_money,
  12. (t.total-NVL(s.SUCCESS,0)) as FAIL,
  13. (t.total_money-NVL(s.success_money,0)) as FAIL_MONEY
  14. from VIEW_TOTAL t ,VIEW_SUCCESS s
  15. where s.trade_date(+)=t.trade_date and s.channel (+)=t.channel and s.organization (+)= t.organization;//通过左连接,只要查询到有记录就要输出来。
  16.  
  17. EXEC SQL OPEN emp_cursor;
  18.  
  19. /* 以覆盖的方式写数据到文件*/
  20. if((fp=fopen("excel.txt","wt+"))==NULL)
  21. {
  22. printf("Cannot open file strike any key exit!");
  23. exit(1);
  24. }
  25.  
  26. char column[][20]={{"TRADE_DATE"},{"CHANNEL"},{"ORGANZATION"},{"SUCCEED"},{"SUCCEED_MONEY"},{"FAIL"},{"FAIL_MONEY"}};
  27.  
  28. fputs(" TRADE INFORMATION\n",fp);
  29. fputs(xline,fp);
  30. for(i=0;i<7;i++)
  31. {
  32. fprintf(fp,"|%-21s",column[i]);
  33.  
  34. }
  35. fputs("|\n",fp);
  36. fputs(xline,fp);//xline 是我宏定义的一行横线,方便后面使用。
  37.  
  38. for(;;){
  39. EXEC SQL WHENEVER NOT FOUND DO break;
  40. EXEC SQL FETCH emp_cursor INTO :trade_date,:channel,:organization,:succeed,:succeed_money,:fail,:fail_money;
  41. fprintf(fp,"|%-21s|%-21s|%-21d|%-21d|%-21d|%-21d|%-21d|\n",trade_date,channel,organization,succeed,succeed_money,fail,fail_money);//控制每一列数据占位长度,用格式控制符.-代表左对齐,21代表每列占位21个字符。
  42. fputs(xline,fp);
  43. }
  44. EXEC SQL CLOSE emp_cursor;
  45.  
  46. EXEC SQL COMMIT WORK RELEASE;
  47. fclose(fp);
  48.  
  49. }

  最后打印效果:

最后导师提出来了两个问题一个是char数组定义长度太小,真正项目中可能会来很长一字符串那就造成内存溢出。还有一个就是文件打开那儿我直接失败就退出,老师建议不要这样,实际项目中流程退出再重新建流程要初始化等会浪费资源,所以异常时关闭游标等资源好了,不释放这些资源的话时间长了会造成内存泄漏。

proc:基本数据库操作的更多相关文章

  1. 数据库操作语句大全(sql)

    一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...

  2. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  3. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  4. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

  5. ABP创建数据库操作步骤

    1 ABP创建数据库操作步骤 1.1 SimpleTaskSystem.Web项目中的Web.config文件修改数据库配置. <add name="Default" pro ...

  6. 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. django数据库操作和中间件

    数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...

  8. [Android Pro] 完美Android Cursor使用例子(Android数据库操作)

    reference to : http://www.ablanxue.com/prone_10575_1.html 完美 Android Cursor使用例子(Android数据库操作),Androi ...

  9. phpcms v9 中的数据库操作函数

    1.查询 $this->select($where = '', $data = '*', $limit = '', $order = '', $group = '', $key='')   返回 ...

  10. Android打造属于自己的数据库操作类。

    1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...

随机推荐

  1. java基础---->自定义gradle的插件

    这里面简单的介绍一下gradle插件的编写. 自定义gradle插件 我们编写的gradle脚本一般是放在build.gradle文件中.所以首先创建一下build.gradle文件,下面的例子都是在 ...

  2. webpack使用小记

    前言 webpack是目前前端开发必不可少的一款模块加载器兼构建工具,它能极其方便的处理各种资源的打包和使用, 让前端开发获得与后端开发几乎一致的体验. webpack特点 webpack 是以 co ...

  3. java开学考试有感以及源码

    一.感想 Java开学测试有感 九月二十号,王老师给我们上的第一节java课,测试. 说实话,不能说是十分有自信,但还好,直到看见了开学测试的题目,之前因为已经做过了王老师发的16级的题目,所以当时还 ...

  4. 无网络 使用pip安装mxnet

    # 在有网络的同系统机器上运行以下命令:pip download mxnet# 目前mxnet版本为1.3.0,执行后当前目录得到以下文件: # . # ├── certifi--py2.py3-no ...

  5. Sring 类的例子

    public class ZongHe {     public static void main(String[] args) {     function1();            funct ...

  6. 补充:CSS选择器样式的规范!

    css----页面样式,美化页面 css样式的三个规则 1内联式:直接写在html标签中 <p style="color:red"> 直接对html标签使用 style ...

  7. org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access denied for user 'root'@'localhost' (using password:

    tationProcessor' to allow for resolving potential circular referencesDEBUG 2018-05-28 11:32:35,016 o ...

  8. Ps去除背景

    http://www.16xx8.com/photoshop/jiaocheng/26905.html

  9. C和C指针小记(十四)-字符串、字符和字节

    1.字符串 C语言没有字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中. 字符串常量和适用于那些程序不会对他们进行修改的字符串. 所有其他字符串都必须存储于字符串数组或动态分配的内存 ...

  10. TypeScript笔记

    #安装typescript [1] npm install -g typescript #编译typescript tsc test.ts //会生成test.js文件 #泛型,即使用“类型变量”,函 ...