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