Mysql中使用存储过程返回查询多个表的数据信息

-- 测试手机号
call P_Base_CheckLogin(‘15584463676‘);

-- 测试登录名
call P_Base_CheckLogin(‘sch000001‘)

-- 测试身份证号
call P_Base_CheckLogin(‘080428402304032042‘)

-- 测试学生手机号
call P_Base_CheckLogin(‘13019212198‘)

drop PROCEDURE IF EXISTS P_Base_CheckLogin;
create procedure  P_Base_CheckLogin(v_loginName      VARCHAR(255))
label:
BEGIN
        -- 手机号匹配
        SELECT v_loginName REGEXP "^[1][35678][0-9]{9}$" into @checkResult;
        if @checkResult=1 then
                select p.person_id,p.identity_id,p.person_name  into @person_id,@identity_id,@person_name from  t_base_person p  where p.tel=v_loginName limit 1;
                if @person_id is not null THEN
                    select l.login_name,l.login_password  into @login_name,@login_password from t_sys_loginperson l where [email protected]_id and l.IDENTITY_ID=@identity_id;
                    select @login_name as USER_NAME,@person_id as PERSON_ID,@identity_id as IDENTITY_ID ,@person_name as REAL_NAME,@login_password as PASSWORD;
                    LEAVE label;
                end if;

                -- 学生的手机号匹配
                select p.student_id,6 as identity_id into @person_id,@identity_id  from t_base_student as p where p.STU_TEL=v_loginName limit 1;
                if @person_id is not null THEN
                    select l.login_name,l.login_password  into @login_name,@login_password from t_sys_loginperson l where [email protected]_id and l.IDENTITY_ID=@identity_id;
                    select @login_name as USER_NAME,@person_id as PERSON_ID,@identity_id as IDENTITY_ID ,@person_name as REAL_NAME,@login_password as PASSWORD;
                    LEAVE label;
                end if;
        end if;

        -- 身份证号匹配
        select f_base_check_id_number(v_loginName) into @checkResult;
        if @checkResult=1 then
                select person_id,identity_id,person_name into @person_id,@identity_id,@person_name from  t_base_person p where p.IDENTITY_NUM=v_loginName limit 1;
                if @person_id is not null THEN
                    select l.login_name,l.login_password  into @login_name,@login_password from t_sys_loginperson l where [email protected]_id and l.IDENTITY_ID=@identity_id;
                    select @login_name as USER_NAME,@person_id as PERSON_ID,@identity_id as IDENTITY_ID ,@person_name as REAL_NAME,@login_password as PASSWORD;
                    LEAVE label;
                end if;
        end if;

    -- 正常登录名查询
        select l.login_name,person_id,identity_id,l.person_name,l.login_password into @login_name,@person_id,@identity_id,@person_name,@login_password from t_sys_loginperson l where l.login_name=v_loginName limit 1;
        if @person_id is not null THEN
            select @login_name as USER_NAME,@person_id as PERSON_ID,@identity_id as IDENTITY_ID ,@person_name as REAL_NAME,@login_password as PASSWORD;
            LEAVE label;
        end if;
END;
drop function if EXISTS f_base_check_id_number;

CREATE  FUNCTION `f_base_check_id_number`(`idnumber` CHAR(18))
    RETURNS enum(‘1‘,‘0‘)
    LANGUAGE SQL
    NOT DETERMINISTIC
    NO SQL
    SQL SECURITY DEFINER
    COMMENT ‘‘
BEGIN
DECLARE status ENUM(‘1‘,‘0‘) default ‘0‘;
DECLARE verify CHAR(1);
DECLARE sigma INT;
DECLARE remainder INT;

IF length(idnumber) = 18 THEN
    set sigma = cast(substring(idnumber,1,1) as UNSIGNED) * 7
        +cast(substring(idnumber,2,1) as UNSIGNED) * 9
        +cast(substring(idnumber,3,1) as UNSIGNED) * 10
        +cast(substring(idnumber,4,1) as UNSIGNED) * 5
        +cast(substring(idnumber,5,1) as UNSIGNED) * 8
        +cast(substring(idnumber,6,1) as UNSIGNED) * 4
        +cast(substring(idnumber,7,1) as UNSIGNED) * 2
        +cast(substring(idnumber,8,1) as UNSIGNED) * 1
        +cast(substring(idnumber,9,1) as UNSIGNED) * 6
        +cast(substring(idnumber,10,1) as UNSIGNED) * 3
        +cast(substring(idnumber,11,1) as UNSIGNED) * 7
        +cast(substring(idnumber,12,1) as UNSIGNED) * 9
        +cast(substring(idnumber,13,1) as UNSIGNED) * 10
        +cast(substring(idnumber,14,1) as UNSIGNED) * 5
        +cast(substring(idnumber,15,1) as UNSIGNED) * 8
        +cast(substring(idnumber,16,1) as UNSIGNED) * 4
        +cast(substring(idnumber,17,1) as UNSIGNED) * 2;
    set remainder = MOD(sigma,11);
    set verify = (case remainder
        when 0 then ‘1‘ when 1 then ‘0‘ when 2 then ‘X‘ when 3 then ‘9‘
        when 4 then ‘8‘ when 5 then ‘7‘ when 6 then ‘6‘ when 7 then ‘5‘
        when 8 then ‘4‘ when 9 then ‘3‘ when 10 then ‘2‘ else ‘/‘ end
    );

