滴答丶滴答
2018-03-02 09:30
采纳率: 50%
浏览 1.9k
已采纳

mysql存储过程的out参数的问题

有A(OUT S INT)和B(out y int)两个存储过程
A存储过程调用B存储过程,并且将Y赋值跟S,在a存储过程中有select s查出 y的值,为什么返回为空
求解决,谢谢!!!!!!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • 西吉哥 2018-03-02 09:44
    已采纳

    在调用时先用个临时变量接收Out参数看看, CALL pro_zw_getsystableid('tbl_zw_ArrivalSecurity', @id2);

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • 西吉哥 2018-03-02 09:30

    请将调用和赋值代码贴上来

    评论
    解决 无用
    打赏 举报
  • 滴答丶滴答 2018-03-02 09:32

    DELIMITER $$

    DROP PROCEDURE IF EXISTS pro_zw_arrivalSecurity_add $$
    CREATE PROCEDURE carstation_mysql.pro_zw_arrivalSecurity_add(
    OUT RETURN_VALUE INT,
    busArchId VARCHAR(20),
    busNumber VARCHAR(10),
    unitName VARCHAR(100),
    imagename VARCHAR(30),
    busType VARCHAR(10),
    Mainman VARCHAR(20),
    secondman VARCHAR(20),
    createdMan VARCHAR(20),
    SecurityResult BIT,
    memo VARCHAR(500),
    menuidstr VARCHAR(500),
    menuname VARCHAR(500),
    driverid VARCHAR(20),
    drivername VARCHAR(20),
    OUT id INT,
    timestr VARCHAR(8))
    BEGIN
    DECLARE fid VARCHAR(10);
    DECLARE fname VARCHAR(50);
    DECLARE dt VARCHAR(19);
    DECLARE i INT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION,
    SQLWARNING,
    NOT FOUND
    BEGIN
    ROLLBACK;
    SELECT 0 AS RETURN_VALUE,id AS id;

    END;
    SET RETURN_VALUE=90;
    SET timestr=0;
    START TRANSACTION;

    IF timestr='' THEN
        SET timestr=CONVERT(CURDATE(),CHAR);
        SET dt=CONVERT(CURDATE(),CHAR)+' '+timestr;
    END IF;
    
    IF EXISTS(SELECT * FROM tbl_zw_ArrivalSecurity  WHERE busNumber=busNumber AND DATEDIFF(createdDate,CURDATE())<10) THEN
        CALL sys_abnormal(0,0,0,RETURN_VALUE );
    END IF; 
    
    
     CALL pro_zw_getsystableid('tbl_zw_ArrivalSecurity',id); -- 获取表id
    INSERT INTO tbl_zw_ArrivalSecurity(createdDate,id,busArchId,busNumber,busType,unitName,imagename,Mainman,secondman,createdMan,SecurityResult,memo,driverid,drivername)  
    VALUES(dt,id,busArchId,busNumber,busType,unitName,imagename,Mainman,secondman,createdMan,SecurityResult,memo,driverid,drivername);
    CALL sys_abnormal(ROW_COUNT(),1,0,RETURN_VALUE );
    
    UPDATE tbl_zw_BusArchives SET 
                ajopertor='主检:'+Mainman+',副检:'+secondman,
                ajbs=SecurityResult,
                ajdt=CURDATE(),
                bsnum=0,
                ajid=id 
    WHERE busArchId=busArchId;   -- 更新状态为已安检
    WHILE  (INSTR(menuidstr,'|')>0)AND(LENGTH(menuidstr)>1) DO    
        SET menuidstr=RIGHT(menuidstr,LENGTH(menuidstr)-1);
        SET i=INSTR('|',menuidstr);
        SET fid=LEFT(menuidstr,i-1);
        SET menuidstr=RIGHT(menuidstr,LENGTH(menuidstr)-i+1);
    
    
        IF LENGTH(menuname)>2  THEN
            SET menuname=RIGHT(menuname,LENGTH(menuname)-1);
        END IF; 
    
        IF LENGTH(menuname)>2 THEN
            SET i=INSTR('|',menuname);
        END IF;
    
        IF LENGTH(menuname)>2 THEN 
            SET fname=LEFT(menuname,i-1);
        END IF;
    
        IF LENGTH(menuname)>2 THEN 
            SET menuname=RIGHT(menuname,LENGTH(menuname)-i+1);
        END IF;
    
        INSERT INTO tbl_zw_ArrivalSecurity_mx(id ,menuid,memo)
        VALUES(id,fid,fname);
        CALL sys_abnormal(ROW_COUNT(),1,0,RETURN_VALUE );
    END WHILE;
    
    CALL sys_abnormal(ROW_COUNT(),1,0,RETURN_VALUE );
    COMMIT;
        SELECT 1 AS RETURN_VALUE,id AS id;
    END$$
    

    DELIMITER ;

    DELIMITER $$

    DROP PROCEDURE IF EXISTS pro_zw_getsystableid$$

    CREATE PROCEDURE carstation_mysql.pro_zw_getsystableid(

    tablename VARCHAR(50),
    OUT id INT 
    

    )
    BEGIN
    SELECT tableid AS id FROM tbl_zw_sysTableId WHERE tablename=tablename;

      UPDATE tbl_zw_sysTableId  SET tableid=tableid+1 
      WHERE tablename=tablename AND tableid=id;
    
      IF ROW_COUNT()=0 THEN
       SET id=0; -- 当未更新成功时,说明此值已被其它用户数据占用,将返回0值,重新获取
      END IF;
    END$$
    

    DELIMITER ;

    评论
    解决 无用
    打赏 举报
  • 滴答丶滴答 2018-03-02 09:36
    CALL sys_abnormal(ROW_COUNT(),1,0,RETURN_VALUE );这个掉用不管,使用来报异常的
    
    评论
    解决 无用
    打赏 举报
  • 滴答丶滴答 2018-03-02 09:38
     CALL pro_zw_getsystableid('tbl_zw_ArrivalSecurity',id); 这句话调用的下面的B存储过程
    
    评论
    解决 无用
    打赏 举报
  • 滴答丶滴答 2018-03-02 10:07

    好像这个是能够正常调用的,但是我里面有一个是存储过程是用来抛异常的,里面也有这样的out参数,但是当抛异常时就不能返回成功,这样没有什么比较好的处理办法

    评论
    解决 无用
    打赏 举报
  • qq_34595570 2018-03-03 02:19

    CALL sys_abnormal(ROW_COUNT(),1,0,RETURN_VALUE );这个掉用不管,使用来报异常的

    评论
    解决 无用
    打赏 举报
  • den253176 2018-03-05 03:16

    存储过程里面调用存储过程最终得到的都是查询结果,如果你要通过另一个存储过程做异常判断,
    就只能在外存储过程中定义临时参数接收调用的存储过程执行结果,来判断做出外存储过程的相应操作,
    CALL pro_zw_getsystableid('tbl_zw_ArrivalSecurity',id) 调用报错你就要查看这个B存储过程返回的结果是不是你
    A接收定义的类型参数个数是否相同,或则本身B存储过程语法执行就有错误,不妨当读把B存储过程拿出来执行下

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题