C语言调用mysql的存储过程

2021-10-27 15:16:40 浏览数 (1)

下面假设有一张sc表,保存学生选课记录,有课程号,学号,平时分,卷面分,总分。 建立数据库表过程: create table class( cno varchar(8) not null, sno varchar(8) not null, ordinary_score int, last_score int, all_score int );

存储过程 由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数 默认都是一个IN参数。要指定为其它参数,可在参数名之前使用关键词IN(默认,可缺省) OUT或INOUT。 IN参数是只传入 OUT参数是只传出 INOUT参数是既传入又传入,即双向传递

指定参数为IN, OUT, 或INOUT 只对PROCEDURE是合法的。(FUNCTION参数总是被认为是IN参数)

建立存储过程,传入平时分x,卷面分y,平时分所占的比率pert,学号,课程号;建立过程如下

代码语言:javascript复制
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( xpert   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 ;</pre> 

 
C语言调用
#include <stdio.h>
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", "root", "test", 0, NULL, CLIENT_MULTI_STATEMENTS);

sprintf (buf, "call cal_grade(%d,%d,@t,%f,%s,%s)", 10, 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 ("总分为:%sn", sqlrow[0]);
    }
    mysql_free_result (res_ptr);
}
mysql_close (my_connection);

return 0;

}</pre> 

0 人点赞