mysql存储过程,错误求解决

曹昌平 发布于 2010/12/10 15:20
阅读 357
收藏 1

DELIMITER $$

ALTER PROCEDURE `sp_test`(vdnId CHAR(2),startTimeStr CHAR(8))
BEGIN
DECLARE v_startTime DATETIME;
 DECLARE v_endTime DATETIME;
 DECLARE v_VDNName CHAR(2);
 DECLARE v_sql VARCHAR(1000);
 
 /*判断输入参数的合法性*/
 
 SELECT t.VDN_name INTO v_VDNName FROM gdmdw.t_dim_vdn t WHERE t.vdn_key = vdnId;
 SELECT STR_TO_DATE(startTimeStr, '%Y%m%d') INTO v_startTime;
 SELECT DATE_ADD(v_startTime,INTERVAL 1 DAY) INTO v_endTime;
 
 /*实现业务逻辑*/
 -- 整理时长
 SET v_sql = CONCAT('
 INSERT INTO tmp_',v_VDNName,'_tagentopr
 (kpi_key,time_key,agent_key,kpi_value)
 (
 SELECT "work_time_key",th.time_key,t.agentid, SUM(
 CASE
 
 WHEN (th.fulldate_key>=t.actbegin AND th.fulldate_key<t.actend)
 THEN UNIX_TIMESTAMP(t.actend)-UNIX_TIMESTAMP(th.fulldate_key)
 
 WHEN (th.fulldate_key<t.actbegin AND DATE_ADD(th.fulldate_key,INTERVAL 1 DAY)>t.actend)
 THEN  UNIX_TIMESTAMP(t.actend)-UNIX_TIMESTAMP(t.actbegin)
 
 WHEN (DATE_ADD(th.fulldate_key,INTERVAL 1 DAY)>t.actbegin) AND (DATE_ADD(th.fulldate_key,INTERVAL 1 DAY)<t.actend)
 THEN UNIX_TIMESTAMP(DATE_ADD(th.fulldate_key,INTERVAL 1 DAY)) - UNIX_TIMESTAMP(t.actbegin)
 
 END
 ) AS worktime
 FROM (SELECT time_key,fulldate_key
       FROM gdmdw.t_dim_time th WHERE th.fulldate_key >=  ?
       AND th.fulldate_key <?) th LEFT JOIN (
       SELECT t.agentid,t.actbegin,t.actend FROM gdmods.tagentoprinfo t
       WHERE OperateType="0"     
       AND t.actend>= ?
       AND t.actend<?
      
      
       UNION ALL
       SELECT t.agentid,MAX(t.actbegin),  ?
       FROM gdmods.tagentoprinfo t WHERE (OperateType="1" OR OperateType="0")
       AND t.actend>=?
       AND t.actend<?
       GROUP BY t.agentid
       HAVING MAX(t.actbegin)=MAX(t.actend)  
    ) t
    ON    ( (DATE_ADD(th.fulldate_key,INTERVAL 1 DAY) >=t.actbegin)  AND  th.fulldate_key < t.actend)
    AND t.actend IS NOT NULL
      
    GROUP BY agentid,time_key');
 
 SET @a = v_startTime;
 SET @b = v_endTime;
 SET @c = v_startTime;
 SET @d= v_endTime;
 SET @e=v_endTime;
        SET @f= v_startTime;
 SET @g = v_endTime;
 SELECT v_sql;
 SET @SQL = v_sql;
 PREPARE s1 FROM @SQL;
        EXECUTE s1 USING @a,@b,@c,@d,@e,@f;
        DEALLOCATE PREPARE s1;
    END$$

DELIMITER ;

 

能创建这个过程,但是执行时出错

加载中
0
红薯
红薯

出错?出什么错啊?

0
曹昌平
曹昌平

Query : call sp_test(1, 20101222)

Error Code : 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 38

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

红薯哥,强势出击,这个问题必当迎刃而解

0
曹昌平
曹昌平

错误提示没什么含义

0
燕尘
燕尘

写的语法太复杂了,一层套一层,一个语句写了几十行,导致错误难以定位,别人也很难看懂。

你可以通过定义各种临时变量、临时表,把原来的一个复杂语句,拆成许多简单短小的基本语句来执行啊。

0
曹昌平
曹昌平

................

0
燕尘
燕尘

另外呢,你没有检查一个参数是否为 Null ,就会发生很多错误。

比方说,

SELECT t.VDN_name INTO v_VDNName FROM gdmdw.t_dim_vdn t WHERE t.vdn_key = vdnId;

如果结果为空, v_VDNName 就是 Null ,后头的所有操作就都无意义了。

 

MySQL 里头大部分的错误是因为参数为 Null 。

0
曹昌平
曹昌平

o   谢谢  指教   我仔细看看

0
曹昌平
曹昌平

.............................还真没考虑这么多

返回顶部
顶部