CREATE TABLE student(
id INT AUTO_INCREMENT,
name VARCHAR(20),
age TINYINT,
remark VARCHAR(50),
PRIMARY KEY(id)
);
INSERT INTO student VALUES(1, 'zhouys', 90, '');
COMMIT;
querystudentDELIMITER //
CREATE PROCEDURE querystudent(
IN in_id INT, -- 0:用名字查, 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錯誤
LEAVE label_a;
END IF;
SELECT name, age INTO v_name, v_age FROM student WHERE id = in_id;
IF (ROW_COUNT() == 0) THEN
SET out_ret = -2; -- 找不到
LEAVE label_a;
END IF;
SET out_ret = 0;
SET out_name = v_name;
SET out_age = v_age;
END //
DELIMITER ;
MYSQL mysql;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql, "localhost", "root", "", "billingdb", 0, NULL, CLIENT_MULTI_STATEMENTS)) {
// 連線失敗處理
}
char query[256];
strcpy(query, "CALL querystudent(1, @ret, @out_name, @out_age)");
mysql_real_query(&mysql, query, strlen(query));
// 取得 OUT 參數
mysql_query(&mysql, "SELECT @ret, @out_name, @out_age");
MYSQL_RES *res = mysql_store_result(&mysql);
MYSQL_ROW row = mysql_fetch_row(res);
printf("ret=%s, name=%s, age=%s\n", row[0], row[1], row[2]);
mysql_free_result(res);
mysql_close(&mysql);
mysql_init:初始化連線控制結構。mysql_real_connect:建立實際連線,需指定 CLIENT_MULTI_STATEMENTS 支援多重陳述式。mysql_real_query:執行 CALL 預存程序。mysql_query("SELECT @out_..."):查詢用戶變數取得 OUT 參數值。mysql_store_result / mysql_fetch_row:讀取結果集。mysql_free_result / mysql_close:釋放資源。嘗試用 mysql_stmt_bind_param 綁定 OUT 參數會報錯:Error 1414: OUT argument is not a variable。MySQL C API 目前對預存程序 OUT 參數的 Prepared Statement 支援有限,建議採用上述「CALL + SELECT @變數」模式,或使用 MySQL++ 等封裝庫。