导师布置了一作业:

主要目的是学习数据库最基本的操作:创建用户、创建库表,和用程序访问数据库的相关技能(编码、编译等)
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
 
首先是连接数据库,这个简单:

 int ConnectDB() {
/*connect to database*/
EXEC SQL BEGIN DECLARE SECTION;
char s_conn[];
EXEC SQL END DECLARE SECTION; memset( s_conn, 0x00, sizeof( s_conn ));
sprintf( s_conn, "finance/oracle@orcl" );
EXEC SQL CONNECT :s_conn ;
if ( != sqlca.sqlcode) {
printf("failed!:%s\n", sqlca.sqlerrm.sqlerrmc);
exit();
}
else {
printf("success!:%s\n", sqlca.sqlerrm.sqlerrmc);
} return ;
}
   void insert(){
EXEC SQL BEGIN DECLARE SECTION;
char buf[][];
EXEC SQL END DECLARE SECTION; static char input[]="2014-05-17,10022002,yannic,2014-05-17,incase,1000,1003,3,1,1,success";
int i=; char *p=strtok(input,",");
while(p!=NULL)
{
strcpy(buf[i++],p);
p=strtok(NULL,",");
}
for(i=;i<;i++)
{
printf("%d %s \n",i,buf[i]);
} /*将string转换为number*/
organization=atoi(buf[]);
money=atoi(buf[]);
user_account=atoi(buf[]);
user_id=atoi(buf[]);
state=atoi(buf[]);
answer_id=atoi(buf[]); ConnectDB();
EXEC SQL insert into business values(,:buf[],:organization,:buf[],:buf[],:buf[],:money,:user_account,:user_id,:state,:answer_id,:buf[]);
if ( != sqlca.sqlcode) {
printf("[%s]\n",sqlca.sqlerrm.sqlerrmc );
}
EXEC SQL COMMIT WORK RELEASE; /* 提交事务并断开数据库连接 */ }

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

void selectDB()
{
FILE *fp;
int i=0;
ConnectDB(); /*定义游标*/
EXEC SQL DECLARE emp_cursor CURSOR FOR
select t.trade_date,t.channel,t.ORGANIZATION,
NVL(s.SUCCESS,0) as succeed,//查询成功的记录,如果没有就默认为0.使用函数NVL(字段,0),设置默认值为0.
NVL(s.success_money,0) as succeed_money,
(t.total-NVL(s.SUCCESS,0)) as FAIL,
(t.total_money-NVL(s.success_money,0)) as FAIL_MONEY
from VIEW_TOTAL t ,VIEW_SUCCESS s
where s.trade_date(+)=t.trade_date and s.channel (+)=t.channel and s.organization (+)= t.organization;//通过左连接,只要查询到有记录就要输出来。 EXEC SQL OPEN emp_cursor; /* 以覆盖的方式写数据到文件*/
if((fp=fopen("excel.txt","wt+"))==NULL)
{
printf("Cannot open file strike any key exit!");
exit(1);
} char column[][20]={{"TRADE_DATE"},{"CHANNEL"},{"ORGANZATION"},{"SUCCEED"},{"SUCCEED_MONEY"},{"FAIL"},{"FAIL_MONEY"}}; fputs(" TRADE INFORMATION\n",fp);
fputs(xline,fp);
for(i=0;i<7;i++)
{
fprintf(fp,"|%-21s",column[i]); }
fputs("|\n",fp);
fputs(xline,fp);//xline 是我宏定义的一行横线,方便后面使用。 for(;;){
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC SQL FETCH emp_cursor INTO :trade_date,:channel,:organization,:succeed,:succeed_money,:fail,:fail_money;
fprintf(fp,"|%-21s|%-21s|%-21d|%-21d|%-21d|%-21d|%-21d|\n",trade_date,channel,organization,succeed,succeed_money,fail,fail_money);//控制每一列数据占位长度,用格式控制符.-代表左对齐,21代表每列占位21个字符。
fputs(xline,fp);
}
EXEC SQL CLOSE emp_cursor; EXEC SQL COMMIT WORK RELEASE;
fclose(fp); }

  最后打印效果:

最后导师提出来了两个问题一个是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. 超简单C#获取带汉字的字符串真实长度(单个英文长度为1,单个中文长度为2)

    https://blog.csdn.net/u014732824/article/details/84952848 int i = System.Text.Encoding.Default.GetBy ...

  2. 在windows上搭建SSH服务踩过的坑

    前两天安装了windows操作系统,想在windows上做内网穿透,所以就想在windows下启用ssh服务,今天就来讲一下我在搭建ssh服务中遇到的坑. 我显示在Mac下搭建了ssh服务,并且测试通 ...

  3. Openwrt配置小记

    手中有台Netgear WNR2000v3,一直想尝试Openwrt,于是刷机.官方最新固件的稳定版本为15.05.1,该版本自带luci,BUT,不能保存配置,上网查了很久,得出结论,是由于WNR2 ...

  4. Golang, 以 9 个简短代码片段,弄懂 defer 的使用特点

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  5. YApi 部署记录

    YApi 是一个可本地部署的.打通前后端及QA的.可视化的接口管理平台. Step1:准备Mongo数据库 services: mongo: image: mongo restart: always ...

  6. 联想R720面板右下部分按压后和上面按键串联了

    如图所示的位置,一用力按压,就会触发键盘的按键. 前提: 本人刚刚加装了内存条,内存条是京东买的 十铨(Team) DDR4 2400 8GB 笔记本内存,安装完内存以后,发现电脑出了这样的问题. 解 ...

  7. 添加ll命令

    $ vim ~/.bashrcalias ll='ls -l'   #加入此行 ps:加入后肯能无法当场起作用,执行该句: source ~/.bashrc

  8. mysql提权常用方法。 hack某某

    一般是root权限,知道mysql root权限,root账号密码 启动项提权:原理:利用高权限的root写入一个vbs脚本到启动项,再通过一些方法如ddos,社工管理员之类的方法来让服务器重启,运行 ...

  9. jquery异步ajax超大长度base64图片长字段数据传输问题解决办法和php后台处理办法

    2017年5月9日19:25:02 在做在线签名的时候,到了图片上传的时候,使用jquery异步ajax上传base64的图片数据的时候,使用默认的方式进行数据传输偶尔会出现 生产的图片只有上半部分, ...

  10. css学习_css定位

    1.定在某个位置:简称定位 2.浮动和定位的区别 定位的分类:定位模式 a.静态定位:(标准流) b.相对定位(不脱离文档流)---以自己左上角为基准点定位 c.绝对定位absolute  (拼爹型: ...