0
点赞
收藏
分享

微信扫一扫

存储过程学习

骑在牛背上看书 2022-04-29 阅读 182

/*拼音缩写相关函数*/

DELIMITER $$

CREATE

    FUNCTION `mypos01`.`pysxcx`(zw VARCHAR(50))

    RETURNS VARCHAR(10)

    DETERMINISTIC

    BEGIN

     SET @pysx='';

     SET @len=CHAR_LENGTH(zw);

     SET @i=1;

     WHILE @i<=@len DO

         SET @hz=SUBSTR(zw,@i,1);

         SELECT jp INTO @jp FROM hzpyb WHERE hz=@hz;

         SET @pysx=CONCAT(@pysx,@jp);

         SET @i=@i+1;

         END WHILE;

      RETURN @pysx;

    END$$

DELIMITER ;

/*插入tb_hpxxb之前触发触发器*/

DELIMITER $$

CREATE TRIGGER `mypos01`.`update_mcsx_before_insert_tb_hpxxb`

BEFORE INSERT ON `mypos01`.`tb_hpxxb`

    FOR EACH ROW

    BEGIN

         SET new.mcsx=pysxcx(new.hpmc);

    END$$

DELIMITER ;

/*修改tb_hpxxb之前触发触发器*/

DELIMITER $$

CREATE TRIGGER `mypos01`.`update_mcsx_before_update_tb_hpxxb`

BEFORE UPDATE ON `mypos01`.`tb_hpxxb`

    FOR EACH ROW

    BEGIN

             SET new.mcsx=pysxcx(new.hpmc);

    END$$

DELIMITER ;

/*tb_hpxxb增删改存储过程*/

DROP PROCEDURE IF EXISTS `mypos01`.`tb_hpxxbcp`;

DELIMITER $$

CREATE

    PROCEDURE `mypos01`.`tb_hpxxbcp`(

          hpid INT,

          hpmc VARCHAR(50),

          hptm VARCHAR(20),

          jldw VARCHAR(20),

          hpzt TINYINT,

          dj DECIMAL(18,3),

          cxj DECIMAL(18,3)

    )

   BEGIN

         IF hpid=0 THEN

        INSERT INTO tb_hpxxb(hpmc,hptm,jldw,hpzt,dj,cxj) VALUES(hpmc,hptm,jldw,0,dj,cxj);

        SET @hpid=@@identity;

        INSERT INTO tb_hpkcb VALUES(NULL,@hpid,0,0,0);

         ELSEIF hpid>0 THEN

        UPDATE tb_hpxxb SET tb_hpxxb.hpmc=hpmc,tb_hpxxb.hptm=hptm,tb_hpxxb.jldw=jldw,

        tb_hpxxb.hpzt=hpzt,tb_hpxxb.dj=dj,tb_hpxxb.cxj=cxj

        WHERE tb_hpxxb.hpid=hpid;

         ELSE

        DELETE FROM tb_hpkcb WHERE tb_hpkcb.hpid=-hpid;

        DELETE FROM tb_hpxxb WHERE tb_hpxxb.hpid=-hpid;

           END IF;

    END$$

DELIMITER ;

/*货品表信息查询存储过程*/

DROP PROCEDURE IF EXISTS `mypos01`.`tb_hpxxbcx`;

DELIMITER $$

CREATE

    PROCEDURE `mypos01`.`tb_hpxxbcx`(hpid INT)

    BEGIN

             IF hpid=0 THEN

                SELECT * FROM tb_hpxxb ;

             ELSE

                SELECT * FROM tb_hpxxb WHERE tb_hpxxb.`hpid`=hpid ;

                END IF;

    END$$

DELIMITER ;

/*测试货品信息表的增删改*/

CALL tb_hpxxbcp(0,'康师傅方便面','1012','袋',0,1.5,1);

CALL tb_hpxxbcp(0,'百事可乐','1011','桶',0,3.5,3);

