精华内容
下载资源
问答
  • 但是一个多表联查的语句却出现命令未正确结束的错误,原语句如下: select tem1.empname,tem1.mobiletelphone,tem1.empstatus,tem2.location from comm_employee as tem1 left join comm_organization as tem2 on te

    记录一下开发过程中的一次踩坑经历:

    公司迁移后端从原来的mysql环境迁到Oracle环境,用的都是mybatis,所以xml文件没动直接复制过去了,其他语句到也没出现异常。但是一个多表联查的语句却出现命令未正确结束的错误,原语句如下:

    select tem1.empname,tem1.mobiletelphone,tem1.empstatus,tem2.location from comm_employee as tem1 left join comm_organization as tem2 on tem1.compid=tem2.compid where tem1.badge=#{jobNumber}
    

    一个左连接的两表联查,放在mysql环境下正常运行,但是迁到Oracle就出现命令未正确结束错误。原因如下:

    在Oracle中as关键字不能用于指定表的别名,在Oracle中指定表的别名时只需在原有表名和表的别名之间用空格分隔即可。

    as关键字可以用于指定列的别名,但在存储过程中如果列的别名与原有列名相同,在运行时会报错(编译时不会出错)。

    其他情况下列的别名可以与列名本身相同

    原语句去掉as就行了。

    展开全文
  • (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置. (3)collection:根据传入的参数值确定. (4)open:表示该语句以什么开始. (5)separator:表示在每次进行迭代之间以什么符号作为分隔 符. (6)close:表示...

    Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置. (3)collection:根据传入的参数值确定. (4)open:表示该语句以什么开始. (5)separator:表示在每次进行迭代之间以什么符号作为分隔 符. (6)close:表示以什么结束. 首先,错误的xml配置文件如下:

    错误原因: 拼接的时候因为引号里的部分是直接引起来的,所以将这些语句整个拼接起来的时候就会成为一个“没有断句”的sql语句,如下面我的错误 将整句话拼接起来就相当于   select * from BookCatagorywherename like '%"+bookCatagory.getName()+"%'": 整个句子并没有断句,所以在sql脚本中并不是一个完整的sql语句 解决办法: 将拼接部分 引号 内,左右引号都加上空格,这样的话拼接出来就是一个完整的sql语句!…

    最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束 错误的写法如下

    如果你在使用 Oracle.EntityFrameworkCore 在执行一些分页查询或者其他数据操作时,遇到“ORA-00933:SQL命令未正确结束”, 请先检查你的DbContext中UseOracle(...)的写法: services.AddDbContextPool(options => { options.UseOracle(GetConnectionString(configuration, DatabaseType.Oracle));…

    报错内容 org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, expect ')' : INSERT INTO ke_online_course_student ( occ_id,class_id,class_name,te…

    最近在修改数据库存储过程时,出现了一个ORA-00933错误, 执行的是 INSERT INTO...SELECT 语句,具体语句如下: INSERT INTO BASP_DX.QLR@GT(BDCDYH, QSZT) SELECT NVL(e.BDCDYH, ' '), b.LIFECYCLE AS QSZT FROM DJ_DY as LEFT JOIN DJ_XGDJGL d ON d.ZSLBH = a.SLBH LEFT JOIN DJ_DJB e ON e.SLBH = d.FSLB…

    最近在项目中需要使用oracle+mybatis批量插入数据,因为自增主键,遇到问题,现记录如下: 一.常用的两种sql写法报错 1.insert ... values ... insert all into t_emp(emp_name,emp_email,dept_id) VALUES (#{emp.empName}, #{emp.empEmail}, #{emp.…

    批量更新数据,非常简单的一段代码,硬是报错,插入的数据也能显示出来 List userlist = new ArrayList(); userlist.add(new User(1, "qq", "123132", "eee")); userlist.add(new User(2, "3333", "123132", "rrrr")); i…

    mybatis批量更新时语法写的都对,但是报错,需要在连接上面加上allowMultiQueries=true 示例:jdbc:MySQL://192.168.1.236:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true 默认情况下mysql是不支持批量更新操作的…

    批量更新sql UPDATE project_auto_appraise SET &…

    具体报错信息: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_ecoYksKpi_0' not found. Available parameters are [list, param1] at org.mybatis.spring.MyBatisExceptionTranslator.tran…

    1.插入 (1)第一种方式:利用标签,将入参的list集合通过UNION ALL生成虚拟数据,从而实现批量插入(验证过) SELECT LAST_INSERT_ID()

    批量插入 insert into tableA (ID, YEAR, 字段2, 字段3, ...)select sys_guid(),#{currentYear},字段2, 字段3, ...from tableA where year= #{pastYear}

    org.springframework.jdbc.BadSqlGrammarException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for t…

    INSERT INTO student(id,xuesheng,yuwen,shuxue,yingyu) SELECT id,xuesheng,yuwen,shuxue,yingyu FROM stu; 实践: insert into store_advertisings(id,title,PicListJson,edittime) (select s.Id,s.`Name` as name , '[]',NOW() from stores s left join store_advertisi…

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert all into table(...) values(...) into table(...) values(...) select * from dual; 语句来解决,但一直报如下错误 ### The error may involve ApplaudDaoImpl.addList-Inline…

    oracle 实现在Mybatis中批量插入,下面测试可以使用,在批量插入中不能使用insert 标签,只能使用select标签进行批量插入,否则会提示错误 ### Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束 ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束 批量插入…

    在Java中循环save,需要加useGeneratedKeys="false",否则报错不符合协议 mybatis批量插入,也需要在insert里加入 useGeneratedKeys="false" 不然会包 sql未正确结束

    mybatis批量插入oracle时报错:unique constraint (table name) violated,是因为插入的集合中有两条相同唯一约束的数据.…

    mybatis oracle mysql 批量插入一.oracle的批量插入方式insert into db(id, zgbh, shbzh) select '1', '2', '3' from dual union all select '2', '3', '4' from dual union all select '3', '4', '5' from dual union all select '4', '5', '6' from dual union all select '5', '6…

    Loadrunner参数化连接oracle.mysql数据源报错及解决办法 (本人系统是Win7 64,  两位小伙伴因为是默认安装lr,安装在 最终参数化的时候,出现连接字符串无法自动加载出来: 最后通过安装在,问题到此解决 1.通过数据库连接参数化大量数据,电脑本地已经成功安装了数据库驱动,且本地可以配置数据源成功,在loadrunner 中配置数据源却找不到对应的数据库驱动. ----A:检查当前loadrunner工具的版本,是32位还是64位(目前还没有64位的),32位是不能安装64…

    在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,由于项目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来. 实体类TrainRecord结构如下: public class TrainRecord implements Serializable { private static final long serialVersionUID = -12069604621179…

    案例是给一个用户赋予多个权限,多个权限用其对应的主键 id 为参数,组成了 一个id数组,传给springMVC,然后springMVC传给mybatis,然后mybatis批量插入.其实类似的场景还有批量删除多个,也是类似的. 1. 前台页面 权限选择namepermission &l…

    本文转自 惜纷飞 大师. 模拟基表事务未提交数据库crash,undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库坏块导致 对于基表特别是bootstrap$中的表,如果进行了dml操作,但是没有提交,这个时候数据库crash,而且undo异常.对于类似的场景,都是很多数据库恢复的人都有畏惧,因为_corrupted_rollback_segments参数不能起作用.本实验dml修改seq$表,最终却引起了un…

    mybatis批量插入操作: MySQL:1.INSERT INTO TABLE_NAME(ID,NAME)VALUES(1,'张三'),(2,'李四')                  2.INSERT INTO TABLE_NAME(ID,NAME)VALUES(1,'张三');INSERT INTO TABLE_NAME(ID,NAME)VALUES(2,'李四')     Oracle:1.INSERT INTO TABLE_NAME (ID,NAME) (SELECT 1,'张三'…

    展开全文
  • MySQL存储过程

    2021-02-02 07:53:47
    简介存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂的操作封装程一个代码块,可以重复使用,大大减少数据库开发人员的工作量。存储过程的创建创建存储过程使用...

    简介

    存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂的操作封装程一个代码块,可以重复使用,大大减少数据库开发人员的工作量。

    存储过程的创建

    创建存储过程

    使用CREATE PROCEDURE语句创建存储过程,基本语法格式如下:

    CREATE PROCEDURE sp_name([proc_parameter])[characteristics...]routine_body

    上述语法格式中CREATE PROCEDURE:为用来创建存储过程的关键字;sp_name:存储过程的名称;proc_parameter:存储过程的参数列表,该参数列表形式如下:

    [IN|OUT|INOUT]param_name type

    上述参数列表形式中 IN:输入参数;OUT:输出参数;INOUT:即可以输入也可以输出;param_name:参数名称;type:参数类型,可以是MySQL数据库中的任意类型;

    在创建存储过程语法中,characteristics用于指定存储过程的特性,取值具体说明如下:

    LANGUAGE SQL:说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE的唯一值。

    [NOT]DETERMINISTIC:指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出;NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DE-TERMINISTIC。

    {CONTAINS SQL|NO SQL|READS SQLDATA|MODIFIES SQL DATA}:指明子程序使用SQL语句的限制。CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据的语句;NOSQL表明子程序不包含SQL语句;READS SQLDATA说明子程序包含读写数据的语句;MODI-FIES SQL DATA表明子程序包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。

    SQL SECURITY{DEFINER|INVOKER}:指明谁有权限来执行。DEFINER表示只有定义者才能执行。INVOKER表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。

    COMMENT‘string’:注释信息,可以用来描述存储过程。

    routime_body是SQL代码的内容,可以用BEGIN…END来表示SQL代码的开始和结束。

    创建存储过程案例:

    mysql> DELIMITER //mysql> CREATE PROCEDURE Proc()-> BEGIN

    -> SELECT * FROMtable_name;-> END //Query OK,0 rows affected (0.00sec)

    mysql> DELIMITER ;

    在上述执行过程中,“DELIMITER //”语句的作用是将MySQL的结束符设置为//,因为MySQL默认的语句结束符号为分号“;”,为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符,并以“END //”结束存储过程。存储过程定义完毕后再使用“DELIMITER ;”恢复默认结束符。DELIM-ITER也可以指定其他符号作为结束符。需要格外注意的是,DELIMITER与要设定的结束符之间一定要有一个空格,否则设定无效。

    变量的使用

    在编写存储过程时,有时会需要使用变量保存数据处理过程中的值。在MySQL中,变量可以在子程序中声明并使用,这些变量的作用范围是在BEGIN…END程序中。

    在存储过程中使用DECLARE语句定义变量,具体语法格式如下:

    DECLARE var_name[,varname]…date_type[DEFAULT value];

    上述语法格式中var_name:局部变量的名称;DEFAULT value子句给变量提供一个默认值。该值除了可以被声明为一个常数之外,还可以被指定为一个表达式。如果没有DEFAULT子句,变量的初始值为NULL。

    接下来定义一个名称为myvariable的变量,类型为INT类型,默认值为100,示例代码如下:

    DECLARE myvariable INT DEFAULT 100;

    使用SET语句为变量赋值,可以改变变量的默认值,语法格式如下:

    SET var_name = expr[,var_name = expr]…;

    在存储过程中的SET语句是一般SET语句的扩展版本。被参考变量可能是子程序内声明的变量,或者是全局服务器变量,如系统变量或者用户变量。

    在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这允许SET a=x,b=y,…这样的扩展语法。其中不同的变量类型(局域声明变量及全局变量)可以被混合起来。这也允许把局部变量和一些只对系统变量有意义的选项合并起来。

    接下来声明三个变量,分别为var1、var2、var3,数据类型为INT,使用SET为变量赋值,示例代码如下:

    DECLARE var1,var2,var3 INT;SET var1=10,var2=20;SET var3=var1+var2;SET @x=var1+var2;

    注意:“@x”表示用户变量,使用SET语句为其赋值,用户变量与连接有关,一个客户端定义的变量不能被其他客户端看到或使用。当客户端退出时,该客户连接的所有变量将自动释放。

    除了可以使用SET语句为变量赋值外,MySQL中还可以通过SELECT…INTO为一个或多个变量赋值,该语句可以把选定的列直接存储到对应位置的变量。使用SELECT…INTO的具体语法格式如下:

    SELECT col_name[…] INTO var_name[…] table_expr;

    在上述语法格式中,col_name表示字段名称;var_name表示定义的变量名称;table_expr表示查询条件表达式,包括表名称和WHERE子句。

    例:声明变量s_grade和s_gender,通过SELECT…INTO语句查询指定记录并为变量赋值,具体代码如下:

    DECLARE s_grade FLOAT;DECLARE s_gender CHAR(2);SELECT grade, gender INTOs_grade, s_genderFROM student WHERE name = 'rose';

    定义条件和处理程序

    定义条件是事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式,并且保证存储过程在遇到警告或错误时能继续执行。

    定义条件

    在编写存储过程时,定义条件使用DECLARE语句,语法格式如下:

    DECLARE condition_name CONDITION FOR [condition_type];

    // condition_type的两种形式: [condition_type]:SQLSTATE[VALUE] sqlstate_value|mysql_error_code

    上述语法格式中,condition_name表示所定义的条件的名称;condition_type表示条件的类型;sqlstate_value和mysql_error_code都可以表示MySQL的错误,sqlstate_value是长度为5的字符串类型错误代码,mysql_error_code为数值类型的错误代码。例如:ERROR1142(42000)中,sql-state_value的值是42000,mysql_error_code的值是1142。

    上述语法格式指定了需要特殊处理的条件。它将一个名字和指定的错误条件关联起来。这个名字可以随后被用在定义处理程序的DECLARE HAN-DLER语句中。

    例:定义“ERROR1148(42000)”错误,名称为command_not_allowed的两种方式:

    //方法一:使用sqlstate_valueDECLARE command_not_allowed CONDITION FOR SQLSTATE'42000';//方法二:使用mysql_error_codeDECLARE command_not_allowed CONDITION FOR 1148;

    定义处理程序

    定义完条件后,还需要定义针对此条件的处理程序。MySQL中用DECLARE语句定义处理程序,具体语法格式如下:

    DECLARE handler_type HANDLER FOR condition_value[,…]sp_statement//handler_type: CONTINUE|EXIT|UNDO//condition_value: |condition_name |SQLWARNING |NOT FOUND |SQLEXCEPTION |mysql_error_code

    handler_type为错误处理方式,CONTINUE表示遇到错误不处理,继续执行;EXIT表示遇到错误马上退出;UNDO表示遇到错误后撤回之前的操作,MySQL中暂时不支持这样的操作。

    sp_statement表示在遇到定义的错误时,需要执行的存储过程;

    condition_value为错误类型,取值:

    (1)SQLSTATE[VALUE] sqlstate_value包含5个字符的字符串错误值。

    (2)condition_name表示DECLARE CON-DITION定义的错误条件名称。

    (3)SQLWARNING匹配所有以01开头的SQLSTATE错误代码。

    (4)NOT FOUND匹配所有以02开头的SQLSTATE错误代码。

    (5)SQLEXCEPTION匹配所有没有被SQL-WARNING或NOT FOUND捕获的SQLSTATE错误代码。

    (6)mysql_error_code匹配数值类型错误代码。

    例:定义处理程序几种方式:

    //方法一:捕获sqlstate_valueDECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'SET @info='NO_SUCH_TABLE';//方法二:捕获mysql_error_codeDECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';//方法三:先定义条件,然后调用DECLARE no_such_table CONDITION FOR 1146;DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='ERROR';//方法四:使用SQLWARNING SQL-WARNING捕获所有以01开头的sqlstate_value值,然后执行EXIT操作,并且输出“ERROR”信息。DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';//方法五:使用NOT FOUND NOTFOUND捕获所有以02开头的sqlstate_value值,然后执行EXIT操作,并且输出“NO_SUCH_TA-BLE”信息。DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';//方法六:使用SQLEXCEPTION SQLEXCEPTION捕获所有没有被SQLWARN-ING或NOT FOUND捕获的sqlstate_value值,然后执行EXIT操作,并且输出“ERROR”信息DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';

    光标的使用

    在编写存储过程时,查询语句可能会返回多条记录,如果数据量非常大,则需要使用光标来逐条读取查询结果集中的记录。光标是一种用于轻松处理多行数据的机制。

    光标的声明

    光标必须声明在声明变量、条件之后,声明处理程序之前。MySQL中使用DECLARE关键字来声明光标,具体语法格式如下:

    DECLARE cursor_name CURSOR FORselect_statement;

    cursor_name:光标名称;

    select_statement:select语句,用于创建光标的结果集;

    例:声明名为cursor_student的光标

    DECLARE cursor_student CURSOR FOR select s_name,s_gender FROM student;

    光标的使用

    声明完光标就可以使用了,使用前首先要大开光标;MySQL中打开和使用光标,语法格式如下:

    OPENcursor_nameFETCH cursor_name INTO var_name[,var_name]…

    cursor_name:光标名称;

    var_name:将光标中的SELECT语句查询出来的信息存入该参数中,需要注意的是,var_name必须在声明光标之前就定义好。

    例:使用名称为cursor_student的光标。将查询出来的信息存入s_name和s_gender中

    FETCH cursor_student INTO s_name, s_gender;

    光标的关闭

    使用完光标要将光标关闭;语法格式如下:

    CLOSE cursor_name

    值得一提的是,如果没有明确地关闭光标,它会在其声明的复合语句的末尾被关闭。

    流程控制的使用

    在编写存储过程时还有一个非常重要的部分——流程控制。MySQL中的流程控制语句包括:IF语句、CASE语句、LOOP语句、WHILE语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句。

    每个流程中可能包含一个单独语句,也可能是使用BEGIN…END构造的复合语句,可以嵌套。

    IF语句

    IF实现了一个基本的条件构造。用法:

    IF val IS NULL

    THEN SELECT 'val is NULL';ELSE SELECT 'val is not NULL';END IF;

    需要注意的是,MySQL中还有一个IF()函数,它不同于这里描述的IF语句。IF语句都需要使用END IF来结束,不可省略。

    CASE语句

    CASE是另一种条件判断的语句,该语句有两种格式,第一种如下:

    CASEcase_exprWHEN when_value THENstatement_list[WHEN when_value THEN statement_list]…[ELSE statement_list]

    END CASE

    例:

    CASEvalWHEN 1 THEN SELECT 'val is 1';WHEN 2 THEN SELECT 'val is 2';ELSE SELECT 'val is not 1 or 2';END CASE;

    第二种如下:

    CASE

    WHEN expr_condition THENstatement_list[WHEN expr_condition THEN statement_list]

    [ELSE statement_list]

    END CASE;

    需要注意的是,这里说的用在存储过程里的CASE语句与“控制流程函数”里描述的SQL CASE表达式中的CASE语句有些不同。存储过程里的CASE语句不能有ELSE NULL子句,并且用ENDCASE替代END来终止。

    LOOP语句

    LOOP循环语句是用来重复执行某些语句,直到跳出循环语句。语法格式如下:

    [loop_label:]LOOP

    statement_listEND LOOP [loop_label]

    loop_label:指LOOP语句的标注名称,可省略。

    statement_list:需要循环执行的语句。

    例:使用LOOP语句进行循环操作

    DECLARE id INT DEFAULT 0;

    add_loop:LOOPSET id=id+1;IF id>=10 THENLEAVE add_loop;END IF;END LOOP add_loop;

    当id值小于10时,循环重复执行;当id值大于或者等于10时,使用LEAVE语句退出循环。

    LEAVE语句

    LEAVE语句用于退出任何被标注的流程控制构造,如LOOP例子中,当不满足循环条件时,需要使用LEAVE语句退出循环。基本语法如下:

    LEAVE label

    label表示循环的标志。通常LEAVE语句与BEGIN。。。END、循环语句一起使用。

    ITERATE语句

    ITERATE即再次循环,用于将执行顺序转到语句段的开头处。基本语法如下:

    ITERATE lable

    lable表示循环的标志。需要注意的是,ITERATE 语句只能出现在LOOP、REPEAT和WHILE语句内。

    例:演示了ITERATE语句在LOOP语句内的使用

    CREATE PROCEDUREdoiterate()BEGIN

    DECLARE p1 INT DEFAULT 0;

    my_loop:LOOPSET p1=p1+1;IF p1<10 THENITERATE my_loop;

    ELSEIF p1>20 THENLEAVE my_loop;END IF;SELECT 'p1 is between 10 and 20';ENDLOOP my_loop;END

    REPEAT语句

    REPEAT语句用于创建一个带有条件判断的循环过程,每次执行后,会对条件进行判断,如果为真,则循环结束;否则重复执行循环中的语句。基本语法如下:

    [repeat_lable:]REPEAT

    statement_list

    UNTIL expr_conditionEND REPEAT[repeat_lable]

    repeat_lable指REPEAT语句的标注名称(可选);REPEAT语句内的语句或语句群被重复,直至expr_condition为真。

    例:演示使用REPEAT语句执行循环过程

    DECLARE id INT DEFAULT 0;

    REPEATSET id=id+1;

    UNTIL id>=10;END REPEAT;

    WHILE语句

    WHILE语句用于创建一个带有条件判断的循环过程,与REPEAT不同的是在语句执行时,先对指定的表达式进行判断,如果为真,则执行循环内的语句,否则退出循环。基本语法如下:

    [while_lable:] WHILEexpr_condition DO

    Statement_listEND WHILE [while_lable]

    while_lable指WHILE语句的标注名称;

    expr_condition为进行判断的表达式,如果为真,WHILE语句内的语句或语句群被执行,直至expr_condition为假,退出循环。

    例:示使用WHILE语句进行循环操作

    DECLARE i INT DEFAULT 0;WHILE i<10DOSET i=i+1;END WHILE;

    存储过程的使用

    调用存储过程

    存储过程必须用CALL语句调用,如果调用其他数据库的存储过程,需要指定数据库名。调用语法格式如下:

    CALL sp_name([parameter[,…]])

    其中,sp_name:存储过程的名称;parameter:存储过程的参数;

    例:定义一个名为CountProc1的存储过程,然后调用这个存储过程,具体操作如下:

    定义存储过程:

    mysql> DELIMITER //mysql> CREATE PROCEDURE CountProc1(IN s_gender VARCHAR(50),OUT num INT)-> BEGIN

    -> SELECT COUNT(*) INTO num FROM student WHERE gender=s_gender;-> END//Query OK,0 rows affected (0.13sec)

    mysql> DELIMITER;

    调用存储过程:

    mysql> CALL CountProc1("女",@num);

    Query OK,1 row affected (0.17 sec)

    查看返回结果

    mysql> SELECT @num;+------+

    | @num |

    +------+

    | 2 |

    +------+

    1 row in set (0.00 sec)

    查看存储过程

    SHOW STATUS语句

    基本语法结构:

    SHOW {PROCEDURE|FUNCTION} STATUS [LIKE 'pattern'\]

    上述语法格式中,PROCEDURE和FUNCTION分别表示查看存储过程和函数,LIKE语句表示匹配的名称。

    示例:获取数据库中所有名称以C开头的存储过程的信息。

    SHOW PROCEDURE STATUS LIKE'C%'\G

    SHOW CREATE语句

    基本语法结构:

    SHOW CREATE{PROCEDURE|FUNCTION} sp_name

    示例:

    SHOW CREATE PROCEDURE chapter06.CountProc1\G

    从information_schema.Routines表中查看存储过程的信息

    在MySQL中存储过程和函数的信息存储在information_schema数据库下的Routines表中。可以通过查询该表的记录来查询存储过程的信息,查询语句如下:

    SELECT * FROM information_schema.RoutinesWHERE ROUTINE_NAME='CountProc1' AND ROUTINE_TYPE='PROCEDURE'\G

    需要注意的是,ROUTINE_NAME:指定存储过程的名称;ROUTINE_TYPE:指定存储程序的类型。

    修改存储过程

    使用ALTER语句修改存储过程的特性,其基本语法格式如下:

    ALTER {PROCEDURE|FUNCTION} sp_name[characteristic…]

    上述语法格式中,sp_name:存储过程或函数的名称;characteristic表示要修改存储过程的哪个部分,characteristic的取值具体如下:

    CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;

    NO SQL表示子程序中不包含SQL语句;

    READS SQL DATA表示子程序中包含读数据的语句;

    MODIFIES SQL DATA表示子程序中包含写数据的语句;

    SQL SECURITY{DEFINER|INVOKER}指明谁有权限来执行;(DEFINER:只有定义者自己才能够执行;INVOKER:调用者可以执行)

    COMMENT‘string’表示注释信息。

    目前,MySQL还不提供对已存在的存储过程代码的修改,如果一定要修改存储过程代码,必须先将存储过程删除之后,再重新编写代码,或创建一个新的存储过程。

    删除存储过程

    使用DROP语句删除存储过程,其基本语法格式如下:

    DROP{ PROCEDURE|FUNCTION }[IF EXISTS] sp_name

    示例:删除存储过程CountProc1

    DROP PROCEDURE CountProc1;

    综合案例-存储过程应用

    创建一个stu表

    表结构:

    b456b1210f19fd8677ab7098c4beb2ce.png

    表数据:

    77b96c9a8b32b1864b39ffff3e770902.png

    建表及初始化数据脚本:

    CREATE TABLE stu(id INT,name VARCHAR(50),class VARCHAR(50));INSERT INTO stu VALUE (1,'Lucy','class1'),(2,'Tom','class1'),(3,'Rose','class2');

    创建一个存储过程

    创建一个存储过程addcount能够获取表stu中的记录数和id的和,代码格式如下:

    CREATE PROCEDURE addcount(out count INT)BEGIN

    DECLARE itmp INT;DECLARE cur_id CURSOR FOR SELECT id FROMstu;DECLARE EXIT HANDLER FOR NOT FOUND CLOSEcur_id;SELECT count(*) INTO count FROMstu;SET @sum=0;OPENcur_id;

    REPEATFETCH cur_id INTOitmp;IF itmp<10

    THEN SET @sum=@sum+itmp;END IF;

    UNTIL0 ENDREPEAT;CLOSEcur_id;END;

    上述存储过程用到了变量的声明、光标、流程控制。SQL语句执行情况如下:

    mysql> DELIMITER //mysql> CREATE PROCEDURE addcount(out count INT)-> BEGIN

    -> DECLARE itmp INT;-> DECLARE cur_id CURSOR FOR SELECT id FROMstu;-> DECLARE EXIT HANDLER FOR NOTFOUNDCLOSEcur_id;-> SELECT count(*) INTO count FROMstu;-> SET @sum=0;-> OPENcur_id;->REPEAT-> FETCH cur_id INTOitmp;-> IF itmp<10

    -> THEN SET @sum=@sum+itmp;-> END IF;-> UNTIL 0 ENDREPEAT;-> CLOSEcur_id;-> END //Query OK,0 rows affected (0.00sec)

    mysql> CALL addcount(@count) //Query OK,0 rows affected (0.00sec)

    mysql> SELECT @count,@sum //

    +--------+------+

    | @count | @sum |

    +--------+------+

    | 3 | 6 |

    +--------+------+

    1 row in set (0.00sec)

    mysql> DELIMITER;

    从调用存储过程的结果可以看出,stu表中共有三条数据,id之和为6。这个存储过程创建了一个cur_id的光标,使用这个光标来获取每条记录的id,使用REPEAT循环语句来实现所有id号相加。

    展开全文
  • 以下是MySQL中END IF语句的语法IFyourConditionTHENyourStatementELSEyourStatementENDIF这是创建存储过程时END IF语句的演示mysql>DELIMITER//mysql>CREATEPROCEDURESp_Test(INvalueINT)->BEGIN->...

    以下是MySQL中END IF语句的语法IF yourCondition THEN

    yourStatement

    ELSE

    yourStatement

    END IF

    这是创建存储过程时END IF语句的演示mysql> DELIMITER //

    mysql> CREATE PROCEDURE Sp_Test( IN value INT )

    - > BEGIN

    - > IF value 

    - > select 'Your value is less than 10';

    - > ELSE

    - > select 'Your value is greater than 10';

    - > END IF;

    - >

    - > END //

    mysql> DELIMITER ;

    借助CALL命令调用存储过程。

    语法如下CALL yourStoredProcedureName();

    现在您可以调用上述存储过程,如下所示mysql> CALL Sp_Test(15);

    以下是输出+-------------------------------+

    | Your value is greater than 10 |

    +-------------------------------+

    | Your value is greater than 10 |

    +-------------------------------+

    1 row in set (0.00 sec)

    展开全文
  • 最近在修改数据库存储过程时,出现了一个`ORA-00933`错误,执行的是 INSERT INTO...SELECT 语句,具体语句如下:INSERT INTO BASP_DX.QLR@GT(BDCDYH, QSZT)SELECT NVL(e.BDCDYH, ' '), b.LIFECYCLE AS QSZTFROM DJ_...
  • mysql存储过程 delimiter

    2021-01-20 20:31:46
    mysql数据库存储过程存储过程简介存储过程可以简单理解为一条或者多条sql语句的集合,存储过程用来实现将一组关于表的操作的sql语句当作一个整体来执行,存储过程在实际应用中最主要的特点的事提高执行效率以及sql...
  • 在Oracle存储过程正确的实现分页在实际中的应用比例还是占为多数的,如果你对这一相关技术,心存好奇的话,以下的文章将会给你提供Oracle存储过程正确的实现分页的好用的操作方案。几乎每一个WEB应用都会用到...
  • MySQL储存过程详解

    2021-03-03 19:49:41
    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该...
  • mysql 终止 存储过程

    2021-01-19 00:51:54
    建议按如下顺序检查: 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisi ... spring面试问题与答案集锦 我收集了一些spring面试的问题,这些问题可能会在下一次技术面试中遇到....
  • mysql call 存储过程

    2021-01-18 22:27:53
    PHP调用MYSQL存储过程实例PHP调用MYSQL存储过程实例标签:mysql存储phpsqlquerycmd2010-09-26 11:1011552人阅读评论(3)收藏举报实例一:无参的...文章thinkyoung2016-01-20544浏览量存储过程实例存储过程:是为了...
  • 我在使用MySQL工具编写MySQL存储过程的时候,明明语法正确,但是却一直提示You have an error in your SQL syntax。比如下面一段代码CREATE PROCEDURE demo_pro()BEGINDECLARE doned BOOLEAN;DECLARE addr varchar(20)...
  • PL/SQL分页分页技术的实现:分页是任何一个网站(bbs,网上商城,blog)都会使用...首先是掌握最简单的存储过程,无返回值的存储过程:案例:现有一张表book,表结构如下:看图: 书号书名出版社请写一个过程,可以向b...
  • 问题: mysql用命令行创建存储过程时,如语句中遇到;则创建过程结束,提示 ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondsto yourMySQLserverversionfortherightsyntaxtousenear''...
  • SQL Server存储过程加密与解密过程详解 加密概述 SQL Server的存储过程支持对其创建脚本的加密,即即便是数据库管理员也无法查看其脚本内容。本文即介绍一种方法对存储过程的加密和解密。 加密实例 加密存储过程...
  • 我的上一个银行项目中,我接到编写ORACLE存储过程的任务,我是程序员,脑袋里只有一些如何使用CALLABLE接口调用存储过程的经验,一时不知如何下手,我查阅了一些资料,通过实践发现编写ORACLE存储过程是非常不容易的...
  • 结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执行。存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。一....
  • mysql 存储过程

    2021-02-02 07:53:14
    什么是存储过程简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加...
  • 字符集的问题,估计你的客户端与server的字符集不一致 drop procedure if exists pro_insert;...因为你不这么做,你存储过程内的分号会被当作“语句结束了”来执行,这样整个语句就报错了。 ######谢谢
  • MySQL创建存储过程

    千次阅读 2021-02-03 07:36:36
    在开发过程中,经常会遇到重复使用某一个功能的情况,为此,MySQL引入了存储过程存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂操纵,封装成一个代码块,以便重复...
  • mysql if 存储过程

    2021-01-18 20:27:19
    MySql存储过程MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP)...
  • Mysql 存储过程

    2021-02-08 09:13:31
    1、理解:把若干条 SQL 语句封装起来,起个名字,就叫过程把这个过程存储在数据库中,就叫存储过程2、存储过程的创建语法:create procedure procedureName()begin--sql 语句end$3、查看已有的存储过程:示例:show ...
  • 问题阐述自MySQL 5.0 开始,MySQL 就支持存储过程存储过程是一些被用户定义的SQL 语句集合。一个存储程序是可以被存储在服务器中的一套SQL 语句。存储过程可以被程序、触发器或另一个存储过程调用。其具有执行速度...
  • 1.1,Oracle存储过程简介:存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的...
  • /*结束时间*/ 5,创建存储过程及调用存储过程: DROP PROCEDURE IF EXISTS Pro_query_work_order_report; CREATE PROCEDURE Pro_query_work_order_report ( IN cityCode varchar(32),/*城市code*/ IN energyStation ...
  • 存储过程既是一种解决方案,先来看看存储过程优缺点:A、 存储过程允许标准组件式编程存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行...
  • 此文章主要介绍的是DB2存储过程中对动态游标的正确使用,相信如果你掌握了DB2存储过程中对动态游标的正确使用这项技术,会在以后的学习或是工作中带来很大的帮助,以下就是文章的主要内容的详细描述。...
  • 存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。 1. 存储过程概述 1.1 理解 含义:存储过程的英文是 Stored Procedure 。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 291,991
精华内容 116,796
关键字:

存储过程未正确结束原因