2012-02-15 2 views
1

PLSQL에서 다음과 같은 작업을 수행 할 수 있습니까?PLSQL의 조건문에서 쿼리를 사용합니까?

if (some_query) then 
    dbms_output.put_line('Your query returned at least 1 row.'); 
else 
    dbms_output.put_line('Your query returned no rows.'); 
end if; 

내 경우에는 데이터베이스에 값이 이미 있는지 확인하고 싶습니다. 값이 이미 존재한다면 값이 전혀 존재하지 않는 경우와 다른 결과를 보일 것입니다. 사용 사례는 쿼리가 하나의 행 또는 수천을 반환하는지 여부 동일하게 작동하기 때문에

답변

4

당신이 기록의 존재 여부를 확인하는 경우에, 당신은에서 COUNT (*)를 선택할 수 있습니다 항상 값을 반환하므로 키를 기반으로 소스 테이블 당신은 확인할 수 있습니다

SQL> set serverout on 
SQL> DECLARE 
    2  v_check NUMBER; 
    3 BEGIN 
    4  SELECT COUNT(*) 
    5  INTO v_check 
    6  FROM DUAL 
    7  WHERE DUMMY = 'X' 
    8  AND ROWNUM = 1; 
    9 
10  if (v_check = 0) then 
11   dbms_output.put_line('Your query returned no rows.'); 
12  else 
13   dbms_output.put_line('Your query returned at least 1 row.'); 
14  end if; 
15 END; 
16/
Your query returned at least 1 row. 

PL/SQL procedure successfully completed. 

SQL> 
+0

rownum = 1에 대해 설명해 주시겠습니까? 그렇지 않으면 수백만 행을 계산할 수있는 쿼리의 속도가 향상됩니까? 또는 1 또는 0 인 부울 값을 가져 오는 좋은 방법일까요? – Buttons840

+0

@ Buttons840 수정하십시오. 키가 아닌 필드가 있는지 검색하는 경우 where 절을 만족하는 첫 x 째 레코드가 _ 견되면 조회를 잘라 내십시오. 코드 논리가 0 인 경우를 확인하므로 실제 카운트는 사용되지 않습니다. – tawman

+0

@ Buttons840 정확히! 내 대답은 왼쪽에서 오른쪽으로 평가됩니다. OR의 첫 부분이 올바른 것입니다.) – tawman

1

, EXISTS 사용

DECLARE 
    l_dummy  VARCHAR2(1); 
BEGIN 
    SELECT NULL 
    INTO l_dummy 
    FROM DUAL 
    WHERE EXISTS (SELECT NULL 
        FROM <some_query>); 
    DBMS_OUTPUT.PUT_LINE('Your query returned at least one row.'); 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     DBMS_OUTPUT.PUT_LINE('Your query returned no rows.'); 
END; 
3

당신은

BEGIN 
    SELECT 1 
    INTO l_foo 
    FROM dual 
    WHERE EXISTS (<<some query>>); 

    dbms_output.put_line('Your query returned at least 1 row'); 
EXCEPTION 
    WHEN no_data_found 
    THEN 
    dbms_output.put_line('Your query returned 0 rows'); 
END; 
뭔가를해야 할 것 쿼리가 너무 비싸없는 경우 6,

, 그것은 거의 효율적이고 당신이 아니,

SELECT COUNT(*) 
    INTO l_foo 
    FROM (<<some query>>) 
WHERE rownum = 1; 

IF(l_foo = 1) 
THEN 
    dbms_output.put_line('Your query returned at least row.'); 
ELSE 
    dbms_output.put_line('Your query returned 0 rows.'); 
END IF; 
2

정확히 같은 간단한 일을 할 경우 유지 관리가 아마 조금 더 쉬울 것이다. 그러나 당신이 그것을 가짜로 만들 수있는 몇 가지 방법이 있습니다 :

당신이 가치가 있는지 여부를 확인하는 암시 적 커서 안에서 한 가지만하면됩니다.

for i in (some_query) loop 

    do_something; 

end loop; 

당신은 여기에 값을 설정하고 if

for i in (some_query) loop 

    result := True; 

end loop; 

if result then 
    do_something; 
else 
    do_something_else; 
end if; 

에서 사용 또는 명시 적 커서를 사용하여 제기 될거야 no_data_found 오류를 잡을 수 있습니다

declare 

    cursor c_blah is 
    select my_value 
    from my_table 
    where id = my_id 
      ; 

    my_value varchar2(4000); 

begin 

    open c_blah(my_id); 
    fetch c_blah into my_value; 
    close c_blah; 

    do_something; 

    exception when no_data_found then 
    do_something_else; 

end; 
관련 문제