CALL tb_hpxxbcp(0,'涪陵榨菜','1013','袋',0,1.5,1);

CALL tb_hpxxbcp(0,'农夫山泉','1014','瓶',0,1.5,1);

/*修改*/

CALL tb_hpxxbcp(3,'涪陵榨菜','1013','袋',0,2.5,2);

/*删除*/

CALL tb_hpxxbcp(-1,'','','',0,0,0);

CALL tb_hpxxbcp(-2,'','','',0,0,0);

CALL tb_hpxxbcp(-3,'','','',0,0,0);

CALL tb_hpxxbcp(-4,'','','',0,0,0);


 

/*货品表的查询*/

CALL tb_hpxxbcx(0);

CALL tb_hpxxbcx(9);















 

DROP  PROCEDURE IF EXISTS `mypos01`.`tb_syjlbcp`;

DELIMITER $$

CREATE

    PROCEDURE `mypos01`.`tb_syjlbcp`(syyid INT,hyid INT,zffs TINYINT,ysje DECIMAL(18,2),

    ssje DECIMAL(18,2),symx VARCHAR(8000)  )

    BEGIN

         /*更新收银记录表*/

         INSERT INTO tb_syjlb    VALUES(NULL,syyid,hyid,NOW(),zffs,ysje,ssje,ysje-ssje,0,NULL);

         SET @syid=@@identity;

         /*更新tb_syjlmxb*/

         /*j解析symx字符串 形式:1,1,2,2,3,1,   形式*/

         DROP TABLE IF EXISTS lsb;

         CREATE TEMPORARY TABLE lsb(hpid INT,xssl DECIMAL(18,3));

         WHILE symx>'' DO

               SET @index=POSITION(',' IN symx);

               SET @hpid=LEFT(symx,@index-1);

               SET symx=SUBSTR(symx,@index+1);

                 SET @index=POSITION(',' IN symx);

               SET @ssxl=LEFT(symx,@index-1);

               SET symx=SUBSTR(symx,@index+1);

               INSERT INTO lsb VALUES(@hpid,@ssxl);

         END WHILE;

         INSERT INTO tb_syjlmxb(syid,hpid,xssl,dj,cxj)   SELECT @syid,lsb.hpid,xssl,dj,cxj FROM lsb,tb_hpxxb WHERE lsb.hpid=tb_hpxxb.hpid;

       

        /*更新库存*/

            DROP TABLE IF EXISTS lsb1;

         CREATE TEMPORARY TABLE lsb1(hpid INT,xssl DECIMAL(18,3));

         /*合并同类商品数量*/

         INSERT INTO lsb1 SELECT hpid,SUM(xssl) FROM lsb GROUP BY hpid;

        UPDATE tb_hpkcb b1,lsb1 b2 SET b1.kcsl=b1.kcsl-b2.xssl  WHERE b1.hpid=b2.hpid;

       

        /*更新会员信息*/

        IF hyid>10000 THEN

           UPDATE tb_hyxxb SET knye=knye-ssje ,kyjf=kyjf+FLOOR(ssje)

           ,scxfsj=NOW()

           WHERE tb_hyxxb.`hyid`=hyid;

        END IF;

    END$$

DELIMITER ;

/*测试*/

/*插入几个会员信息*/

INSERT INTO tb_hyxxb VALUES(NULL,'张三','男','1000001','123454543',100,0,NULL);

INSERT INTO tb_hyxxb VALUES(NULL,'李四','男','1000002','123454543',100,0,NULL);

/*初始化库存*/

UPDATE tb_hpkcb SET kcsl=10;

/*销售商品*/

CALL  tb_syjlbcp(1,10001,0,12.5,10,'1,1,2,2,1,1,3,1,');

/*分别查看4个表的变化*/






 

/*查询销售记录*/

