E文好的請查看原文,菜鳥級翻譯,歡迎批評指正!
mysql5.0支持存儲過程後,現在mysql6.0Alpha 版本也是可用的。6.0不僅支持大型數據庫(如 oracle和如此的大多數功能(如存儲過程、視圖、觸發器、作業等,並修復了這些功能存在的bug,6.0.1 版還支持windows 64 位 和表空間。
C/c + + 要訪問 mysql,只是一些簡單的常用操作,c嵌入式簡單查詢、插入、更新和其他操作的使用可以。這些語句作為業務復雜、完整的業務功能需要的sql 操作,很大一部分是嵌入c 代碼c 代碼會導致更多和更復雜的不清楚這一次自然的存儲過程來封裝所有數據庫邏輯思想,簡單地通過調用mysql 存儲的過程 c 接口可以實現他們的目標大大減少工作量的c 程序員,但也容易處理前端業務邏輯和數據庫處理邏輯分離。在這裡只調用存儲的過程c 語言的簡單方法。
1、首先創建一個表用於存儲用戶信息
?
1
2
3
4
5
6
7
Create table student(
id int auto_increment,
name varchar(20),
age tinyint,
remark varchar(50),
primary key(id)
);
2、插入幾條用戶信息
?
1
2
Insert into student values(1,"zhouys",90, "");
commit;
3、查看剛剛插入的用戶信息
?
1
2
3
4
5
6
7
8
9
mysql> select * from student;
+------+-----------+------+----------+
| id | name | age | remark |
+------+-----------+------+----------+
| 1 | zhouys | 90 | |
+------+-----------+------+-----------+
1 row in set (0.00 sec)
mysql>
4、創建存儲過程
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
delimiter //
create procedure querystudent(
in in_id int , #0- Character ID 1-digital id
#
out out_ret int, # Returns the result
out out_name varchar(20), # First name
out out_age int # Age
)
label_a:begin
declare v_name varchar(20) ;
declare v_age tinyint ;
# Parameters determine
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'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 的句柄初始化
?
1
2
3
4
5
if(!mysql_init(&mysql))
{
printf("mysql_init failed!n");
return 0;
}
5.2、連接到MySQL數據庫
?
1
2
3
4
5
6
7
//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、調用存儲過程
?
1
2
3
4
//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、查詢返回值及輸出參數值
?
1
2
3
4
5
6
7
8
9
10
11
12
13
mysql_query(&mysql, "SELECT @ret,@ out_name,@ out_age ");
//get result
if (ret)
{
printf("Error exec query: %sn",mysql_error(&mysql));
}
else
{
printf("[%s] exec...n", query);
}
results = mysql_store_result(&mysql);
5.5、獲取結果值
?
1
2
3
while((record = mysql_fetch_row(results))) {
printf("[%s]-[%s]-[%s]n", record[0], record[1],record[2]);
}
常規的存儲過程將只返回結果,^_^。
5.6、釋放資源和mysql連接句柄
?
1
2
mysql_free_result(results);
mysql_close(&mysql);
6、結論
Mysql 的存儲過程可以實現相當強大的功能,這裡只是一些基本的用法,希望能給你一些幫助。也歡迎分享......
7、個人使用經驗心得
像C#調用都可以綁定輸出參數,直接通過輸出參數得到值,但是c++中使用prepare綁定輸出參數,卻返回以下錯誤信息:
Error Code: 1414. OUT or INOUT argument 2 for routine knockout_dbo.ko_SignUpYoungBoxer is not a variable or NEW pseudo-variable in BEFORE trigger