欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql存储过程:实现一个表复制另一个表的字段

程序员文章站 2022-05-08 21:57:10
...

1.存储过程

功能:登录验证

逻辑:

(1)参数说明:

v_name:用户登录名

v_psd:用户密码

v_out:用户不存在或用户密码不正确的是否v_out=1,否则v_out=9

(2)步骤:

a.从用户表user查询用户名为v_name的用户是否存在

存在则进入下一步,否则v_out=1

b.从用户表user查询用户名为v_name的用户的密码pass

判断用户密码和v_psd是否相等,相等时v_out=9否则v_out=1

代码

DELIMITER $$
CREATE PROCEDURE proc_login
(IN v_name VARCHAR(16),
 IN v_psd VARCHAR(8),
 OUT v_out INT)
BEGIN
  DECLARE v_pass VARCHAR(8) ;
  DECLARE v_num INT ;
  SELECT COUNT(*) INTO v_num FROM USER WHERE NAME=v_name;
  IF v_num<>0 THEN
     SELECT pass INTO v_pass FROM USER WHERE NAME=v_name;
     IF v_pass=v_psd THEN
        SET v_out=9;
     ELSE
        SET v_out=1;
     END IF;
  ELSE
     SET v_out=1;
  END IF;
END$$
DELIMITER ;
 

 2.复制第一个表的字段到第二个表上

功能:复制字段

逻辑:

1.用1条sql语句查询出所有不同的字段的信息,并存入游标中

SELECT * FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon1' AND table_schema = 'cpdb_dev'  AND COLUMN_NAME NOT IN

 (SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon' AND table_schema = 'cpdb_dev');

 

2.遍历游标,游标的每行分别是rowtype类型的变量。rowtype.字段名方式获取字段数据

3.获取cloumn_name,data_type,character_maximum_length拼接alter table语句。

4.执行一次alter table语句。

难点:mysql没有rowtype这样代表正行的数据类型。

 

DELIMITER $$
CREATE PROCEDURE print
(OUT a VARCHAR(50),
 OUT b VARCHAR(50),
 OUT c VARCHAR(50))
BEGIN
    DECLARE _kubauserid1 VARCHAR(50);
    DECLARE _kubauserid2 VARCHAR(50);
    DECLARE _kubauserid3 VARCHAR(50);
    DECLARE flag INT;   
    DECLARE update_cursor CURSOR 
    FOR 
   SELECT column_name,data_type,character_maximum_length FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon1' AND table_schema = 'cpdb_dev'  AND COLUMN_NAME NOT IN
 (SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon' AND table_schema = 'cpdb_dev');

DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=1;
    SET flag=0;
    
    OPEN update_cursor;
    REPEAT  /*循环*/
    FETCH update_cursor INTO _kubauserid1,_kubauserid2,_kubauserid3;
        SET a=_kubauserid1;
        SET b=_kubauserid2;
        SET b=_kubauserid3;
        SELECT a,b,c;
    /*update set where*/
    UNTIL flag 
    END REPEAT;
    CLOSE update_cursor ;
    
END$$
DELIMITER ;


CALL print(@a,@b,@c);
SELECT @a,@b,@c;

 总结:没有解决问题,只是把不同的字段信息获取了,用游标遍历的是指单个字段,但是程序能运行并且游标能运行没问题。