存储过程常见错误合集

有如下存储过程:

DROP PROCEDURE IF EXISTS pro_import_under_take_count;
CREATE PROCEDURE pro_import_under_take_count ()
BEGIN
/* 定义每月的第一天 */
DECLARE MonthFirstDay varchar(12) ;//定义的变量没哟写@符号,后期在使用的过程中也不要用使用@varible,直接写成最原始定义的变量名,
DECLARE Month_now varchar(20) ;
DECLARE under_year varchar(4) ;
DECLARE under_month varchar(2) ;//declare 定义的变量声明一定要在select赋值语句的上面,不然创建存储过程报错!!!折磨了我大半天,谨记
DECLARE done INT DEFAULT 0;
DECLARE totalRow INT DEFAULT 0;
DECLARE orgid VARCHAR(50);
/* 首先检查每个部门工单表中是否有本月工作考核的数据 使用游标进行遍历*/
DECLARE result CURSOR FOR SELECT org_id FROM event_undertake  GROUP BY org_id ;
#HAVING  under_take_time>[email protected]MonthFirstDay AND under_take_time<[email protected]Month_now;//这是错误的,谨记!!!
DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000‘ SET done = 1;
SELECT DATE_FORMAT(NOW(), ‘%Y-%m-01‘) INTO MonthFirstDay; //select赋值语句 变量值:“2017-09-03”格式
SELECT NOW() INTO Month_now;  //select赋值语句 变量值:“2017-09-03 19:32:23”格式
SELECT DATE_FORMAT(NOW(), ‘%Y‘) INTO under_year; //select赋值语句 变量值:“2017”格式(获取年份)
SELECT DATE_FORMAT(NOW(), ‘%m‘) INTO under_month; //select赋值语句 变量值:“09”格式(获取月份)

