`
leiliang
  • 浏览: 45756 次
社区版块
存档分类
最新评论

小题大做之MySQL 5.0存储过程编程入门

阅读更多
[b]首先看MySQL 5.0参考手册中关于创建存储过程的语法说明:


CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
   
proc_parameter:
    [ IN | OUT | INOUT ] param_name type

type:
    Any valid MySQL data type

characteristic:
    LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'

routine_body:
    Valid SQL procedure statement


如果你对MySQL还不太熟悉的话,单单看这个语法结构当然不足以进行MySQL存储过程编程。我之前基本都是使用MS SQL SERVER,所以以下记录我熟悉MySQL存储过程的过程,也是重点介绍MS SQL SERVER与MySQL区别较大的地方。


第一步,当然是写个Hello Word的存储过程,如下:
CREATE PROCEDURE phelloword()
BEGIN
  SELECT 'Hello Word!' AS F;
END;

将上面创建phelloword存储过程的语句拷到phpMyAdmin中执行,报如下错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

在这个问题上我纠缠了很久,在MySQL的命令行工具中执行同样不成功,但是根据提示信息可以知道执行在 SELECT 'Hello Word!' AS F;处结束,后面的END;没有执行,这显然会导致错误。


这里需要选择以个分隔符,语法如下:DELIMITER //
分隔符是通知MySQL客户端已经输入完成的符号。一直都是用“;”,但是在存储过程中不行,因为存储过程中很多语句都需要用到分号。
因此上面的存储过程改为:
CREATE PROCEDURE ptest()
BEGIN
  SELECT 'Hello Word!' AS F;
END //

另外在phpMyAdmin中执行时,在Delimiter文本框中填写 //,这次存储过程即可创建成功。


第二步,写一个包括参数,变量,变量赋值,条件判断,UPDATE语句,SELECT返回结果集的完整的一个存储过程,如下:
CREATE PROCEDURE plogin
(
    p_username char(15),
    p_password char(32),
    p_ip char(18),
    p_logintime datetime
)
LABEL_PROC:
  BEGIN
    DECLARE v_uid mediumint(8);
    DECLARE v_realpassword char(32);
    DECLARE v_nickname varchar(30);
    DECLARE v_oltime smallint(6);
    SELECT u.uid, u.password, f.nickname, u.oltime INTO v_uid,v_realpassword, v_nickname, v_oltime
    FROM cdb_members u INNER JOIN cdb_memberfields f ON f.uid = u.uid WHERE u.username = p_username;
    IF (v_uid IS NULL) THEN
        SELECT 2 AS ErrorCode;
        LEAVE LABEL_PROC;
    END IF;
    IF (p_password <> v_realpassword) THEN
        SELECT 3 AS ErrorCode;
        LEAVE LABEL_PROC;
    END IF;
    UPDATE ipsp_userexpands SET lastloginip = p_ip, lastlogintime = p_logintime WHERE uid = v_uid;
    SELECT 0 AS ErrorCode, v_uid AS uid, v_nickname AS nickname, v_oltime AS oltime;
END LABEL_PROC //

首先要说的是给变量赋值的语法,MySQL中使用SELECT u.uid, u.password, f.nickname, u.oltime INTO v_uid, v_realpassword, v_nickname, v_oltime FROM cdb_members u INNER JOIN cdb_memberfields f ON f.uid = u.uid WHERE u.username = p_username;这种方式给变量赋值。

其次是条件判断的语法结构,如下所示:
IF ... THEN
    ...;
ELSE
    IF ... THEN
      ...;
    ELSEIF
      ...;
    ELSE
      ...;
    END IF;
END IF;

最后说说LEAVE 语法的使用。当满足某种条件,不继续执行下面的SQL时,在MS SQL SERVER中使用RETURN语法,在MySQL中我没有找到对应的关键字,但是这里可以利用LEAVE语法来满足要求,在存储过程的BEGIN前定义一个标签,如:“LABEL_PROC:” 然后再需要用到RETURN中断执行的地方执行“LEAVE LABEL_PROC;”即可。

第三步,创建一个执行动态SQL的存储过程。
CREATE PROCEDURE ipsp_getresourcedir
(
    p_hashcode char(40)
)
LABEL_PROC:
BEGIN
    DECLARE v_sql varchar(200);
    SET v_sql = CONCAT('SELECT filedir FROM ipsp_resources WHERE hashcode =\'', p_hashcode, '\' LIMIT 0, 1');
    SET @sql = v_sql;
    PREPARE sl FROM @sql;
    EXECUTE sl;
    DEALLOCATE PREPARE sl;
END LABEL_PROC //

这里提一下 “\”是转义字符,拼接成的SQL类似 SELECT filedir FROM ipsp_resources WHERE hashcode ='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' LIMIT 0, 1

另外@sql这个属于用户变量,具体用法请查询MySQL参考手册。

如果有在MS SQL SERVER上编写存储过程的经验的话,看完这些,我想基本的MySQL存储过程编程应该可以应付了吧!

想了解更多的内容可查询MySQL参考手册或者相关书籍!
[/b]
分享到:
评论

相关推荐

    小题大做之MySQL 5.0存储过程编程入门(转)

    MySQL 5.0 存储过程编程入门是数据库管理领域中的一个重要话题,它涉及到数据库的高级功能,使得数据库系统能够执行复杂的逻辑操作,提高数据处理的效率和安全性。存储过程是一组预先编译的SQL语句,可以在需要时被...

    小题大做的解释和造句.doc

    小题大做的解释和造句.doc

    初中语文文摘社会马其顿人的小题大做

    初中语文文摘社会马其顿人的小题大做

    比较入门de个人主页(asp.net)

    当然还可以添加一些其他功能,不过都是些类似的代码,用面向对象的思想(个人感觉在web编程里asp.net最能体现C#面向对象的风格)又感觉小题大做,就省了! 开发语言:C# 开发环境:VS2008+Access 这个系统还有...

    初中语文文摘生活并非小题大做

    学院管理层没有将此事视作无足轻重的小题大做,而是从中看到了尊重和关怀每个个体的重要性。这种态度表明,无论是大型的IT项目还是日常生活中的小细节,都需要我们保持一种认真负责的态度。因为正是这些看似不起眼的...

    2020年中考语文作文高分立意方法3小题大做以大写小素材202003212125

    其中一个有效策略是“小题大做,以大写小”。这种方法强调通过深入挖掘和扩展看似平常的题材,使之蕴含更深远的主题,从而提升文章的思想内涵。 1. **小题目大做**: - **状物类小题大做**:以常见的事物为切入点...

    “小题大做”:构建深度学习的问题生成式课堂——“一道题一节课”课堂教学例析.pdf

    通过“小题大做”,教师可以设计教学活动,使学生在解决问题的过程中自然而然地培养这些素养。 4. **案例分析**: 文中以高三复习中的函数题目为例,展示了如何开展“一道题一节课”。教师首先呈现题目,然后引导...

    最新版青少版新概念1A练习册.pdf

    新概念英语1A练习册知识点总结 本资源摘要信息涵盖了新概念英语1A练习册的主要知识点,包括词汇、语法、阅读、写作等方面。 词汇 1. family /ˈfæmɪli/:家庭 2. nice /naɪs/:高兴、 Nice to meet you.(很...

    高二数学总复习小题训练及答案12精选.doc

    13. **复数的实部与虚部**:题目要求找到复数z的实部和虚部之和,需要根据复数的定义进行计算。 14. **函数图像上的点**:点在函数图像上意味着点的坐标满足函数的方程,可以通过代入法求解。 15. **函数图像的平...

    创新思维课程大纲复习过程.pdf

    创意四大方向包括:小题大做、大题小做、借题发挥和无中生有,强调在不同情境中创新应用。\n\n思考题:理解创造力的含义,探讨创意的来源和如何激发个人的创意潜力。\n\n二、直线思维与放射思维\n\n直线思维是逻辑性...

    散步教案.pdf

    【散步教案】作为教育领域的一个设计,不仅关注文本的表层阅读,更深入探讨了文章的深层含义及写作技巧,其主要目的不仅在于让学生理解作者如何巧妙运用“大词小用”、“小题大做”和“蕴藉之美”的概念,更在于引导...

    《江雪》flash公益短片制作始末大学本科毕业论文.doc

    本论文主要探讨了 Flash 动画制作的一部公益短片《江雪》的创作过程和环境保护的重要性,旨在唤醒人们对环境保护的意识,激发出人们对自然之美的追求和渴望。 Flash 动画制作是一种非常流行的动画格式,具有体积小...

    创新思维课程大纲复习过程.docx

    创意四大方向包括小题大做、大题小做、借题发挥和无中生有,强调从不同角度看待问题和寻找解决方案。 二、直线思维与放射思维 直线思维遵循逻辑和规则,而放射思维则是发散性思考,鼓励跳出常规。通过一系列数字...

    C#微软培训资料

    17.2 文件存储管理 .217 17.3 读 写 文 件 .222 17.4 异步文件操作 .227 17.5 小 结 .234 第十八章 高 级 话 题 .235 18.1 注册表编程 .235 18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 ...

    创业管理之创业精神.pptx

    例如,温州人的创业精神体现在他们的吃苦耐劳、敢于冒险和不断创新上,他们能够从无到有,将小生意发展为知名品牌,体现了“小题大做”的智慧。 硅谷的创业精神则更强调颠覆性的创新和快速行动。在这里,创业者们...

    业务推动的方法.pptx

    10. **成果评估与调整**:在推动过程中和结束后,对效果进行评估,分析不完善之处,提出改进措施。 业务推动的技巧涵盖多种方法,如借口经营、小动作大情趣、小题大做、参与式经营、活动举办和效率分析等。这些技巧...

    全国通用2016版高考数学大二轮总复习增分策略第二篇第2讲填空题的解法技巧

    【全国通用2016版高考数学大二轮总复习增分策略第二篇第...同时,提高准确性和速度,避免“小题大做”,注重解题策略的选择,以达到增分的效果。在备考过程中,不断练习和总结,提升解题技巧,是提高填空题得分的关键。

    小学数学业务学习.doc

    小学数学业务学习是一个持续发展的过程,要求教师不仅仅是教学者,更是学习者和研究者。在当前新课程改革的背景下,教师需要将理念转化为实践,教材转化为个人的教学风格,以适应不断变化的教育环境和学生需求。 ...

    SCI论文编辑教你如何准备SCI论文和写作

    在广泛阅读和积累资料的过程中,充分利用专业数据库,同时注意“选题新、方法新、资料新”的三新原则,无论是新题新做还是小题大做,都要力求观点独特,内容充实。 撰写实验研究论文时,需明确论文类型(如原著、...

    高考数学选择题解题技巧按方法编排.doc

    3. 避免小题大做,节省时间应对更复杂的解答题。 4. 在解答过程中,要注意逻辑的严密性和计算的准确性。 通过以上解析,我们可以看到,高考数学选择题的解题技巧主要包括对题目的深入理解、对选择支的合理利用和...

Global site tag (gtag.js) - Google Analytics