异常处理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
各位程序员大家好,
我有一个关于异常处理的问题。 我创建了一个函数,用于将值插入到 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