OPEN result;
    REPEAT
        FETCH result INTO orgid;
        IF done !=1 THEN
            /* 判断该部门是否存在本月的承办工单统计数据 */
            SELECT COUNT(*) INTO totalRow from event_undertake_count euc
                WHERE euc.under_take_year=under_year
                        AND euc.under_take_month=under_month
                        AND euc.count_type=‘1‘ AND euc.org_id = orgid;
            IF totalRow != 0 THEN
            /*存在,进行更新操作*/
                SET totalRow = 6;
                UPDATE event_undertake_count SET
                    under_take_count=(SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid  AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now)
                    ,not_end_count=(SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.end_status=‘0‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now )
                    ,end_count=(SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.end_status=‘1‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now )
                    ,on_time_end_count=(SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.over_time_status=‘0‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now )
                    ,over_time_end_count=(SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.over_time_status=‘1‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now)
                    ,do_well_count=(SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.do_well_status=‘1‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now)
                WHERE under_take_year=under_year AND under_take_month=under_month AND count_type=‘1‘ AND org_id = orgid;

            ELSE
            /*不存在,进行插入操作*/
                INSERT INTO event_undertake_count (id, org_id, under_take_year, under_take_month, count_type, under_take_count, not_end_count, end_count, on_time_end_count, over_time_end_count, do_well_count, create_time)
                SELECT
                    (SELECT REPLACE (UUID(), ‘-‘, ‘‘)) AS id,
                    (SELECT orgid) AS org_id,
                    (SELECT under_year) AS under_take_year,
                    (SELECT under_month) AS under_take_month,
                    (SELECT ‘1‘) AS count_type,
                    (SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS under_take_count ,
                    (SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.end_status=‘0‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS not_end_count ,
                    (SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.end_status=‘1‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS end_count ,
                    (SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.over_time_status=‘0‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS on_time_end_count ,
                    (SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.over_time_status=‘1‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS over_time_end_count ,
                    (SELECT COUNT(*)  from event_undertake e  WHERE e.org_id=orgid AND e.do_well_status=‘1‘ AND e.under_take_time>=MonthFirstDay AND e.under_take_time<=Month_now ) AS do_well_count ,
                    (SELECT Month_now) AS create_time;

            END IF;
            /*ceshi */
            #SELECT orgid,totalRow,under_year,under_month;
        END IF;
    UNTIL done END REPEAT;
CLOSE result;
#SELECT MonthFirstDay,Month_now,under_year,under_month;
END

#测试
CALL pro_import_under_take_count();

重要点:

1、游标中 FETCH result INTO orgid; 中orgid不可以跟result中取出来的字段一样,否则取不出来数据,(郁闷了我半天,午睡都没有睡)

2、存储过程定义declare只能放在最上面,其次是select语句;

3、SQL语句生产32位UUID:SELECT REPLACE(UUID(),‘-‘,‘‘) AS id;

4、select 查询 涉及 where group by ,having 的时候,查询的顺序

select COUNT(*)as ‘>20岁人数‘,classid  from Table1 where sex=‘男‘ group by classid,age having age>20 
  • 需要注意说明:当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
  • 执行where子句查找符合条件的数据;
  • 使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
  • having 子句中的每一个元素也必须出现在select列表中(这一条很重要,又是坑了我半天)。有些数据库例外,如oracle.
  • having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
  • having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

5、mysql中变量申明定义

  • DECLARE variable_name datatype(size) DEFAULT default_value;  此处声明的相当于一个局部变量 ,在end 之后便失效。声明多个变量:DECLARE x, y INT DEFAULT 0 ;
  • SET @num=19;   SET @num:=19;    //一个是"="进行赋值;另一个是使用“:=”进行赋值。此处的session变量不需要声明,mysql会自动根据值类型来确定类型,这种变量要在变量名称前面加上“@”符号,叫做会话变量,代表整个会话过程他都是有作用的,这个有点类似于全局变量一样。这种变量用途比较广,因为只要在一个会话内(就是某个应用的一个连接过程中),这个变量可以在被调用的存储过程或者代码之间共享数据。
  • select @num:=1; 或 select @num:=字段名 from 表名 where ……    //比如:SELECT @num:= COUNT(*) FROM blog_note;
  • 注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”。

  

时间: 2024-10-06 20:28:51

存储过程常见错误合集的相关文章

蒟蒻的傻逼错误合集(持续更新)

1.同一场比赛中第一天数组开小了,第二题数组开大了 2.把int main写成int mian,问我这个程序怎么ce了 3.提交答案题,格式错误,不会用checker,自信提交 4.在main函数中把return 0写成return 5.文件操作写反stdin和stdout 6.文件操作自信加后缀-s 7.源文件名自信叫后缀-s 8.写SPFA,inf设置小了 9.写完正解,自信编译过了,不取调试语句 10.写完dfs,自信提交,结果忘了使用 11.自信读一半题,脑补另一半

[联赛前反思] 近期脑残错误合集

1. 技术失误 ① 大小写 昨天模拟赛竟然打错了.. ② 不开long long 只能在每道题读题时就先要预估好范围,在最开始就要保证开好.还不能爆空间.. ③ 在循环二维数组时,把n,m写成n,n 清奇的垃圾错误.. ④ 循环内用到了相同变量名.. 2. 思考上的漏洞 共同漏洞:思维 & 审题 一直在练算法..然而实际比赛最重要的是从题目看出算法,再进行求解.. 最缺乏的就是这个过程需要的智商..只好靠做题弥补..还有在想题时就想出多种可能性一一思 考,不要想出一种就开始打,或者想不出来就看题

c 错误合集

: Ambiguous operators need parentheses - 不明确的运算需要用括号括起2: Ambiguous symbol xxx - 不明确的符号3: Argument list syntax error - 参数表语法错误4: Array bounds missing - 丢失数组界限符5: Array size toolarge - 数组尺寸太大6: Bad character in paramenters - 参数中有不适当的字符7: Bad file name

spyder错误合集

SyntaxError: invalid syntax是非法语句的意思,检查语法是否出现错误,漏写等 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape是文件路径出错有三种方法:1.在路径前面加r,即保持字符原始值的意思.2.将单斜杠替换为双反斜杠3.将单斜杠替换为正斜杠 imported but unused是warn

Android中解析JSON格式数据常见方法合集

待解析的JSON格式的文件如下: [{"id":"5", "version":"1.0", "name":"xiaowang"}, {"id":"10", "version":"2.0", "name":"lisi"}] 一.使用JSONObject来解析JSON数据

常见错误锦集

LCT splay只有该点的父亲节点不是根节点的时候才转两次 for(int y = fa(x); !IsRoot(x); rotate(x), y = fa(x)) if(!IsRoot(y))//注意 rotate( ident(x) == ident(y) ? y : x ); access的时候需要将节点转到全局的根,所以循环边界为x==0 而splay的时候只要转到当前根就可以了 access: for(int y = 0; x; x = fa(y = x)) splay: for(i

Hibernate常见错误整理

Hibernate常见错误合集 1.错误:object references an unsaved transient instance - save the transient instance before flushing: com.xxxx.bean.java.Sysblog; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instanc

js验证网址等Javascript常见验证代码合集

发一个利用js验证网址是否正确,email格式是否正确,是否为数字及数字的范围,密码或字符长度及是否相等及要求的最小字符串长度,输入是否为空等Javascript常见验证代码合集,用的上的朋友可以拿去了自行添加整理. 关键的JavaScript代码函数: 查看代码 打印 001 /** 002 * 数据验证框架.增加了对id字段检查出错时,直接在对应后面添加一< span>元素来显示错误信息. 003 * 004 * @author www.phpernote.com 005 * @versi

SQL用法操作合集

最近复习了一下SQL语句,用把SQL各种基本的用法小小地总结了下 一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... 4 [TABLE CONSTRAINT] 5 [TABLE_PARTITION_CLAUSE] 6 ): 例子: 1 CREATE TABLE book( 2 book_number VARCHAR2(5), 3 book_name VARCHAR2(30