END IF;

IF right(idnumber,1) = verify THEN
    set status = ‘1‘;
END IF;

RETURN status;

END    
时间: 2024-08-04 03:51:16

Mysql中使用存储过程返回查询多个表的数据信息的相关文章

MySQL中的存储过程和函数使用详解

一.对待存储过程和函数的态度 在实际项目中应该尽量少用存储过程和函数,理由如下: 1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了. 2.调试麻烦,在db中报一个错误和在应用层报一个错误不是一个概念,那将是毁灭性打击,直接一个error:1045什么的更本毫无头绪. 3.扩展性不高. 所以在互联网时代大型项目应该尽量少使用(不使用)存储过程和函数. 二.创建存储过程 2.1什么是存储过程? 存储过程和存储函数都是一组sql语句的集合.这些语句集合被当做一个整体存入数

MySql中创建存储过程

MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句.特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗.现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高. 一.MySQL 创建存储过程 "pr_add" 是个简单的

mysql 中创建存储过程

mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表employee为例写一个简单的sql存储过程: 下边通过创建一个存储过程实现:输入性别,找出与输入性别相匹配的人的平均年龄,并将平均年龄输出. 这里首先通过delimiter &&,将sql语句的结束符换成&&(默认sql语句的结束符是;) 然后如下所示输入: 此时可以把语句的结束

mysql中timestamp字段,在更新这个字段其他数据时候,不更新timestamp的时间

mysql中timestamp字段,在更新这个字段其他数据时候,不更新timestamp的时间 执行这条SQL ALTER TABLE  XXXX(表名)  CHANGE TIME TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; 列如如下所示语句: ALTER TABLE  ai_manager.message_task CHANGE TIME TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法

背景 在MySQL中,写SQL语句的时候 ,可能会遇到 You can't specify target table '表名' for update in FROM clause 这样的错误 错误含义 它的意思是说,不能先 select 出同一表中的某些值,再 update 这个表(在同一语句中),即不能依据某字段值做判断再来更新某字段的值. 解决问题 将select出的结果再通过中间表select一遍,这样就可以解决错误了 MySQL 中 You can't specify target ta

SQL如何查询两个表的数据

在进行查询操作时,我们通常需要查询两个关联表的数据,我们可以使用where语句进行查询,如: select Emp.E_Id,Company.C_OraName from Emp,Company where Companey.C_Id=Emp.C_Id 但是我们往往会碰到比较复杂的语句,这时候使用where就不太合适了,其实SQL可以用较为直接的形式进行连接操作,可以在From子句中以直接的形式指出: select top 10 E_Id,E_Name,C_Name from Emp join

MySql中的存储过程和触发器的使用和区别

存储过程:是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象 优点:1允许模块化程序设计(创建一次多次使用)2允许更快执行3减少网络流量4更好的安全机制 格式: DELIMITER // CREATE PROCEDURE 储存名([ IN ,OUT ,INOUT ]?参数名?数据类形...) BEGIN SQL语句 END //

MySQL中如何查看“慢查询”,如何分析执行SQL的效率?

一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短. 3,slow_query_log_file记录日志的文件名. 4,log_queries_not_using_indexes这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快. 二

MySQL中常用操作--子查询

子查询就是SELECT 查询是另一个SELECT的附属,  此时, MySQL从最内层的查询开始, 再向外向上查询, 接着最外层的父查询被执行, 它的结果也指定给父查询. 带IN的子查询:只有子查询返回的结果列中包含一个值时, 比较运算符才适用. 假如一个子查询的返回结果集是值的列表, 这时比较运算符就必须用关键字IN代替IN运算符可以检测结果集中是否存在某个特定的值, 如果检测成功就执行外部的查询. mysql> select * from stu -> ; +----+----------