MYSQL数据库的存储过程有什么用,我看了一下,创建的话只是create procedure name () begin mysql  end;这种结构,使用时用call name();  这个数据库的存储过程是写在那里,调用我知道写在PHP中,谁能不能写个简单的实例。我看一下。

解决方案 »

  1.   

    mysql的存储过程和其他类型数据库的功能相同,经常的用法是用来支持事务的完整性的!至于存储过程的创建:你直接写在sql的部分,然后执行就可以了!如果你有其他第三方工具,基本上都有专门的存储过程这部分!
      

  2.   

    一个是将SQL语句封装在一起,还有提高执行效率,方便事务处理
      

  3.   

    没用过mysql的存储过程,需要的地方都用php实现。
      

  4.   

    在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。就本质而言,触发器也是一种存储过程。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。
    12.1.1 存储过程的概念
    存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。首先要说明一个问题,由于在存储过程中大多时候会执行不止一条SQL语句,但PHP默认是遇到“;”就向系统提交语句,所以就需要重定义分隔符。定义方法:delimiter //      重定义“//”为定界符;建立存储过程 Create procedure、Create function 下面是它们的格式: 
    Create procedure sp_Name ([proc_parameter ]) 
    routine_body 这里的参数类型可以是 IN /OUT /INOUT ,意思和单词的意思是一样的,IN 表示是传进来的参数, 
    OUT 是表示传出去的参数,INOUT 是表示传进来但最终传回的参数。 
    Create function sp_Name ([func_parameter ]) 
    Returns type 
    Routine_body 
    Returns type 指定了返回的类型,这里给定的类型与返回值的类型要是一样的,否则会报错。 下面给出两个简单的例子来说明: 1、 显示 Mysql 当前版本 执行结果 
    mysql> use welefen; 
    Database changed 
    mysql> delimiter //                #重定义定界符为‘//’ 
    mysql> create procedure getversion(out param1 varchar(50))      #param1为传出参数 
    -> begin 
    -> select version() into param1; #将版本的信息赋值给 param1 
    -> end 
    -> // 
    Query OK, 0 rows affected (0.00 sec) mysql> call getversion(@a);   #调用getversion()这个存储过程 
    -> // 
    Query OK, 0 rows affected (0.00 sec) mysql> select @a;    //在sql的触发器的内部,变量可以不用@,而外部需要使用@指明变量。
    -> // 
    +--------------------------+ 
    | @a | 
    +--------------------------+ 
    | 5.1.14-beta-community-nt | 
    +--------------------------+ 
    1 row in set (0.00 sec) 2、 显示”hello world” 执行结果 
    mysql> delimiter // 
    mysql> create function display(w varchar(20)) returns varchar(50) 
    -> begin 
    -> return concat('hello',w);      #连接两个字符串
    -> end 
    -> // 
    Query OK, 0 rows affected (0.05 sec) mysql> select display("world"); 
    -> // 
    +------------------+ 
    | display("world") | 
    +------------------+ 
    | hello world | 
    +------------------+ 
    1 row in set (0.02 sec) 其他操作存储过程的语句 前面我们已经知道了怎么创建存储过程,下面看看其他常用的用于操作存储过程的语句。 Alter {procedure | function} sp_Name [] Alter 语法是用来改变一个过程或函数的特征,当你想改变存储过程或者函数的结构时可以使 
    用它。当然你也可以先 drop 它再 create。 Drop {procedure | function} [if exists] sp_Name Drop 语法即用来删除一个存储程序或者函数,当你创建的一个存储过程或者函数的名字已经存 
    在时,你想把以前的给覆盖掉,那么此时你就可以使用 drop ,然后在创建。 Show create {procedure | function } sp_Name Show 语法用来显示创建的存储过程或者函数的信息。这里的 show 用法跟数据表中的 show 用 
    法是很相似的。 Show {procedure | function} status [like 'partten'] 它返回子程序的特征,如数据库,名字,类型,创建者及创建和修改日期。如果没有指定样式, 
    根据你使用的语句,所有存储程序和存储函数的信息都被列出。 看了以上的几个语法,你是不是感觉跟对表的操作很相象,那你就想对了,他们确实是很相似 
    的。带着一份激动心情我们继续往下看,你会发现很简单。 Begin ... End 语句 通过 begin end 可以来包含多个语句,每个语句以“;”结尾。 Declare 用Declare 来声明局部变量 
    Declarevar_Name type defaulevaule Delare 条件 Declare   condition_Name CONDITION FOR condition_value 调用存储过程 Call (有些数据库使用perform)格式: 
    Call   sp_Name [parameter ] 这里的 sp_Name 必须是由 create procedure 创建的名称。它可以通过声明的参数来传回值, 
    它也返回受影响的行数,在 MySQL 中可以通过 mysql_affected_rows() 来获得。流程控制语句 IF 语句 IF search_condition THEN   statement_list 
    [ELSE IF search_condition THEN statement_list] 
    [ELSE   statement_list] 
    END IF CASE 语句 CASE case_value 
    WHEN when_value THENstatement_list 
    [WHEN when_value THENstatement_list] 
    ELSE   statement_list
    END CASE LOOP 语句 [begin_label:] LOOP 
    statement_list 
    END LOOP [end_label] 
    LOOP 实现了一个简单的循环,通过 LEAVE 来退出如用IF实现:loop_label:loop
                        statements;
                        if condation then 
                        leave loop_label;
                        end if;
                        end loop;LEAVE 语句 LEAVE lable 
       #退出语句,一般可以用在循环中。 ITERATE 语句 ITERATE lable 
       #ITERATE 一般出现在 LOOP、REPEATE、WHILE 里,意思是再次循环。 REPEATE 语句 [begin_label:] REPEAT 
    statement_list 
    UNTIL   search_condition 
    END REPEAT [end_label] 
       #REPEAT 语句内的语句或语句群被重复,直至 search_condition 为真。 WHILE 语句 [begin_label:] WHILE   search_condition DO 
    statement_list 
    END WHILE [end_label] 
           #WHILE 语句内的语句或语句群被重复,直至 search_condition 为真。运用实例 下面通过几个例子来讲述他们的应用: 对网站用户的操作 为了简单,用户表只有用户名和密码的信息.在服务端,我们建立如下的表: 代码片段 
    Drop table if exists user; 
    Create table user( 
    Id int unsigned not null auto_increment, 
    Name varchar(20) not null, 
    Pwd char(32) not null, 
    Primary key(Id) 
    ); 添加用户的存储过程: 代码片段 
    Delimiter // 
    Create procedure insertuser(in username varchar(20),in userpwd varchar(32)) 
    Begin 
    Insert into welefen.user(Name,Pwd) values (username,md5(userpwd)); 
    End 
    // 验证用户的存储过程: 代码片段 
    Delimiter // 
    Create procedure validateuser(in username varchar(20),out param1) 
    Begin 
    Select Pwd into param1 from welefen.user where Name=username; 
    End 
    // 修改密码的存储过程: 代码片段 
    Delimiter // 
    Create procedure modifyPwd(in username varchar(20),in userpwd varchar(32)) 
    Begin 
    Update welefen.user set Pwd=md5(userpwd) where Name=username; 
    End 
    // 删除用户的存储过程: 代码片段 
    Delimiter // 
    Create procedure deleteuser(in username varchar(20)) 
    Begin 
    delete from welefen.user where Name=username; 
    End 
    // 在客户端,我们给出如下的程序: 代码片段 
    文件名:ProcedureUser.php 
    <?php if (!mysql_connect("localhost","root","welefen")){ 
    echo "连接数据库失败"; 

    if (!mysql_select_db("welefen")){ 
    echo "选择数据库表失败<br>"; 
    } $insert_user=array("welefen","welefen");//这里的welefen分别为用户名、密码 
    if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){ 
    echo "添加用户$insert_user[0]成功<br>"; 
    }else { 
    echo "添加用户$insert_user[0]失败<br>"; 
    } $validate_user=array("welefen","welefen");//这里的welefen分别为用户名、密码 
    mysql_query("call validateuser('$validate_user[0]',@a)"); 
    $Pwd=mysql_query("select @a"); 
    $result=mysql_fetch_array($Pwd); 
    if ($result[0]==md5($validate_user[1])){ 
    echo "用户$validate_user[0]验证正确<br>"; 
    }else { 
    echo "用户$validate_user[0]验证错误<br>"; 
    } $modify_Pwd=array("welefen","weilefeng"); //welefen为用户名weilefeng为新密码 
    if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){ 
    echo "用户$modigy_Pwd[0]的密码修改成功<br>"; 
    }else { 
    echo "用户$modigy_Pwd[0]的密码修改失败<br>"; 
    } $delete_user=array("welefen"); //welefen为用户名 
    if (mysql_query("call deleteuser('$delete_user[0]')")){ 
    echo "用户$delete_user[0]删除成功<br>"; 
    }else { 
    echo "用户$delete_user[0]删除失败<br>"; 

    ? 程序运行的结果: 执行结果 
    添加用户welefen 成功 
    用户welefen 验证正确 
    用户welefen 的密码修改成功 
    用户welefen 删除成功 以上的这个程序简单的说明了Mysql 中的存储过程结合PHP 的应用,当然在实际应用要比这个 
    复杂的多。 验证角谷猜想 角谷猜想:给定一个整数x,若x%2=1,则x=3*x+1,否则x=x/2,如此循环下去,经过有限步骤必 
    能得到1。 
    例 如 : 初 始 整 数 为 9 , 则 
    9->28->14->7->22->11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 为了说明存储过程中一些语法的应用,我们通过存储过程来实现它: 执行结果 
    mysql> delimiter // 
    mysql> create procedure jgguess(in number int) 
    -> begin 
    -> declare param1 int default 1; 
    -> set @a=concat(number); 
    -> jiaogu:loop #循环开始 
    -> set param1=number%2; 
    -> if param1=1 then set number=number*3+1; #number 为奇数,将它乘3加 1 
    -> else set number=number/2; 
    -> end if; 
    -> set @a=concat(@a,'->',number); 
    -> if number>1 then iterate jiaogu; #number 不为 1,继续循环 
    -> end if; 
    -> leave jiaogu; #退出循环 
    -> end loop jiaogu; 
    -> end 
    -> // 
    Query OK, 0 rows affected (0.00 sec) mysql> call jgguess(11); 
    -> // 
    Query OK, 0 rows affected (0.00 sec) mysql> select @a// 
    +-------------------------------------------------------+ 
    | @a | 
    +-------------------------------------------------------+ 
    | 11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 | 
    +-------------------------------------------------------+ 
    1 row in set (0.02 sec) 在这个存储过程中,你传入的参数不能超过int 型数据的范围,否则就会报错。触发器 触发器是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。例如当我们向 
    某个表插入一行数据时发生一个事件或者删除某个记录时触发某个事件。 
    语法: 
    CREATE TRIGGER trigger_Name trigger_time trigger_event 
    ON tbl_Name FOR EACHROW   trigger_stmt 
    trigger_time 是触发器的动作时间。它可以是 BEFORE 或 AFTER ,以指明触发器是在激活它的 
    语句之前或之后触发。 
    trigger_event 指明了激活触发器的语句的类型。trigger_event 可以是下述值之一: 
    INSERT:将新行插入表时激活触发器,例如,通过 INSERT、LOADDATA 和 REPLACE 语句; 
    UPDATE:更改某一行时激活触发器,例如,通过UPDATE语句; 
    DELETE:从表中删除某一行时激活触发器,例如,通过 DELETE 和 REPLACE 语句。 例如当我们向上面的user 表中增加一个用户名为“welefen ”时,我们把记录用户数的表的值增 
    加 1; 代码片段 
    Create table numuser( 
    Num int not null default 0 
    ); Delimiter // 
    Create trigger testnum after insert on welefen.user for each row 
    Begin 
    Update welefen.numuser set Num=Num+1; 
    End 
    //l例2. 注意:在执行更新时,系统自动建立一张INSERT表来保存插入数据,和一张DELETED表来保存删除的数据。如果拒绝执行,在sqlserver2000中可以使用rollback命令返回。
    CREATE TRIGGER tri_UPDATE_DELETE_XS_KC
    ON XS_KC
    FOR UPDATE,DELETE
    AS
    --检测成绩列表是否被更新
    IF UPDATE(成绩)
    BEGIN
    --显示学号、课程号、原成绩和新成绩信息
    SELECT INSERTED.课程号,DELETED.成绩 AS 原成绩(别名),
    INSERTED.成绩 AS 新成绩(别名) 
    FROM DELETED ,INSERTED
    WHERE DELETED.学号=INSERTED.学号
    END
    --检测是更新还是删除操作
    ELSE IF COLUMNS_UPDATED( )=0
    BEGIN
    --显示被删除的学号、课程号和成绩信号
    SELECT DELETED.学号,DELETED.课程号,
    DELETED.成绩 AS 原成绩
    FROM DELETED
    END
    ELSE
    --返回提示信息
    PRINT ‘更新了非成绩列!’
    游标定义:游标是一种处理数据的方法,它可对结果集进行逐行处理,可将游标视作一种指针,用于指向并处理结果集任意位置的数据。就本质而言游标提供了一种对从表中检索出的数据进行操作的灵活手段,由于游标由结果集和结果集中指向特定记录的游标位置组成,当决定对结果集进行处理时,必须声明定义一个指向该结果集的游标。 格式:declare cursor_name cursor for sql_statement                   cursor_name是游标的名字,sql_statement是一组sql语句,一个存储过程中可以使用多个游标,但不能同名。打开游标open cursor_name 取得游标的内容fetch cursor_name into variable1, varibale2…            //variable1,variable2是已经定义好的变量,又来接受内容关闭游标close cursor_name
    游标是一个可以用来循环读取数据表的对象,每次读取数据表的一行。
      

  5.   

    存储过程是把一系列的事务写出来,放在数据库种,使用的时候直接调用。因为是执行在数据端的所以非常高效。一般mysql这种小型数据库都用不着。