2015-05-28 1 views
0

Я следующий хранится процедура. Параметр FLAG_, пройденный, разрешен принимать только null, 0 или 1. Но проверка состояния (FLAG_! = 0 ИЛИ FLAG_! = 1) не работает. Я предполагаю, что это потому, что тип для FLAG_ равен NUMBER, который включает float. Есть ли способ сравнить NUMBER с INT?Oracle Хранимая процедура - как сравнить тип NUMBER с intergers?

create or replace PROCEDURE "ADD_RMV_FLAG" 
(
    TEXT OUT VARCHAR2 
, FLAG_ IN NUMBER -- empty, 0 and 1 only values accepted. 
) AS 

BEGIN 
-- input pramameters checking 
IF FLAG_ is not null 
THEN 
    IF (FLAG_ is not null AND (FLAG_ != 0 OR FLAG_ != 1)) 
    THEN 
    raise_application_error(-20001, 'ERROR: only empty, 0 or 1 is accepted 
    for FLAG. Passed in ' || FLAG_); 
    END IF; 
END IF; 
END ADD_RMV_FLAE 
+2

'не work'? Я поставил свои деньги на 'OR' вместо' AND' ... – Sebas

+2

То, что вы делаете, должно работать нормально. Тем не менее, я не считаю, что ваш код будет компилироваться, потому что в последней строке у вас есть 'END ADD_RMV_FLAE', когда имя подпрограммы -' ADD_RMV_FLAG', и имена должны совпадать. 'AND' @Sebas прав - используйте' AND' вместо 'OR'. –

+0

@Sebas Спасибо за ваш ответ. И правильно. – user2482822

ответ

1

Это выражение:

IF (FLAG_ is not null AND (FLAG_ != 0 OR FLAG_ != 1)) 

всегда будет вычисляться в TRUE. Если флаг равен 0, вы получаете «false ИЛИ true». Если флаг равен 3.1415926535. , , , тогда вы получите «истинное или истинное».

Вы хотите AND или еще лучше: NOT IN:

IF (FLAG_ is not null AND FLAG_ NOT IN (0, 1)) 
+0

Спасибо за ваш ответ. Это изящное решение. Первоначально я пытался с IF (FLAG NOT IN (null, 0, 1)). – user2482822

Смежные вопросы