2013-05-04 1 views
-1

커서 'c2'에 'note'라는 숫자가 포함 된 커서가 있습니다. 열이 5인지 확인하고 내 로컬 변수를 변경했는지 확인하고 싶습니다.오라클 : IF 블록 내의 IN 함수

이 :

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; 
/

5가있는 행이 있다면 'contains 5' 문자열이 표시됩니다. 그렇지 않으면 null이 표시됩니다. max()은 테이블에 0 개 또는 일치하는 레코드가 하나 이상있는 경우 예외가 throw되는 것을 중지합니다.

+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

* cursor *'c2'에서 똑바로 들어 가지 않으면 루프 된 각 반환 값을 확인해야합니다 ...? –

+0

매우 분명합니다. 당연하지. 나는 하나 더 편집 할 것이다. – hol

3

코드에서 커서를 선언하고 있지만 결코 커서를 열지 않고 데이터를 가져 오지 않습니다. 커서가 반환 한 행을 반복하는 데 일종의 루프가 필요할 것입니다. 명시 적 또는 암시 적으로 각 특정 행을 가져 오는 레코드를 선언해야합니다. 그 한 가지 옵션은 또한 당신의 IF 문에 해당하는 END IF이 있어야

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; 
/

주 같은 것입니다. c2 커서의 이름을 지정하는 것은 일반적으로 나쁜 생각입니다. 변수가 실제로 의미있는 이름으로 지정되어야합니다.