Обработка исключений postgresql - PullRequest
0 голосов
/ 19 ноября 2018

Здравствуйте, коллеги-программисты,

У меня есть вопрос, касающийся обработки исключений.Я создал функцию для вставки значений в таблицу со столбцами электронной почты и именем пользователя с максимальной длиной символов 16 для электронного письма и 32 для пароля.

Теперь я хочу выдать сообщение об ошибке вроде 'Пароль слишком длинный, максимум 16 символов, всякий раз, когда длина введенного электронного письма превышает 16 символов.

Я пробовал его уже с кодом ошибки «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; 

1 Ответ

0 голосов
/ 19 ноября 2018

Используйте условие IF для проверки длины определенных столбцов и повышения / обработки соответствующих исключений.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...