Как узнать если селект в процедуре нашел запись или нет ?
Как узнать если селект в процедуре нашел запись или нет ?
например
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
если селект не нашел запись то я хочу возаратьть ошибку что нету такого узера.
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
если селект не нашел запись то я хочу возаратьть ошибку что нету такого узера.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
-
- Сообщения: 22
- Зарегистрирован: 01 ноя 2004, 11:11
Код: Выделить всё
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
То есть, чтобы сделать это корректно нужно еще сделать запрос на предмет существования такой записи...
В оракле это просто:
BEGIN
SELECT ...
EXCEPTION
WHEN no_data_found THEN
...
END;
Думал, что в Firebird можно сделать что-то аналогичное.[/code]
В FB можно сделать лучшеJder писал(а):однако не исключено что поле password действительно равно NULL и тогда процедура работает не совсем корректно.
То есть, чтобы сделать это корректно нужно еще сделать запрос на предмет существования такой записи...
В оракле это просто:
BEGIN
SELECT ...
EXCEPTION
WHEN no_data_found THEN
...
END;
Думал, что в Firebird можно сделать что-то аналогичное
Код: Выделить всё
BEGIN
FOR SELECT ... FROM ... INTO ...
DO BEGIN
...
EXIT;
END
EXCEPTION ...
END