Страница 1 из 1

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

Добавлено: 02 окт 2005, 18:13
Jder
например


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


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

Добавлено: 03 окт 2005, 08:51
Dimitry Sibiryakov
IF (v_pswd is null) THEN
EXCEPTION NO_USER;

Добавлено: 03 окт 2005, 15:37
Владимир Каратаев
Dimitry Sibiryakov писал(а):IF (v_pswd is null) THEN
EXCEPTION NO_USER;
+перед select вставить строчку v_pswd=null;

Добавлено: 03 окт 2005, 17:23
dimitr
если у него FB, то в данном конкретном случае это необязательно

Добавлено: 03 окт 2005, 22:46
Jder

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

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]

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

Добавлено: 04 окт 2005, 11:33
hvlad
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

Добавлено: 04 окт 2005, 12:51
Jder
>>kdv
>>hvlad

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