proc:基本数据库操作

导师布置了一作业:

主要目的是学习数据库最基本的操作:创建用户、创建库表,和用程序访问数据库的相关技能(编码、编译等)

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

最后是查询了,要把结果生成报表输出到文件中,最麻烦的是要打印成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数组定义长度太小,真正项目中可能会来很长一字符串那就造成内存溢出。还有一个就是文件打开那儿我直接失败就退出,老师建议不要这样,实际项目中流程退出再重新建流程要初始化等会浪费资源,所以异常时关闭游标等资源好了,不释放这些资源的话时间长了会造成内存泄漏。

时间: 2024-10-09 06:44:49

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

C# .NET更智能的数据库操作的封装

前述: 对数据库操作的封装,相信网络上已经有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持数据库操作.这篇文章是分享自己所思考的,对数据库操作的简单封装.我对于这篇文章,认为被浏览者所关注重点的是怎么分析设计数据库操作封装,代码是其次.而且,这是我第一篇文章,为了想好怎么实现花了些天,代码是博客发表时现写的.所以我想,使用可能还有bug,而且没有try catch异常的设计. 这个框架我理应做到对数据库无关,无论是哪个数据库都能够使用.不过,重点在于分析,而不是代码.所以,为了更好的

python--第十一天总结(paramiko 及数据库操作)

数据库操作 Python 操作 Mysql 模块的安装 linux:     yum install MySQL-python window:     http://files.cnblogs.com/files/wupeiqi/py-mysql-win.zip

数据库——基础(数据库操作,表格操作)——增加高级查询

笔记 LAMP:Linx(操作系统) A(阿帕奇)——网页的应用程序 M(Mysql):体积小,应用简单 P(PHP) 第一步:搭建网页环境——A\M\P WAMP:用WAMP搭建环境 DW:更好的显示 数据库的基本操作: 数据库——表结构——字段(列) 每一行数据成为一条数据(记录) 特点:关系型数据库,有严格的规范 1.必须有主键:能够唯一标识一条数据的字段 2 T-SQL:通用的数据库操作语句 自增长列code(主键列) ;连接键表 最后一个字段不加 ,#注释 创建表:create tab

SQLiteDatabase数据库操作详解

今天花了点时间总结了一下数据的相关知识android中系统自带的数据库SQLiteDatabase数据库,这种数据库操作起来比ormLite数据库(第三方的)麻烦点,但是我对这种数据库操作比较熟悉所以我就采用了这种数据库,如有错误欢迎大家批评指正,谢谢 1.SQLiteDatabase SQLiteDatabase本身是一个数据库的操作类,但是如果想进行数据库的操作,还需要android.database.sqlite.SQLiteOpenHelper类的帮助,在执行SQL语句时execSQL(

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

1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要去做增删改查的操作的时候,就得通过getWritableDatabase获取一个SQLiteDataBase然后老老实实去写操作值的put以及查询返回的Cursor处理,其实我们可以搞一个对象来帮我们干这些事情,打造属于你自己的数据库操作类. 2.操作类的初显形 假设现在我们什么都没有,我们要去搞一

laravel 数据库操作小例子

public function demo() { $res = null; //insert数据插入 //$user=array('username'=>'joy','password'=>'123456','age'=>23); //$res = DB::table('users')->insert($user); /* 数据查询 $res = DB::table('users')->where('username','joy')->get(); $res = DB:

常用的Mysql数据库操作语句大全

零.用户管理: 1.新建用户: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2.更改密码: >SET PASSWORD FOR name=PASSWORD('fdddfd'); 3.权限管理 >SHOW GRANTS FOR name;    //查看name用户权限 >GRANT SELECT ON db_name.* TO name; //给name用户db_name数据库的所有权限 >REVOKE SELECT ON db_n

人事管理系统——数据库操作类

连接数据库类主要代码: 1 package PersonSystem; 2 3 import java.sql.*; 4 /** 5 * 6 * 连接数据库的类 7 * 8 */ 9 public class Database 10 { 11 private Statement stmt = null; 12 ResultSet rs = null; 13 private Connection conn = null; 14 String sql; 15 String strurl = "jdb

SQL数据库操作整理

1.规范 ①关键字与函数名称全部大写: ②数据库名称.表名称.字段名称全部小写: ③SQL语句必须以分号结尾. 2.数据库操作 // 1. 创建数据库,其中[]表示可以省略 CREATE { DATABASE | SCHEMA } [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name; // 2. 显示当前服务器下的数据库列表 SHOW { DATABASES | SCHEMAS } [LIKE 'pattern' |

C# .NET数据库操作

C# .NET更智能的数据库操作的封装完整版(重构) 前述: 第一次发表文章,不过是对数据库简单的封装,主要是阐述下思路.那么在上篇文章,在大家的指导下和提出意见,并自己对代码进行了思考.在这两天我重构了新的框架,我觉得我写的可以称得上框架,为什么?请大家往下看.不过在项目中没有很多注释.笔者除了课余学习时候,大部分时间在完成学校的功课,没有许多时间,所以也就偷下懒,请大家体谅. 这次框架分为几个部分:拼接数据库语句.数据库执行.数据库连接控制.异常类.用户使用的DbHelper.等下我回用文字