SELECT syid,syyid, sysj,hyid,ysje,ssje,yhje,CASE zffs

                     WHEN 0 THEN '现金'

                     WHEN 1 THEN '储值卡'

                     WHEN 2 THEN '支付宝'

                     WHEN 3 THEN '微信支付'

                    END  AS 支付方式

                    FROM tb_syjlb WHERE syyid= 1 AND sysj>=CURDATE() ORDER BY syid DESC;

/*创建视图v_xsjlmxb*/

DROP VIEW IF EXISTS `mpos1`.`v_xsjlmcb`;

CREATE

    VIEW `mpos1`.`v_xsjlmcb`

    AS

(SELECT mxid,hpmc,jldw ,xssl,tb_syjlmxb.dj,tb_syjlmxb.cxj FROM tb_syjlmxb,tb_hpxxb

WHERE tb_syjlmxb.`hpid`=tb_hpxxb.`hpid` );

/*创建查询销售记录及销售明细存储过程*/

DROP  PROCEDURE IF EXISTS `mypos01`.`SyjlCx`;

DELIMITER $$

CREATE

   PROCEDURE `mypos01`.`SyjlCx`(cxlb INT,cxcs INT)

   BEGIN

             IF cxlb=0 THEN

                SELECT syid,syyid, sysj,hyid,ysje,ssje,yhje,  CASE zffs

                     WHEN 0 THEN '现金'

                     WHEN 1 THEN '储值卡'

                     WHEN 2 THEN '支付宝'

                     WHEN 3 THEN '微信支付'

                    END

                    FROM tb_syjlb WHERE syyid= cxcs AND sysj>=CURDATE() ORDER BY syid DESC;          

               ELSE

                          SELECT * FROM v_xsjlmxb WHERE syid=cxcs;

  END IF;

    END$$

DELIMITER ;

/*验证存储过程*/

CALL SyjlCx(0,1);

CALL SyjlCx(1,5);

/*退货存储过程*/

DELIMITER $$

USE `mypos01`$$

