下面假设有一张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,学号,课程号;建立过程如下
<code class="hljs oxygene">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 ; </code>
<strong>C语言调用</strong>
<code class="hljs oxygene"><code class="hljs perl">#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 ("总分为:%s\n", sqlrow[0]); } mysql_free_result (res_ptr); } mysql_close (my_connection); return 0; }</stdio.h></code></code>