2013-05-04 6 views
-1

У меня есть указатель c2 с одной записью столбца, содержащей числа. Я хочу проверить, содержит ли столбец 5 и меняет локальную переменную, если да.Oracle: функция IN внутри блока IF

это:

CREATE OR REPLACE PROCEDURE proc 

IS 
result varchar(50); 

cursor c2 is 
SELECT note 
FROM student;  

BEGIN 

IF c2.note IN(5) THEN 
result := 'contains 5'; 

DBMS_OUTPUT.PUT_LINE(result); 

END; 
/

не работает.

, пожалуйста, помогите!

+1

Определить, что «не работает». Вам, конечно, разрешено использовать предложение 'IN' внутри оператора' IF', поэтому здесь должно быть что-то еще. –

+0

Является ли 'c2' именем курсора или переменной записи, в которую он был загружен? –

+0

@AlexPoole c2 - это имя курсора, я не выбрал его – IAM

ответ

2

Вы слишком зацикливаете на записи/строки, возвращенные в курсоре; Вы не можете обратиться к самому курсору так:

CREATE OR REPLACE PROCEDURE proc 
IS 
    result varchar(50); 

    cursor c2 is 
     SELECT note 
     FROM student;  
BEGIN 
    FOR r2 IN c2 LOOP 
     IF r2.note = 5 THEN -- IN would also work but doesn't add anything 
      result := 'contains 5'; 
     END IF; 
    END LOOP; 

    DBMS_OUTPUT.PUT_LINE(result); 
END; 
/

Но если вы только тестирование на наличие какой-либо записи со значением 5, то вам не нужен курсор:

CREATE OR REPLACE PROCEDURE proc 
IS 
    result varchar(50); 
BEGIN 
    SELECT max('contains 5') 
    INTO result 
    FROM student 
    WHERE note = 5; 

    DBMS_OUTPUT.PUT_LINE(result); 
END; 
/

Если есть строки с пятью, вы получите строку 'contains 5'; если нет, вы получите null. max() останавливает генерируемое исключение, если в таблице есть либо ноль, либо несколько совпадающих записей.

+1

'c2.note' должно быть' r2.note' – hol

+0

@hol - да, я пойду и хорошо поговорю. Благодарю. –

+0

Нет проблем. Ваше второе решение довольно интересно. Никогда не думал об использовании 'MAX' для чего-то подобного. – hol

2

Вам не хватает END IF и необходимо установить LOOP над курсором. Название процедуры включено в окончательный END.

Но использование IN должно работать. Например:

CREATE OR REPLACE PROCEDURE proc  
IS 
    result varchar(50); 

    cursor c2 is 
    SELECT note 
    FROM student;  

BEGIN 
    FOR rec in c2 
    LOOP 
    IF rec.note IN (5) THEN 
     result := 'contains 5'; 
    END IF; 
    END LOOP; 

    DBMS_OUTPUT.PUT_LINE(result); 

END proc; 
/
+0

Не прямо из * курсора * 'c2', ему нужно будет зацикливать и проверить каждое возвращаемое значение ...? –

+0

Очень очевидно. Конечно. Я сделаю еще одно редактирование. – hol

3

В вашем коде вы объявляете курсор, но вы никогда его не открываете и никогда не извлекаете из него данные. Вам понадобится, по-видимому, какой-то цикл для повторения строк, возвращаемых курсором. Вам нужно будет явно или неявно объявить запись, в которую извлекается каждая конкретная строка. Один из вариантов, чтобы сделать это что-то вроде

CREATE OR REPLACE PROCEDURE proc 
IS 
    result varchar(50); 

    cursor c2 is 
    SELECT note 
     FROM student;  
BEGIN 
    FOR rec IN c2 
    LOOP 
    IF rec.note IN(5) THEN 
     result := 'contains 5'; 
     DBMS_OUTPUT.PUT_LINE(result); 
    END IF; 

    END LOOP; 
END; 
/

Обратите внимание, что вы также должны иметь END IF, соответствующий вашему IF заявление. Именование курсора c2 также, как правило, плохая идея - ваши переменные действительно должны быть названы осмысленно.

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