精华内容
下载资源
问答
  • 我写了一个存储过程,希望能在程序运行的时候,第一次检查有无该过程,没有的话就自动创建,但我没有例子,在网上也找不到答案. 我用的是vb.net代码,希望有人能帮帮忙
  • mysql存储过程使用教程希望这本书能像内行专家那样与您进行对话,用简单的问题、例子让你学到需要的知识。为了达到这样的目的,我会从每一个细节开始慢慢的为大家建立概念,最后会给大家展示较大的实用例,在学习...

    mysql存储过程的使用教程

    希望这本书能像内行专家那样与您进行对话,用简单的问题、例子让你学到需要的知识。为了达到这样的目的,我会从每一个细节开始慢慢的为大家建立概念,最后会给大家展示较大的实用例,在学习之前也许大家会认为这个用例很难,但是只要跟着课程去学,相信很快就能掌握。

    Conventions and Styles 约定和编程风格

    每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样。

    在这里举个例子:mysql> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)

    如果实例比较大,则需要在某些行和段落间加注释,同时我会用将“

    mysql> CREATE PROCEDURE p ()

    -> BEGIN

    -> /* This procedure does nothing */  END;//Query OK, 0 rows affected (0.00 sec)

    有时候我会将例子中的”mysql>”和”->”这些系统显示去掉,你可以直接将代码复制到mysql客户端程序中(如果你现在所读的不 是电子版的,可以在mysql.com网站下载相关脚本)所以的例子都已经在Suse 9.2 Linux、Mysql 5.0.3公共版上测试通过。

    在您阅读本书的时候,Mysql已经有更高的版本,同时能支持更多OS了,包括Windows,Sparc,HP-UX。因此这里的例子将能正常的运行在您的电脑上。但如果运行仍然出现故障,可以咨询你认识的资深Mysql用户,以得到长久的支持和帮助。

    Why MySQL Statements are Legal in a Procedure Body

    什么MySQL语句在存储过程体中是合法的?

    什么样的SQL语句在Mysql存储过程中才是合法的呢?你可以创建一个包含INSERT, UPDATE,DELETE, SELECT, DROP, CREATE, REPLACE等的语句。你唯一需要记住的是如果代码中包含MySQL扩充功能,那么代码将不能移植。在标准SQL语句中:任何数据库定义语言都是合法 的,如:

    CREATE PROCEDURE p () DELETE FROM t; //

    SET、COMMIT以及ROLLBACK也是合法的,如:

    CREATE PROCEDURE p () SET @x = 5; //

    MySQL的附加功能:任何数据操作语言的语句都将合法。

    CREATE PROCEDURE p () DROP TABLE t; //

    MySQL扩充功能:直接的SELECT也是合法的:

    CREATE PROCEDURE p () SELECT ‘a’; //

    顺便提一下,我将存储过程中包括DDL语句的功能称为MySQL附加功能的原因是在SQL标准中把这个定义为非核心的,即可选组件。

    The New SQL Statements 新SQL语句

    Variables 变量

    在复合语句中声明变量的指令是DECLARE。

    (1) Example with two DECLARE statements

    两个DECLARE语句的例子

    CREATE PROCEDURE p8 ()

    BEGIN

    DECLARE a INT;

    DECLARE b INT;

    SET a = 5;

    SET b = 5;

    INSERT INTO t VALUES (a);

    SELECT s1 * a FROM t WHERE s1 >= b;

    END; // /* I won’t CALL this */

    在过程中定义的变量并不是真正的定义,你只是在BEGIN/END块内定义了而已(译注:也就是形参)。

    Error Handling 异常处理

    好了,我们现在要讲的是异常处理

    1. Sample Problem: Log Of Failures 问题样例:故障记录

    当INSERT失败时,我希望能将其记录在日志文件中我们用来展示出错处理的问题样例是很

    普通的。我希望得到错误的记录。当INSERT失败时,我想在另一个文件中记下这些错误的

    信息,例如出错时间,出错原因等。我对插入特别感兴趣的原因是它将违反外键关联的约束

    2. Sample Problem: Log Of Failures (2)

    mysql> CREATE TABLE t2

    s1 INT, PRIMARY KEY (s1))

    engine=innodb;//

    mysql> CREATE TABLE t3 (s1 INT, KEY (s1),

    FOREIGN KEY (s1) REFERENCES t2 (s1))

    engine=innodb;//

    mysql> INSERT INTO t3 VALUES (5);//

    ERROR 1216 (23000): Cannot add or update a child row: a foreign key

    constraint fails(这里显示的是系统的出错信息)

    我开始要创建一个主键表,以及一个外键表。我们使用的是InnoDB,因此外键关联检查是打

    开的。然后当我向外键表中插入非主键表中的值时,动作将会失败。当然这种条件下可以很

    快找到错误号1216。

    3. Sample Problem: Log Of Failures

    CREATE TABLE error_log (error_message

    CHAR(80))//

    展开全文
  • MySQL 存储过程是一些 SQL 语句的集合,比如有的时候我们可能需要一大串的 SQL 语句,...语法格式:可以使用 CREATE PROCEDURE 语句创建存储过程。语法格式如下:CREATE PROCEDURE ( [过程参数[,…] ] ) [过程参数...

    MySQL 存储过程是一些 SQL 语句的集合,比如有的时候我们可能需要一大串的 SQL 语句,或者说在编写 SQL 语句的过程中还需要设置一些变量的值,这个时候我们就完全有必要编写一个存储过程。下面我们来介绍一下如何创建一个存储过程。

    a454cd1f11e2a35cf18f4c99bb9769cf.png

    语法格式:

    可以使用 CREATE PROCEDURE 语句创建存储过程。

    语法格式如下:CREATE PROCEDURE ( [过程参数[,…] ] )

    [过程参数[,…] ] 格式

    [ IN | OUT | INOUT ]

    语法说明如下:

    1) 过程名

    存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即 db_name.sp_name。需要注意的是,名称应当尽量避免选取与 MySQL 内置函数相同的名称,否则会发生错误。

    2) 过程参数

    存储过程的参数列表。其中,为参数名,为参数的类型(可以是任何有效的 MySQL 数据类型)。当有多个参数时,参数列表中彼此间用逗号分隔。存储过程可以没有参数(此时存储过程的名称后仍需加上一对括号),也可以有 1 个或多个参数。

    MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。其中,输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。需要注意的是,参数的取名不要与数据表的列名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作列名,从而引发不可预知的结果。

    3) 过程体

    存储过程的主体部分,也称为存储过程体,包含在过程调用的时候必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若存储过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。

    在存储过程的创建中,经常会用到一个十分重要的 MySQL 命令,即 DELIMITER 命令,特别是对于通过命令行的方式来操作 MySQL 数据库的使用者,更是要学会使用该命令。

    在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,这样显然不行。为解决这个问题,通常可使用 DELIMITER 命令将结束命令修改为其他字符。

    语法格式如下:DELIMITER $$

    语法说明如下:$$ 是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“?”或两个“¥”等。当使用 DELIMITER 命令时,应该避免使用反斜杠“\”字符,因为它是 MySQL 的转义字符。

    在 MySQL 命令行客户端输入如下SQL语句。mysql > DELIMITER ??

    成功执行这条 SQL 语句后,任何命令、语句或程序的结束标志就换为两个问号“??”了。

    若希望换回默认的分号“;”作为结束标志,则在 MySQL 命令行客户端输入下列语句即可:mysql > DELIMITER ;

    注意:DELIMITER 和分号“;”之间一定要有一个空格。在创建存储过程时,必须具有 CREATE ROUTINE 权限。可以使用 SHOW PROCEDURE STATUS 命令查看数据库中存在哪些存储过程,若要查看某个存储过程的具体信息,则可以使用 SHOW CREATE PROCEDURE 。

    创建不带参数的存储过程

    存储过程的作用是从学生成绩信息表中查询学生的成绩信息,输入的 SQL 语句和执行过程如下所示。mysql> DELIMITER //

    mysql> CREATE PROCEDURE ShowStuScore()

    -> BEGIN

    -> SELECT * FROM tb_students_score;

    -> END //

    Query OK, 0 rows affected (0.09 sec)

    展开全文
  • hibernate怎么使用存储过程 Hibernate3.x调用存储过程摘要:本文以详尽的实例展示了hibernate3.x中调用存储过程各步骤,从建立测试表、存储过程的建立、工程的建立以及类的编写和测试一步一步引导用户学习...

    hibernate怎么使用存储过程

    Hibernate3.x调用存储过程 

    摘要:本文以详尽的实例展示了hibernate3.x中调用存储过程各步骤,从建立测试表、存储过程的建立、工程的建立以及类的编写和测试一步一步引导用户学习hibernate3.x中调用存储过程的方法.
    如果底层数据库(eg. Oracle、mysql、sqlserver)等支持存储过程,可通过存储过程执行批量删除、更新等操作。本文以实例说明在hibernate3.x中如何调用存储过程。
      说明:本例hibernate所用版本为3.0,mysql所用版本为5.0,所用数据库驱动为mysql-connector-java-5.0.4-bin.jar。
    一.             建表与初始化数据
    在mysql的test数据库中建立一张新表:tbl_user,建表语句如下:
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `tbl_user` (
      `userid` varchar(50) NOT NULL,
      `name` varchar(50) default '',
      `blog` varchar(50) default '',
      PRIMARY KEY (`userid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
    建表成功后,在该表中插入如下4条初始数据,对应的sql语句如下:
    INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('ant', '蚂蚁', 'http://www.blogjava.net/qixiangnj');
    INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('beansoft', 'bean', 'http://www.blogjava.net/beansoft');
    INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('sterning', '似水流年', 'http://www.blogjava.net/sterning');
    INSERT INTO `tbl_user` (`userid`,`name`,`blog`) VALUES ('tom', 'tom' , 'http://www.blogjava.net/tom');
    二.             建立存储过程
    为测试hibernate3.x中存储过程的调用,我们在user表中建立getUserList、createUser、updateUser和deleteUser这四个存储过程,在mysql中建立存储过程的语句如下:
    1. 获得用户信息列表的存储过程--getUserList 
    DROP PROCEDURE IF EXISTS `getUserList`;
    CREATE PROCEDURE `getUserList`()
    begin
         select * from tbl_user;
    end;
    2. 通过传入的参数创建用户的存储过程--createUser 
    DROP PROCEDURE IF EXISTS `createUser`;
    CREATE PROCEDURE `createUser`(IN userid varchar(50), IN name varchar(50), IN blog varchar(50))
    begin
        insert into tbl_user values(userid, name, blog);
    end;
    3. 通过传入的参数更新用户信息的存储过程--updateUser
    DROP PROCEDURE IF EXISTS `updateUser`;
    CREATE PROCEDURE `updateUser`(IN nameValue varchar(50), IN blogValue varchar(50), IN useidValue varchar(50))
    begin
        update tbl_user set name = nameValue, blog = blogValue where userid = useridValue;
    end;
    4. 删除用户信息的存储过程--deleteUser
    DROP PROCEDURE IF EXISTS `deleteUser`;
    CREATE PROCEDURE `deleteUser`(IN useridValue int(11))
    begin
        delete from tbl_user where userid = useridValue;
    end;
    三.             编程前准备工作
    1.    建立工程
    在进入代码编写前,建立新的java工程proc, 目录结构如下:
    proc
       -lib
        -bin
        -src
          -com
            -amigo
              -proc
                -model
    2.    引入所需包
       将hibernate3.0的包以及其相关包放入编译路径中,另注意:还需将mysql的数据库驱动jar包mysql-connector-java-5.0.4-bin.jar放入编译路径中。
    四.             编码与测试
    在准备工作完成后,进入编码与测试阶段,本例演示了在hibernate3.0中调用mysql的存储过程的方法。
    1、hibernate的配置文件
    在hibernate的配置文件中包含数据库的连接信息,以及加入OR mapping的xml格式的映射文件,该文件如下(部分内容略):
    ……
            <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
            <property name="connection.username">root</property>
            <property name="connection.password">root</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="show_sql">true</property>
            <mapping resource="com/amigo/proc/model/User.hbm.xml"/> 
        ……
    2、OR Mapping文件
    产生的OR Mapping文件有User.java以及其对应的hibernate映射文件User.hbm.xml。其中User.java的内容如下:
    package com.amigo.proc.model;
    /** *//**
    * 用户信息对象
    */
    public class User implements java.io.Serializable {
        private static final long serialVersionUID = 1L;
        /** *//** 用户id*/
        private String userid;
        /** *//** 用户姓名*/
        private String name;
        /** *//** 用户blog*/
        private String blog;
    //省略get/set方法
    }
    User.hbm.xml文件的内容如下:
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.amigo.proc.model">
        <class name="User" table="tbl_user">
            <id name="userid" column="userid">
                <generator class="assigned"/>
            </id>
            <property name="name" column="name" type="string" />
            <property name="blog" column="blog" type="string" />
        </class>
        
        <sql-query name="getUserList" callable="true">
            <return alias="user" class="User">
                <return-property name="userid" column="userid"/>
                <return-property name="name" column="name"/>
                <return-property name="blog" column="blog" />
            </return>
            {call getUserList()}
        </sql-query>
    </hibernate-mapping>
    在该文件中需注意<sql-query…></sql-query>中的这段代码,调用的存储过程在其中定义,并定义了调用存储过程后将记录组装成User对象,同时对记录的字段与对象的属性进行相关映射。
    3.    管理hibernate的session以及事务的类HibernateSessionFactory
    该类包括打开session等方法,主要用于管理hibernate的session和事务。该类的内容如下(部分内容略):
    package com.amigo.proc;
    import java.io.ByteArrayOutputStream;
    import java.io.OutputStreamWriter;
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    /** *//**
    * Hibernate相关控制
    */
    public class HibernateSessionFactory {
        /** *//** Hibernate配置文件 */
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
        /** *//** 存储一个单独的session实例 */
        private static final ThreadLocal threadLocal = new ThreadLocal();
        /** *//** Hibernate配置相关的一个实例 */
        private static Configuration configuration = null;
        /** *//** Hibernate SessionFactory的一个实例 */
        private static SessionFactory sessionFactory;
        /** *//** Hibernate的字符编码集*/
        private static String charSet;
        /** *//** 若Hibernate未设置字符编码集时,采用的字符编码集*/
        private static final String encoding = (new OutputStreamWriter(
                new ByteArrayOutputStream())).getEncoding();
        /** *//**
         * 默认构造函数
         */
        public HibernateSessionFactory() {
        }
        /** *//**
         * 打开Hibernate的数据库连接
         */
        public static final synchronized void open() {
            if (sessionFactory != null)
                return;
            try {
                sessionFactory = getConfiguration().buildSessionFactory();
                charSet = configuration.getProperty("hibernate.connection.charSet");
                if (charSet == null)
                    charSet = encoding;
                return;
            } catch (Throwable throwable) {
                throw new ExceptionInInitializerError(throwable);
            }
        }
        /** *//**
         * 配置Hibernate数据库,并将其打开
         */
        private static synchronized void configure() throws HibernateException {
            if (sessionFactory == null) {
                if (configuration == null) {
                    getConfiguration().configure(CONFIG_FILE_LOCATION);
                }
                open();
            }
        }
        /** *//**
         * 获得配置实例
         */
        public static synchronized final Configuration getConfiguration() {
            if (configuration == null) {
                configuration = new Configuration();
            }
            return configuration;
        }
        /** *//**
         * 功能说明:获得SessionFactory
         */
        public static final SessionFactory getSessionFactory() {
            return sessionFactory;
        }
        /** *//**
         * 功能说明:获得session
         */
        public static final Session getSession() throws HibernateException {
            configure();
            Session session = null;
            if (threadLocal.get() == null) {
                session = getSessionFactory().openSession();
                threadLocal.set(session);
            } else {
                try {
                    session = (Session)threadLocal.get();
                } catch(Exception ex) {
                    session = getSessionFactory().openSession();
                    threadLocal.set(session);
                }
            }
            return session;
        }
        //其余方法略
    }
    4. hibernate调用存储过程的测试类
    本类是该例的核心类,在本类中,以实例清楚地说明了在hibernate中如何调用存储过程,例示了hibernate调用查询、更新、插入和删除这四类存储过程的方法,该类的内容如下:
    package com.amigo.proc;
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.util.List;
    import com.amigo.proc.model.User;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    /** *//**
    * hibernate调用存储过程
    * @author Amigo Xie(xiexingxing1121@126.com)
    * @since 2007/04/30
    */
    public class ProcTest {
        /** *//**
         * @param args
         */
        public static void main(String[] args) throws Exception {
            ProcTest proc = new ProcTest();
            Session session = HibernateSessionFactory.getSession();
            proc.testProcQuery(session);
            proc.testProcUpdate(session);
            System.out.println("update successfully");
            
            proc.testProcInsert(session);
            System.out.println("insert successfully");
            
            proc.testProcDelete(session);
            System.out.println("delete successfully");
            session.close();
        }
        
        /** *//**
         * 测试实现查询的存储过程
         * @throws Exception
         */
        private void testProcQuery(Session session) throws Exception {
            //查询用户列表
            List list = session.getNamedQuery("getUserList").list();
            for (int i = 0; i < list.size(); i++) {
                User user = (User) list.get(i);    
                System.out.print("序号: " + (i+1));
                System.out.print(", userid: " + user.getUserid());
                System.out.print(", name: " + user.getName());
                System.out.println(", blog: " + user.getBlog());
            }
        }
        
        /** *//**
         * 测试实现更新的存储过程
         * @throws Exception
         */
        private void testProcUpdate(Session session) throws Exception {
            //更新用户信息
            Transaction tx = session.beginTransaction(); 
            Connection con = session.connection(); 
            String procedure = "{call updateUser(?, ?, ?)}"; 
            CallableStatement cstmt = con.prepareCall(procedure); 
            cstmt.setString(1, "陈xx");
            cstmt.setString(2, "http://www.");
            cstmt.setString(3, "sterning");
            cstmt.executeUpdate(); 
            tx.commit();
        }
        /** *//**
         * 测试实现插入的存储过程
         * @throws Exception
         */
        private void testProcInsert(Session session) throws Exception {
            //创建用户信息
            session.beginTransaction();
            PreparedStatement st = session.connection().prepareStatement("{call createUser(?, ?, ?)}");
            st.setString(1, "amigo");
            st.setString(2, "阿蜜果");
            st.setString(3, "http://www.wblogjava.net/amigoxie");
            st.execute();
            session.getTransaction().commit(); 
        }
        
        /** *//**
         * 测试实现删除的存储过程
         * @throws Exception
         */
        private void testProcDelete(Session session) throws Exception {
            //删除用户信息
            session.beginTransaction();
            PreparedStatement st = session.connection().prepareStatement("{call deleteUser(?)}");
            st.setString(1, "amigo");
            st.execute();
            session.getTransaction().commit();
        }
    }
       在本类中,调用查询类存储过程时,调用session.getNamedQuery("…")方法来获得User.hbm.xml中配置的查询存储过程。在其余的存储过程调用的测试中,首先通过hibernate的session获得connection,然后调用connection对象的相应方法来实现存储过程的调用。
    该类的执行结果如下:
    Hibernate: {call getUserList()}
    序号: 1, userid: ant, name: 蚂蚁, blog: 
    序号: 2, userid: beansoft, name: bean, blog:
    序号: 3, userid: sterning, name: 似水流年, blog: 
    序号: 4, userid: tom, name: tom, blog: 
    update successfully
    insert successfully
    delete successfully
    五.总结
       本例提出了在hibernate3中调用mysql的存储过程的实现方案,从本例可以看出,hibernate提供了在*.hbm.xml中配置调用存储过程,并通过向用户提供session.getNamedQuery(“…”)方法来调用配置的调用查询相关的存储过程的方法,另外,hibernate还提供了取得sql的connection的方法,从而能够通过connection中存储过程调用相关的方法来实现存储过程的调用。

    转载于:https://www.cnblogs.com/yangjin-55/archive/2012/11/27/2790623.html

    展开全文
  • MySQL 存储过程是一些 SQL 语句的集合,比如有的时候我们可能需要一大串的 SQL 语句,...语法格式:可以使用 CREATE PROCEDURE 语句创建存储过程。语法格式如下:CREATE PROCEDURE ( [过程参数[,…] ] ) [过程参数...

    MySQL 存储过程是一些 SQL 语句的集合,比如有的时候我们可能需要一大串的 SQL 语句,或者说在编写 SQL 语句的过程中还需要设置一些变量的值,这个时候我们就完全有必要编写一个存储过程。下面我们来介绍一下如何创建一个存储过程。

    a454cd1f11e2a35cf18f4c99bb9769cf.png

    语法格式:

    可以使用 CREATE PROCEDURE 语句创建存储过程。

    语法格式如下:CREATE PROCEDURE ( [过程参数[,…] ] )

    [过程参数[,…] ] 格式

    [ IN | OUT | INOUT ]

    语法说明如下:

    1) 过程名

    存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即 db_name.sp_name。需要注意的是,名称应当尽量避免选取与 MySQL 内置函数相同的名称,否则会发生错误。

    2) 过程参数

    存储过程的参数列表。其中,为参数名,为参数的类型(可以是任何有效的 MySQL 数据类型)。当有多个参数时,参数列表中彼此间用逗号分隔。存储过程可以没有参数(此时存储过程的名称后仍需加上一对括号),也可以有 1 个或多个参数。

    MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT 三个关键字标识。其中,输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。需要注意的是,参数的取名不要与数据表的列名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作列名,从而引发不可预知的结果。

    3) 过程体

    存储过程的主体部分,也称为存储过程体,包含在过程调用的时候必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若存储过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。

    在存储过程的创建中,经常会用到一个十分重要的 MySQL 命令,即 DELIMITER 命令,特别是对于通过命令行的方式来操作 MySQL 数据库的使用者,更是要学会使用该命令。

    在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,这样显然不行。为解决这个问题,通常可使用 DELIMITER 命令将结束命令修改为其他字符。

    语法格式如下:DELIMITER $$

    语法说明如下:$$ 是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“?”或两个“¥”等。当使用 DELIMITER 命令时,应该避免使用反斜杠“\”字符,因为它是 MySQL 的转义字符。

    在 MySQL 命令行客户端输入如下SQL语句。mysql > DELIMITER ??

    成功执行这条 SQL 语句后,任何命令、语句或程序的结束标志就换为两个问号“??”了。

    若希望换回默认的分号“;”作为结束标志,则在 MySQL 命令行客户端输入下列语句即可:mysql > DELIMITER ;

    注意:DELIMITER 和分号“;”之间一定要有一个空格。在创建存储过程时,必须具有 CREATE ROUTINE 权限。可以使用 SHOW PROCEDURE STATUS 命令查看数据库中存在哪些存储过程,若要查看某个存储过程的具体信息,则可以使用 SHOW CREATE PROCEDURE 。

    创建不带参数的存储过程

    存储过程的作用是从学生成绩信息表中查询学生的成绩信息,输入的 SQL 语句和执行过程如下所示。mysql> DELIMITER //

    mysql> CREATE PROCEDURE ShowStuScore()

    -> BEGIN

    -> SELECT * FROM tb_students_score;

    -> END //

    Query OK, 0 rows affected (0.09 sec)

    展开全文
  • 使用Navicat for MySQL工具创建存储过程步骤:1. 新建函数(选择函数标签 -> 点击新建函数):2.输入函数的参数个数、参数名、参数类型等:3.编写存储过程:代码如下:BEGIN /* 定义变量 */ declare tmp0 VARCHAR...
  • mysql存储过程开发中如何使用游标嵌套在实际业务逻辑开发中,难免用到游标嵌套,举例如下:delimiter //drop procedure if exists good_nested_cursors1//CREATE PROCEDURE good_nested_cursors1( )READS SQL ...
  • Oracle 可以使用游标及存储过程,批量更新表中的数据,具体方式如下:SQL >declare v_id EMP.EMPNO%type; v_sal EMP.SAL%type; cursor cur is select EMPNO, SAL from EMP;begin open cur; loop fetch cur into v...
  • --分页 create proc sel_fen @tablename varchar(20),--表名 @pk varchar(20),--主键 @pagesize int=10,--每页多少条数据 @pagenumber int=1--当前页 ...select top (@pagesize) * from @tablename where @pk not ...
  • mysql 操作同样有循环...鉴于goto 语句的跳跃性会造成使用的的思维混乱,所以不建议使用。这几个循环语句的格式如下:WHILE……DO……END WHILEREPEAT……UNTIL END REPEATLOOP……END LOOPGOTO。目前我只测试了 wh...
  • ASP.NET MVC+EF数据库,Controller中使用pageindex参数怎么实现调用数据库的分页存储过程
  • 我用GridView绑定SqlDataSource数据源,在SqlDataSource中我使用sql语句就能显示数据,我用存储过程的时候,测试能显示,但是就是显示不到GridView中去,提示没有可显示的数据,这是什么情况??
  • 标签:到底什么是存储过程,又为什么需要使用存储过程存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合,可将其视为批文件,虽然它们的作用不仅限与批处理。使用存储过程有3个主要的好处,即...
  • 问题详情mysql 存储过程怎么处理序列化的字段?有对应的函数吗?项目的某些数据保存的时候用了序列化,然后后台需要用存储过程处理一些定时作业。对于在PHP序列化保存的字段,mysql 有对应的函数反序列化,然后提取...
  • 本文主要向大家介绍了MySQL数据库之MySQL存储过程使用WHILE循环语句的方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。本文实例讲述了MySQL存储过程使用WHILE循环语句的方法。分享给大家...
  • 怎么使用DBMS存储过程

    2004-12-14 18:16:00
    原文:http://www.onjava.com/pub/a/onjava/2003/08/13/stored_procedures.htmlby Nic Ferrier本文阐述了怎么使用DBMS存储过程。我阐述了使用存储过程的基本的和高级特性,比如返回ResultSet。本文假设你对DBMS和...
  • navicat怎么创建存储过程?下面就为大家详细介绍一下其中涉及到的操作。1、使用Navicat Premium打开创建函数向导,操作:连接名——数据库——函数——新建函数2、选择过程——输入存储过程参数——完成(这一步可以...
  • 很多朋友习惯以阿里禁止使用存储过程,来鼓吹项目中不该使用它。我想问的是,阿里那帮程序员,为了不用存储过程,做过的那些努力,你看到了吗?在去 SP 的过程中,所使用的技术与编程模式,你会吗?SP: Stored ...
  • 作为过来人我刚开始也有这样的苦恼,今天就给大家说说这个存储过程该如何创建和使用。什么是存储过程存储过程是一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储...
  • 随着业务的复杂化,完成一个业务功能需要非常多的sql操作环节,把这些语句都嵌入c代码中会导致c代码越来越繁琐、不清晰,这时 候,自然就想到了存储过程来封装所有的数据库逻辑,通过c简单调用mysql存储过程接口即可...
  • 报表应用中实现数据源计算经常会使用存储过程,但同时也带来多方面的问题。首先,存储过程的包只提供一层分类,无法用树形结构组织,容易造成代码管理混乱。程序员更是直接在现场在线修改存储过程,也不利于代码管理...
  • 然后使用php时就可以通过发送 CALL 存储过程名 来调用存储过程。如下:(案例中存储过程名为 sp1)CREATE PROCEDURE sp1() SELECT VERSION();//1.创建MySQLi对象$mysqli = new MySQLi("XXX","XXX","XXX","XXX"); //第...
  • 然后使用php时就可以通过发送 CALL 存储过程名 来调用存储过程。如下:(案例中存储过程名为 sp1)CREATE PROCEDURE sp1() SELECT VERSION();//1.创建MySQLi对象$mysqli = new MySQLi("XXX","XXX","XXX","XXX"); //第...
  • 使用存储过程

    2016-05-23 14:29:23
    存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件。虽然他们的作用不仅限于批处理。 为什么要使用存储过程:优点 1 通过吧处理封装在容易使用的单元中,简化复杂的
  • 存储过程使用

    2013-05-23 18:46:35
    存储过程使用: 1、 代码不能复用。 2、 可移值性差。 3、 应对不了需求的变化,如果我算公式用规则引擎来算,则没得办法修改。 4、 在存储过程中实现业务逻辑,按照三层架构来说,那么业务逻辑存在于业务...
  • MySQL存储过程创建与使用 学习点:  1.什么是存储过程?  2.为什么要使用存储过程?  3.存储过程应该怎么使用呢? 1.什么是存储过程? ...
  • 使用以下方法时,无论学号是否存在,都能正确执行不报错,怎样才能达到下面的效果? String sql = "select sno from student where sno=?"; psmt = conn.prepareStatement(sql); psmt.setString(1, sno); rs = ...
  • BEGIN DECLARE M,N INT; SELECT S01,(I03+I04+I05+I12-I13)AS M FROM tk_zyxss; SELECT S01,(I03*1.5+I04*3)AS N FROM tk_jszdyjs ;...我现在的想法是把结果1的M 与对应的结果2的值相加,得出一个总的结果
  • 引用:百度百科存储过程存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的...注意:本文主要简述mysql中存储过程使用,其他数据库可能有所出入。存储过程的好处:1.由于数据库执行动作时,...
  • 怎么对MySQL数据库的存储过程进行修改发布时间:2020-12-14 15:23:15来源:亿速云阅读:73作者:Leah怎么对MySQL数据库的存储过程进行修改?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,909
精华内容 763
关键字:

存储过程怎么使用