DROP PROCEDURE IF EXISTS `Thjlcp`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Thjlcp`(syid INT)

BEGIN

        SELECT  hyid INTO @hyid    FROM tb_syjlb   WHERE tb_syjlb.`syid`=syid;

        SELECT  ssje INTO @ssje    FROM tb_syjlb   WHERE tb_syjlb.`syid`=syid;

          /*变更 余额与积分*/

          IF @hyid>10000 THEN

                UPDATE tb_hyxxb SET knye=knye+@ssje,kyjf=kyjf-FLOOR(@ssje)   WHERE tb_hyxxb.`hyid`=@hyid;

          END IF;

            /*还原库存   */

          -- 先还原库存

          DROP TABLE IF EXISTS lsb;

         CREATE TEMPORARY TABLE lsb (hpid INT,xssl NUMERIC(18,3));

        INSERT INTO lsb (hpid,xssl) SELECT hpid,SUM(xssl) FROM tb_syjlmxb WHERE `tb_syjlmxb`.`syid`=syid GROUP BY hpid ;

        UPDATE tb_hpkcb b1,lsb b2 SET b1.kcsl=b1.kcsl+b2.xssl WHERE b1.hpid=b2.hpid;

        DELETE  FROM tb_syjlmxb WHERE tb_syjlmxb.`syid`=syid;

        DELETE FROM  tb_syjlb  WHERE tb_syjlb.`syid`=syid;

   END$$

DELIMITER ;

/*验证退货过程*/

CALL thjlcp(4);

/*用触发器实现退货*/

/*创建一个新的存储过程*/

DELIMITER $$

CREATE

    PROCEDURE `mypos01`.`thjlcp_new`(syid INT)

    BEGIN

             DELETE FROM tb_syjlb WHERE tb_syjlb.syid=syid;

    END$$

DELIMITER ;

/*在tb_syjlb上增加删除触发器,删除一条记录时,用触发器还原库存、会员积分,同时删除销售记录明细表*/

DROP TRIGGER IF EXISTS `mypos01`.`update_hpckb_hyxxb_delete_xsjlmxb_before_delete_syjlb` ;

DELIMITER $$

CREATE

    /*[DEFINER = { user | CURRENT_USER }]*/

    TRIGGER `mypos01`.`update_hpckb_hyxxb_delete_xsjlmxb_before_delete_syjlb`

     BEFORE  DELETE

    ON `mypos01`.`tb_syjlb`

    FOR EACH ROW BEGIN

                 /*变更 余额与积分*/

          IF old.hyid>10000 THEN

                UPDATE tb_hyxxb SET knye=knye+old.ssje,kyjf=kyjf-FLOOR(old.ssje)   WHERE tb_hyxxb.`hyid`=old.hyid;

          END IF;

            /*还原库存   */

          -- 先还原库存

        UPDATE tb_hpkcb b1,(SELECT hpid,SUM(xssl)  AS xssl FROM tb_syjlmxb WHERE `tb_syjlmxb`.`syid`=old.syid GROUP BY hpid) b2

        SET b1.kcsl=b1.kcsl+b2.xssl WHERE b1.hpid=b2.hpid;

        DELETE  FROM tb_syjlmxb WHERE tb_syjlmxb.`syid`=old.syid;

    END$$

DELIMITER ;

/*验证存储过程*/

/*销售一笔*/

CALL  tb_syjlbcp(1,10001,0,12.5,10,'1,1,2,2,1,1,3,1,');

CALL  thjlcp_new(9)


 

/*事后退货*/

CREATE

    PROCEDURE `mypos01`.`thjlcp_new`(syid INT)

    BEGIN

         IF syid>0 THEN   /*当天退货*/

             DELETE FROM tb_syjlb WHERE tb_syjlb.syid=syid;  

          ELSE /*时候退货*/

           /*增加一条负销售*/

            INSERT tb_syjlb(syyid,hyid,sysj,zffs,ysje,ssje,yhje,xszt,zzid) SELECT syyid,hyid,NOW(),zffs,-ysje,-ssje,-yhje,-1,zzid

            FROM tb_syjlb WHERE tb_syjlb.syid=-syid;

            SET @syid_new=@@identity;

            /*修改销售状态,以避免多次退货*/

             UPDATE   tb_syjlb SET xszt=@syid_new WHERE  tb_syjlb.syid=-syid;

             /*在销售明细表中插入负销售*/

            INSERT INTO tb_syjlmxb(syid,hpid,xssl,dj,cxj)

            SELECT @syid_new,hpid,-xssl,dj,cxj FROM tb_syjlmxb WHERE tb_syjlmxb.`syid`=-syid;

            /*变更库存*/

          DROP TABLE IF EXISTS lsb;

         CREATE TEMPORARY TABLE lsb (hpid INT,xssl NUMERIC(18,3));

        INSERT INTO lsb (hpid,xssl) SELECT hpid,SUM(xssl) FROM tb_syjlmxb WHERE `tb_syjlmxb`.`syid`=-syid GROUP BY hpid ;

        UPDATE tb_hpkcb b1,lsb b2 SET b1.kcsl=b1.kcsl+b2.xssl WHERE b1.hpid=b2.hpid;

           /*如果是会员,还原积分*/

         SELECT  hyid INTO @hyid    FROM tb_syjlb   WHERE tb_syjlb.`syid`=-syid;

        SELECT  ssje INTO @ssje    FROM tb_syjlb   WHERE tb_syjlb.`syid`=-syid;

          IF @hyid>10000 THEN

                UPDATE tb_hyxxb SET knye=knye+@ssje,kyjf=kyjf-FLOOR(@ssje)   WHERE tb_hyxxb.`hyid`=@hyid;

          END IF;

            END IF;

    END$$

DELIMITER ;

/*验证存储过程

CALL thjlcp_new(-11)

举报

相关推荐

0 条评论