文章来自:http://blog.csdn.net/jccz_zys/archive/2007/07/08/1682810.aspx
mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出。6.0不仅支持大型数据库如oracle等的绝大部分功能,如存储过程、视图、触发器、job等等,而且修正了这些功能所存在的bug,其中6.0.1还支持64位windows,以及表空间。
在c/c++中访问mysql,常见的只是一些简单的业务,使用c中嵌入简单的查询、插入、更新等操作即可。随着业务的复杂化,完成一个业务功能需要非常多的sql操作环节,把这些语句都嵌入c代码中会导致c代码越来越繁琐、不清晰,这时候,自然就想到了存储过程来封装所有的数据库逻辑,通过c简单调用mysql存储过程接口即可达到目的,极大地减轻了c程序员的工作量,也便于前端业务处理逻辑与数据库处理逻辑的分离。下面就介绍c语言调用存储过程的简单的方法。 1、首先创建一张表 用于存放用户信息 Create table student( id int auto_increment, name varchar(20), age tinyint, remark varchar(50), primary key(id) ); 2、插入几条信息 Insert into student values(1,"zhouys",90, ""); commit; 3、查看用户信息 mysql> select * from student; +------+-----------+------+----------+ | id | name | age | remark | +------+-----------+------+----------+ | 1 | zhouys | 90 | | +------+-----------+------+-----------+ 1 row in set (0.00 sec) mysql> 4、创建存储过程 如下: delimiter // create procedure querystudent( in in_id int , #0- 字符id 1-数字id # out out_ret int, # 返回结果 out out_name varchar(20), # 名字 out out_age int # 年龄 ) label_a:begin declare v_name varchar(20) ; declare v_age tinyint ; # 参数判断 if (in_id<=0) then set out_ret=-1; #id error leave label_a; end if; SELECT name,age into v_name,v_age from student where id=in_id limit 1; if v_age is NULL then set out_ret=-2; #don't found leave label_a; end if; set out_ret=0; set out_name=v_name; set out_age=v_age; end; // delimiter ; 5、c语言调用存储过程 调用方法或步骤: 5.1 、初始化 Mysql 句柄 if(!mysql_init(&mysql)) { printf("mysql_init failed!/n"); return 0; } 5.2 、连接到 mysql //login or connect if(!mysql_real_connect(&mysql,"localhost","root","","billingdb",0,NULL,CLIENT_MULTI_STATEMENTS)) { printf("mysql_real_connect() failed!/n"); mysql_close(&mysql); return 0; } 5.3 、调用存储过程 //call strcpy(query,"call querystudent (1,@ret,@ out_name,@ out_age)"); printf("query sql=[%s]/n",query); ret= mysql_real_query(&mysql,query,(unsigned int)strlen(query)); 5.4 、查询结果集并保存 mysql_query(&mysql, "SELECT @ret,@ out_name,@ out_age "); //get result if (ret) { printf("Error exec query: %s/n",mysql_error(&mysql)); } else { printf("[%s] exec.../n", query); } results = mysql_store_result(&mysql); 5.5 、获取查询结果 while((record = mysql_fetch_row(results))) { printf("[%s]-[%s]-[%s]/n", record[0], record[1],record[2]); } 一般存储过程只会有一行的返回结果,^_^. 5.6 、释放资源与 mysql 连接句柄 mysql_free_result(results); mysql_close(&mysql); 6、结束语 Mysql 存储过程可以实现相当强大的功能,这里只是抛砖引玉的做一些实践,期望能够给大家一些帮助。也欢迎大家交流…