2010-02-05 2 views
1

현재 두 개의 상당히 긴 select 문이 있습니다. 첫 번째 문맥은 count (*)를 통해 행이 있는지를보고 두 번째 문은 행 형식 변수에 행을 선택합니다. if 문에서. 이것은 데이터가 추가 조작을 위해 필요하기 때문입니다.Amalgamate 2 select statements into 1

저는 알고 있습니다.하지만 brainfreeze를 완료하고 google이 select에 대한 많은 정보를 반환하고 if/else하지만 select를 기반으로하지 않습니다.

if 문에서 select를 래핑하여 시도 했으므로 시도 할 다른 것이 궁금합니다.

업데이트 : 사이비 - 예 :

또한
select count(*) into num_items where <very long operation>; 
if (num_items = 1) then 
    begin 
    select * into row_item where <very long operation>; 
    end; 
else 
    dbms_output.put_line('failure'); 
end if; 

: 약간 관련이없는 노트에, 어떻게 당신이 스크립트까지 현재 위치를 볼 수 있도록 DBMS_OUTPUT이 immeadiately 플러시받을 수 있나요? 현재 스크립트가 끝나면 인쇄됩니다.

감사합니다.

답변

4

나는 당신이 원하는 코드이 생각 : 또는 SQL 플러스 또는 IDE에서 실행할 SQL 스크립트를위한 코드를 개발하는 동안

begin 
    select * into row_item where <very long operation>; 
exception 
    when too_many_rows then 
    dbms_output.put_line('failure'); 
end; 

DBMS_OUTPUT는 정말 디버깅을 위해 좋은입니다. 자치 트랜잭션을 사용하여 테이블에 메시지를 쓸 수 있습니다. 그런 다음 프로그램이 실행 중일 때 다른 세션에서이를 읽을 수 있습니다. 자세한 내용은 this question을 참조하십시오.

+2

+1하지만 그는 "no_data_found"도 원할 것입니다. – erikkallen

1

내가 원하는 것 같아 SELECT CASE.

자세한 도움말이 필요한 경우 현재 코드를 게시하십시오.

+0

case 문이 select 내부에 있기 때문에 작동하지 않습니다. 선택에 의해 데이터가 rowdata 유형으로 반환되었는지 확인해야합니다. –

+0

추가 정보. –

+0

내가 불공정 한 것처럼 보였고 당신이 무엇을보고 있는지 이해하지 못했습니다. 이제 나는 더 많은 것을 읽었을 가능성이 있습니다. –

1

나는이 같은 생각 하는데요 :

DECLARE 
    CURSOR c IS 
    SELECT COUNT(*) OVER() count_rows, 
    q.* FROM (<very long operation>) q 
    WHERE ROWNUM <= 2; 
    r c%ROWTYPE; 
BEGIN 
    OPEN c; 
    FETCH c INTO r; 
    IF c%NOTFOUND OR r.count_rows != 1 THEN 
    dbms_output.put_line('failure'); 
    ELSE 
    --process the row 
    END IF; 
END; 

이는 "매우 긴 작업"에서 최대 2 개 기록을 계산됩니다; 첫 번째 행만 가져옵니다. r.count_rows는 단 하나의 행이 발견되면 1이되고, 두 개 이상의 행이 발견되면 2가됩니다. 이 방법을 사용하면 긴 작업을 두 번 실행하는 이중 whammy를 피할 수 있습니다.