导师布置了一作业:

主要目的是学习数据库最基本的操作:创建用户、创建库表,和用程序访问数据库的相关技能(编码、编译等)
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. SQL server 在附加数据库后,数据库总是变成了只读

    1.  要把数据库文件的属性改了 右键点击两个文件的属性--安全--添加--立即查找--找everyone这个用户把他的权限都勾上 确定再附加就OK. 2. 在数据库管理器中对数据库点右键属性,然后切 ...

  2. E - BD String

    众所周知,度度熊喜欢的字符只有两个:B和D. 今天,它发明了一种用B和D组成字符串的规则: S(1)=B S(2)=BBD S(3)=BBDBBDD - S(n)=S(n−1)+B+reverse(f ...

  3. css 使元素居中

    css使元素水平居中 1.对于行内元素的水平居中 给父元素设置text-align:center <div style="text-align:center;">居中显 ...

  4. 15 VScode 使用相关

    1.生成html头文件 ①:按下!键 ②:连按两下tab键  即可

  5. 【node】mongoose的基本使用

    1.安装mongoose npm install mongoose 2.启动数据库 mongod --dbpath d:\data\db 3.引入mongoose模块并连接数据库 const mong ...

  6. linux命令sync,shutdown

    1.数据同步写入磁盘: sync 输入sync,那举在内存中尚未被更新的数据,就会被写入硬盘中 hling@hling:~$ sync   2.惯用的关机指令:shutdown 实例:

  7. Ubuntu 18.04安装JDK并配置环境变量

    1.官网下载jdk 下载链接 http://www.oracle.com/technetwork/java/javase/downloads/index.html 可以根据自己的系统进行下载 2.进行 ...

  8. eclipse maven项目下载jar包失败解决办法

    1.找到我们的本地maven仓库目录 我的是 H:\Java\maven\Repository 2.搜索出该目录下的*lastUpdated.properties文件并删除,如下图所示,可以通过模糊搜 ...

  9. [Day15]常用API(Object类、String类)

    1.Java的API(API: Application(应用) Programming(程序) Interface(接口)) Java API是JDK中提供使用的类,类已经将底层代码进行封装 在JDK ...

  10. debian使用nginx创建静态文件存储

    vim /etc/nginx/sites-available/default 在server下添加 location ~ .*\.(gif|jpg|jpeg|png)$ { expires 24h; ...