Страница 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
Спасибо! теперь все ясно.