判断email 输入是否合法

PROCEDURE check_client_email(p_check_char IN VARCHAR2,
                               p_sign       OUT VARCHAR2,
                               p_message    OUT VARCHAR2) IS
    v_email      VARCHAR2(1000);
    v_singlechar VARCHAR2(3);


    v_err_code VARCHAR2(10);
    v_prompt   VARCHAR2(1000);
  BEGIN
    p_sign := 'N';


    --不区分大小写,全部换成小写
    v_email := LOWER(p_check_char);
    v_email := NVL(v_email, '*');


    --IF LENGTH(v_email) >= 6 THEN
    --检查邮件地址中是否有“@”和“.”两个关键字符
    IF INSTR(v_email, '@') = 0 OR INSTR(v_email, '.') = 0 THEN
      p_sign    := 'N';
      p_message := '录入的EMAIL不规范,EMAIL未含有“@”和“.”两个关键字符';
      RETURN;
    END IF;


    --检查:
    --1、是否出现了多个“@”符号
    --2、检查“@”符号是否在开头和结尾
    --3、“.”符号在“@”符号之前的部分及“@”符号之后的部分,均不能作为开始或结尾符
    --4、“@”符号后的部分,点号至少出现一次,且不能连续出现
    IF INSTR(v_email, '@', INSTR(v_email, '@') + 1) <> 0 OR
       INSTR(v_email, '@') = 1 OR INSTR(v_email, '@') = LENGTH(v_email) OR
       INSTR((SUBSTR(v_email, 1, INSTR(v_email, '@') - 1)), '.') = 1 OR
       INSTR(SUBSTR(v_email, 1, INSTR(v_email, '@') - 1), '.', -1) =
       LENGTH(SUBSTR(v_email, 1, INSTR(v_email, '@') - 1)) OR
       INSTR((SUBSTR(v_email, INSTR(v_email, '@') + 1)), '.') = 1 OR
       INSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1), '.', -1) =
       LENGTH((SUBSTR(v_email, INSTR(v_email, '@') + 1))) OR
       INSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1), '.') = 0 OR
       INSTR((SUBSTR(v_email, INSTR(v_email, '@') + 1)), '..') > 0 THEN
      p_sign    := 'N';
      p_message := '录入的EMAIL不规范';
      RETURN;
    END IF;


    --A段只能由字母、数字、下划线、中划线和点号组成
    FOR i IN 1 .. LENGTH(SUBSTR(v_email, 1, INSTR(v_email, '@') - 1)) LOOP
      v_singlechar := SUBSTR((SUBSTR(v_email, 1, INSTR(v_email, '@') - 1)),
                             i,
                             1);


      IF v_singlechar NOT IN ('_',
                              '-',
                              '.',
                              '0',
                              '1',
                              '2',
                              '3',
                              '4',
                              '5',
                              '6',
                              '7',
                              '8',
                              '9',
                              'a',
                              'b',
                              'c',
                              'd',
                              'e',
                              'f',
                              'g',
                              'h',
                              'i',
                              'j',
                              'k',
                              'l',
                              'm',
                              'n',
                              'o',
                              'p',
                              'q',
                              'r',
                              's',
                              't',
                              'u',
                              'v',
                              'w',
                              'x',
                              'y',
                              'z') THEN
        p_sign    := 'N';
        p_message := '录入的EMAIL不规范';
        RETURN;
      END IF;
    END LOOP;


    --B、C段开头只能为字母或数字
    IF SUBSTR(SUBSTR(v_email,
                     INSTR(v_email, '@') + 1,
                     INSTR(v_email, '.') - 1 - INSTR(v_email, '@')),
              1,
              1) NOT IN ('0',
                         '1',
                         '2',
                         '3',
                         '4',
                         '5',
                         '6',
                         '7',
                         '8',
                         '9',
                         'a',
                         'b',
                         'c',
                         'd',
                         'e',
                         'f',
                         'g',
                         'h',
                         'i',
                         'j',
                         'k',
                         'l',
                         'm',
                         'n',
                         'o',
                         'p',
                         'q',
                         'r',
                         's',
                         't',
                         'u',
                         'v',
                         'w',
                         'x',
                         'y',
                         'z') OR
       SUBSTR(SUBSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1),
                     INSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1), '.') + 1),
              1,
              1) NOT IN ('0',
                         '1',
                         '2',
                         '3',
                         '4',
                         '5',
                         '6',
                         '7',
                         '8',
                         '9',
                         'a',
                         'b',
                         'c',
                         'd',
                         'e',
                         'f',
                         'g',
                         'h',
                         'i',
                         'j',
                         'k',
                         'l',
                         'm',
                         'n',
                         'o',
                         'p',
                         'q',
                         'r',
                         's',
                         't',
                         'u',
                         'v',
                         'w',
                         'x',
                         'y',
                         'z') THEN
      p_sign    := 'N';
      p_message := '录入的EMAIL不规范';
      RETURN;
    END IF;


    --B段只能由字母、数字、下划线、中划线和点号组成
    IF LENGTH(SUBSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1),
                     1,
                     INSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1), '.') - 1)) > 1 THEN
      FOR i IN 2 .. LENGTH(SUBSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1),
                                  1,
                                  INSTR(SUBSTR(v_email,
                                               INSTR(v_email, '@') + 1),
                                        '.') - 1)) LOOP
        v_singlechar := SUBSTR(SUBSTR(SUBSTR(v_email,
                                             INSTR(v_email, '@') + 1),
                                      1,
                                      INSTR(SUBSTR(v_email,
                                                   INSTR(v_email, '@') + 1),
                                            '.') - 1),
                               i,
                               1);


        IF v_singlechar NOT IN ('_',
                                '-',
                                '.',
                                '0',
                                '1',
                                '2',
                                '3',
                                '4',
                                '5',
                                '6',
                                '7',
                                '8',
                                '9',
                                'a',
                                'b',
                                'c',
                                'd',
                                'e',
                                'f',
                                'g',
                                'h',
                                'i',
                                'j',
                                'k',
                                'l',
                                'm',
                                'n',
                                'o',
                                'p',
                                'q',
                                'r',
                                's',
                                't',
                                'u',
                                'v',
                                'w',
                                'x',
                                'y',
                                'z') THEN
          p_sign    := 'N';
          p_message := '录入的EMAIL不规范';
          RETURN;
        END IF;
      END LOOP;
    END IF;


    --C段只能由字母、数字、下划线、中划线和点号组成
    IF LENGTH(SUBSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1),
                     INSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1), '.') + 1)) > 1 THEN
      FOR i IN 2 .. LENGTH(SUBSTR(SUBSTR(v_email, INSTR(v_email, '@') + 1),
                                  INSTR(SUBSTR(v_email,
                                               INSTR(v_email, '@') + 1),
                                        '.') + 1)) LOOP
        v_singlechar := SUBSTR(SUBSTR(SUBSTR(v_email,
                                             INSTR(v_email, '@') + 1),
                                      INSTR(SUBSTR(v_email,
                                                   INSTR(v_email, '@') + 1),
                                            '.') + 1),
                               i,
                               1);


        IF v_singlechar NOT IN ('_',
                                '-',
                                '.',
                                '0',
                                '1',
                                '2',
                                '3',
                                '4',
                                '5',
                                '6',
                                '7',
                                '8',
                                '9',
                                'a',
                                'b',
                                'c',
                                'd',
                                'e',
                                'f',
                                'g',
                                'h',
                                'i',
                                'j',
                                'k',
                                'l',
                                'm',
                                'n',
                                'o',
                                'p',
                                'q',
                                'r',
                                's',
                                't',
                                'u',
                                'v',
                                'w',
                                'x',
                                'y',
                                'z') THEN
          p_sign    := 'N';
          p_message := '录入的EMAIL不规范';
          RETURN;
        END IF;
      END LOOP;
    END IF;


    p_sign    := 'Y';
    p_message := '校验成功';
  EXCEPTION
    WHEN OTHERS THEN
      p_sign    := 'E';
      p_message := SUBSTRB('校验EMAIL信息' || p_check_char || '时异常:' || SQLERRM,
                           1,
                           300);
      -- Logging the error
      v_err_code := NULL;
      pub_error_handle.exception_no_raise('l_pub_public_biz.check_client_email',
                                          v_err_code,
                                          p_message,
                                          v_prompt);
  END check_client_email;

你可能感兴趣的:(优秀代码)