首页 新闻 会员 周边

急救:Mysql 中SQL在DB中执行正常,在存储过程中执行报错

0
悬赏园豆:50 [已关闭问题] 关闭于 2014-08-18 15:01

CREATE PROCEDURE PROC_AUTO_INSERT_PATROLSITELIST
BEGIN
    DECLARE T_ERROR INT DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET T_ERROR=1;
    START TRANSACTION;
    
    INSERT INTO tableA (SITE_ID, ORDER_ID)
    SELECT (SELECT UUID_SHORT()), d.ORDERID
    FROM
    (
    SELECT ORDERID FROM TEST LIMIT 100
    ) d;

    IF T_ERROR=1 THEN
        ROLLBACK;
        SET _SUCCESS=T_ERROR;
    ELSE
        COMMIT;
        SET _SUCCESS=T_ERROR;
    END IF;

END

标红部分在存储过程中执行报主键重复插入错误,其中SITE_ID为主键

红色部分在DB执行正常

岳帅超的主页 岳帅超 | 初学一级 | 园豆:156
提问于:2014-08-18 10:44
< >
分享
所有回答(2)
0

SITE_ID为主键?是整数?是自动增长的?

如果SITE_ID是整数且是自动增长的(这个跟主键其实关系并不大,但一般来说主键都会使用整数、自增长),那么你的SQL肯定有问题,因为自增长的字段是不允许在UPDATE、INSERT的时候显式的指定内容,而应该由系统自动设定。

把语句修改为:

INSERT INTO tableA ( ORDER_ID)
    SELECT d.ORDERID
    FROM
    (
    SELECT ORDERID FROM TEST LIMIT 100
    ) d;

 

就应该可以了(当然,这个是MySQL的,我对MySQL不懂,是否还有别的问题就不确定了)

519740105 | 园豆:5810 (大侠五级) | 2014-08-18 14:02

主键不是自增的,是数据内部函数获取的唯一ID,自己已查出问题,谢了

应该为这样:

INSERT INTO tableA (SITE_ID, ORDER_ID)
    SELECT UUID_SHORT(), d.ORDERID
    FROM
    (
    SELECT ORDERID FROM TEST LIMIT 100
    ) d;

支持(0) 反对(0) 岳帅超 | 园豆:156 (初学一级) | 2014-08-18 14:57

@岳帅超: 不客气,没能帮你解决问题。

 

不过,从你修改的代码看,只是一个括号的区别吧?难道对一个值单独添加一个括号会导致这个问题?

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-18 15:03

@519740105: 不是,是在Select语句中套用Select查询内部函数了,

Select (Select UUID_SHORT()),ORDERID from tableA;

改为:

Select UUID_SHORT(),ORDERID from tableA;

在存储过程中不行,在正常情况下执行时可以的,存储过程要求严格了

支持(0) 反对(0) 岳帅超 | 园豆:156 (初学一级) | 2014-08-18 15:52
0

CREATE PROCEDURE PROC_AUTO_INSERT_PATROLSITELIST
BEGIN
    DECLARE T_ERROR INT DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET T_ERROR=1;
    START TRANSACTION;
    
    INSERT INTO tableA (SITE_ID, ORDER_ID)
    SELECT UUID_SHORT(), d.ORDERID
    FROM
    (
    SELECT ORDERID FROM TEST LIMIT 100
    ) d;

    IF T_ERROR=1 THEN
        ROLLBACK;
        SET _SUCCESS=T_ERROR;
    ELSE
        COMMIT;
        SET _SUCCESS=T_ERROR;
    END IF;

END

岳帅超 | 园豆:156 (初学一级) | 2014-08-18 14:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册