Процедуры с использованием if..then..else...

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

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

Ответить
STEEL
Сообщения: 16
Зарегистрирован: 08 сен 2005, 00:34

Процедуры с использованием if..then..else...

Сообщение STEEL » 05 ноя 2005, 12:03

Вообщем процедура с входяшей переменной типа VARCHAR, исходящей integer. Если входящее значение найдено в таблице, вернуть 0, если не найдено - 1.
Приведите примерчик.

Vit
Сообщения: 19
Зарегистрирован: 05 ноя 2005, 03:22

Re: Процедуры с использованием if..then..else...

Сообщение Vit » 05 ноя 2005, 14:26

STEEL писал(а):Вообщем процедура с входяшей переменной типа VARCHAR, исходящей integer. Если входящее значение найдено в таблице, вернуть 0, если не найдено - 1.
Приведите примерчик.


CREATE PROCEDURE PROCEDURE1 (
INPUT_VALUE VARCHAR(XX)
RETURNS ( RESULT INTEGER)
AS
BEGIN
SELECT COUNT(*) FROM TABLE1
WHERE COLUMN1=:INPUT_VALUE
INTO :RESULT;

if (:RESULT = 0) then RESULT = -1
else RESULT = 0;

SUSPEND
END;

Это будет работать на любом сервере. Если используется Firebird 1.5 и выше или Yahill то можно использовать Select без агрегата (быстрее работает), и проверять ROW_COUNT
Последний раз редактировалось Vit 05 ноя 2005, 20:49, всего редактировалось 1 раз.

STEEL
Сообщения: 16
Зарегистрирован: 08 сен 2005, 00:34

Сообщение STEEL » 05 ноя 2005, 14:46

А гды ты INPUT_VALUE сравниваешь с тем, что есть в таблице?

Vit
Сообщения: 19
Зарегистрирован: 05 ноя 2005, 03:22

Сообщение Vit » 05 ноя 2005, 20:47

STEEL писал(а):А гды ты INPUT_VALUE сравниваешь с тем, что есть в таблице?
Очень сорри. Правильно будет так

CREATE PROCEDURE PROCEDURE1 (
INPUT_VALUE VARCHAR(XX)
RETURNS ( RESULT INTEGER)
AS
BEGIN

SELECT COUNT(*) FROM TABLE1
WHERE COLUMN1=:INPUT_VALUE
INTO :RESULT;

if (:RESULT = 0) then RESULT = -1
else RESULT = 0;

SUSPEND
END;

STEEL
Сообщения: 16
Зарегистрирован: 08 сен 2005, 00:34

Сообщение STEEL » 06 ноя 2005, 00:13

Выше приведенный код тоже нехрена бы не заработал. Дело в том, что даже если там не хватает какой-то точки с запятой, работать уже ничего не будет. Благо догадался :D
Законченный вариант.

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

СREATE PROCEDURE PROC (
    BARCODE VARCHAR(15))
RETURNS (
    RESULT INTEGER)
AS
begin

SELECT COUNT(*) FROM BARCODES
WHERE ARRAY=:BARCODE
INTO :RESULT;

IF (:RESULT = 0) THEN RESULT = -1;
ELSE RESULT = 0;

  suspend;

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 07 ноя 2005, 08:03

"exists" вместо "count" пользовать не пробовали? Он несколько побыстрей работает :wink:

Ответить