异常处理postgresql

Exception handling postgresql

各位程序员大家好,

我有一个关于异常处理的问题。 我创建了一个函数,用于将值插入到 table 中,其中包含电子邮件和用户名列,电子邮件的最大字符长度为 16,密码的最大字符长度为 32。

现在我想在插入的电子邮件超过 16 个字符时发出类似 'Password too long,16 Chars max' 的错误消息。

我已经用 'Name_too_long' 错误代码试过了。

我怎么能在 Postgres 10.5 中排除异常呢? 提前致谢。

编辑:半功能代码

    CREATE OR REPLACE FUNCTION users_insert(_email character varying,_passwort character varying) RETURNS void 
    AS $BODY$
     BEGIN 
     INSERT INTO users(email,passwort,lastlogin)
     VALUES(_email,_passwort,CURRENT_TIMESTAMP);
     EXCEPTION 
     WHEN string_data_right_truncation 
     THEN RAISE NOTICE 'ERROR: INSERT TOO LONG';
     END;
    $BODY$
    LANGUAGE plpgsql ;

编辑:工作代码,每个错误都有 2 条不同的错误消息:

CREATE OR REPLACE FUNCTION public.users_insert(
    _email character varying,
    _passwort character varying)
    RETURNS void
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
AS $BODY$

 BEGIN 
 IF LENGTH(_passwort) > 16
  THEN RAISE EXCEPTION USING errcode = 50001;
END IF;

 IF LENGTH(_email) > 32
  THEN RAISE EXCEPTION USING errcode = 22001;
  END IF;


 INSERT INTO users(email,passwort,lastlogin)
 VALUES(_email,_passwort,CURRENT_TIMESTAMP);

EXCEPTION 
 WHEN SQLSTATE '50001' THEN  
   RAISE NOTICE 'Password too long, 16 Chars max';

WHEN SQLSTATE '22001' THEN  
   RAISE NOTICE 'Email too long, 32 Chars max';


 END; 

$BODY$;

ALTER FUNCTION public.users_insert(character varying, character varying)
    OWNER TO postgres; 

使用 IF 条件检查特定列的长度和 raise/handle 相关异常。

CREATE OR REPLACE FUNCTION users_insert(_email character varying,
                                        _passwort character varying ) 
RETURNS void 
 AS $BODY$
  BEGIN 

  IF LENGTH(_passwort) > 16
    THEN RAISE EXCEPTION  USING errcode = 50001;
  END IF;

  INSERT INTO users(email,passwort,lastlogin)
    VALUES(_email,_passwort,CURRENT_TIMESTAMP);

  EXCEPTION 
   WHEN SQLSTATE '50001' THEN
       RAISE NOTICE  'Password too long,16 Chars max';
   WHEN OTHERS THEN
    raise notice '% %', SQLERRM, SQLSTATE;
 END;
$BODY$
LANGUAGE plpgsql ;

测试

knayak$# PERFORM users_insert('username2251621819101010@mail.com','password123passwod');
knayak$#
knayak$# END $$;
NOTICE:  Password too long,16 Chars max
DO
knayak=# DO $$
knayak$# BEGIN
knayak$#
knayak$# PERFORM users_insert('username2251621819101010@mail.com','password');
knayak$#
knayak$# END $$;
NOTICE:  value too long for type character varying(30) 22001
DO