delimiter //
CREATE PROCEDURE cal_grade(x INT,y INT,out t int,pert float,s VARCHAR(8),c VARCHAR(8))
LABEL_PROC:
BEGIN
IF ( x < 0 || x > 100 ) THEN
SET t = -1;
LEAVE LABEL_PROC;
END IF;
IF ( y < 0 || y > 100 ) THEN
SET t = -2;
LEAVE LABEL_PROC;
END IF;
SET t = ROUND( x*pert + y*(1-pert) );
UPDATE sc SET ordinary_score=x,last_score=y WHERE sno=s AND cno=c AND tno=tn;
END LABEL_PROC //
delimiter ;
C语言调用
#include
#include "mysql.h"
int main()
{
MYSQL *my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
char buf[100];
my_connection = mysql_init (NULL);
//下面连接的最后一个参数必须为CLIENT_MULTI_STATEMENTS,不然就会报错select error: PROCEDURE *** can’t return a result set in the given context
my_connection = mysql_real_connect (my_connection,"localhost","root","test",NULL,CLIENT_MULTI_STATEMENTS);
sprintf (buf,"call cal_grade(%d,%d,@t,%f,%s,%s)",10,0.3,123,456);
if ( mysql_query (my_connection,buf) )
sprintf (stderr,mysql_error (my_connection));
else
{
//获得返回参数@t,@t是传出参数
mysql_query (my_connection,"select @t");
res_ptr = mysql_store_result (my_connection);
if (res_ptr)
{
sqlrow = mysql_fetch_row (res_ptr);
if (!strcmp (sqlrow[0],"-1"))
printf ("平时分不在范围之内\n");
else if (!strcmp (sqlrow[0],"-2"))
printf ("卷面分不在范围之内\n");
else
printf ("总分为:%s\n",sqlrow[0]);
}
mysql_free_result (res_ptr);
}
mysql_close (my_connection);
return 0;
}