Как узнать если селект в процедуре нашел запись или нет ?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Jder
Сообщения: 3
Зарегистрирован: 02 окт 2005, 12:00

Как узнать если селект в процедуре нашел запись или нет ?

Сообщение Jder » 02 окт 2005, 18:13

например


CREATE PROCEDURE LOGIN (
I_LOGIN VARCHAR(25),
I_PASSWORD VARCHAR(255))
RETURNS (
RESULT INTEGER,
O_ERR VARCHAR(255))
AS
DECLARE VARIABLE V_PSWD VARCHAR(255);
BEGIN
result = 0;
SELECT password FROM users
WHERE login = :i_login
INTO v_pswd;

IF (i_password = v_pswd) THEN
result = 1;
ELSE
BEGIN
o_err = 'Invalid password.';
END
END


если селект не нашел запись то я хочу возаратьть ошибку что нету такого узера.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 03 окт 2005, 08:51

IF (v_pswd is null) THEN
EXCEPTION NO_USER;

Владимир Каратаев
Сообщения: 22
Зарегистрирован: 01 ноя 2004, 11:11

Сообщение Владимир Каратаев » 03 окт 2005, 15:37

Dimitry Sibiryakov писал(а):IF (v_pswd is null) THEN
EXCEPTION NO_USER;
+перед select вставить строчку v_pswd=null;

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 03 окт 2005, 17:23

если у него FB, то в данном конкретном случае это необязательно

Jder
Сообщения: 3
Зарегистрирован: 02 окт 2005, 12:00

Сообщение Jder » 03 окт 2005, 22:46

Код: Выделить всё

CREATE PROCEDURE LOGIN ( 
  I_LOGIN VARCHAR(25), 
  I_PASSWORD VARCHAR(255)) 
  RETURNS ( 
  RESULT INTEGER, 
  O_ERR VARCHAR(255)) 
AS 
  DECLARE VARIABLE V_PSWD VARCHAR(255); 
BEGIN 
  result = 0; 
  SELECT password FROM users 
  WHERE login = :i_login 
  INTO v_pswd; 
 
  IF (v_pswd IS NULL) THEN
    o_err = 'Invalid user name';
  ELSE
  IF (i_password = v_pswd) THEN
    result = 1;
  ELSE
    o_err = 'Invalid password.';
  SUSPEND;
END 
однако не исключено что поле password действительно равно NULL и тогда процедура работает не совсем корректно.
То есть, чтобы сделать это корректно нужно еще сделать запрос на предмет существования такой записи...

В оракле это просто:
BEGIN
SELECT ...
EXCEPTION
WHEN no_data_found THEN
...
END;

Думал, что в Firebird можно сделать что-то аналогичное.[/code]

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 окт 2005, 10:10

не надо мутить. достаточно перед select в нужную переменную прописать значение, которого не может быть в таблице. Соответственно, если значение осталось - записей не было, если null - запись с null, и если иное значение - запись со значением.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 04 окт 2005, 11:33

Jder писал(а):однако не исключено что поле password действительно равно NULL и тогда процедура работает не совсем корректно.
То есть, чтобы сделать это корректно нужно еще сделать запрос на предмет существования такой записи...

В оракле это просто:
BEGIN
SELECT ...
EXCEPTION
WHEN no_data_found THEN
...
END;

Думал, что в Firebird можно сделать что-то аналогичное
В FB можно сделать лучше

Код: Выделить всё

BEGIN
  FOR SELECT ... FROM ... INTO ...
  DO BEGIN
    ...
    EXIT;
  END

  EXCEPTION ...
END

Jder
Сообщения: 3
Зарегистрирован: 02 окт 2005, 12:00

Сообщение Jder » 04 окт 2005, 12:51

>>kdv
>>hvlad

Спасибо! теперь все ясно.

Ответить