2014-11-18 2 views
1

일부 데이터가 저장 프로 시저로 검색됩니다. 이 저장 프로 시저에 정의 된 SQL 쿼리의 내용이있는 커서를 반환합니다. 이 형식의커서의 행 수를 빠르게 계산하는 방법

뭔가 :

function search_foo(param1 varchar2, param1 varchar3) 
    return g_ref -- a ref cursor 
    is 
    l_return g_ref; 
{ 
    open l_return for 
    select col1_i_need, col2_i_need 
    from foo 
    join bar on --[...] 
    where [...]; 

    return l_return; 
} 

그러나 반환 된 데이터 세트가 큰 경우, 내가 (너무 많은 열 경우 검색하는 중지) 모든 데이터 세트 가져 오는 전에 행의 수를 계산합니다.

그래서를 할 수있는 쉬운 방법은

function search_foo(param1 varchar2, param1 varchar3) 
    return number 
    is 
    l_return number; 
{ 

    select count(*) into l_return 
    from foo 
    join bar on --[...] 
    where [...]; 

    return l_return; 
} 

같은 다른 함수를 정의 할 수 그러나 그것은 잘못된 것 같다 : 코드 redondancy 및 업데이트를해야 할 때 그래서 방법 중 하나를 forgotting의 위험을 증가 만들어지다.

내 질문은 : 그것은 다른 저장 프로 시저에 의해 반환 된 행 수를 반환하는 저장 프로 시저를 만들 수 있습니까?

어떻게 행을 계산할 수 있는지에 대한 내 쿼리의 SQL 코드를 리팩토링 할 수 있습니까? 가장 쉬운 방법은 두 개의 별도 SQL 쿼리를 작성하는 것입니다. 하나는 계산을위한 것이고 다른 하나는 데이터를 가져 오는 것입니다. 그러나 이것은 나에게보기 흉하게 보입니다 (코드 반복성과 버그 위험이 더 커짐).

미리 감사드립니다.

+0

귀하의 질문에 대한 대답이 '예'라고 생각합니다. 그러나 : 귀하의 연구를 공유하는 것은 모든 사람들을 돕습니다. 귀하가 시도한 내용과 귀하의 필요를 충족시키지 못한 이유를 알려주십시오. 이것은 시간을내어 자신을 도우려는 것을 보여 주며, 명백한 답을 되풀이하지 않아도되며, 무엇보다도보다 구체적이고 관련성있는 답변을 얻는 데 도움이됩니다! 또한 참조하십시오 [질문하는 방법] (http://stackoverflow.com/help/how-to-ask) –

+0

'% rowcount' 커서 속성을 사용 해보려고했는데,이게 당신이 찾고있는 것 같아요. – Aramillo

+0

% rowcount 커서를 바로 가져와야합니까? 두 개의 저장 프로 시저에서 동일한 SQL 코드를 사용하는 솔루션을 찾고 있습니다. 하나는 데이터 세트를 제공하기위한 것이고 (느릴 수 있음) 하나는 행 수를 제공하는 것입니다 (빠른 것이어야합니다). – eka808

답변

1
당신은 다음과 같이 할 수

, 함수에 변수를 전달하고 함수는에서 행의 양을 저장하는 것입니다 :

function search_foo(param1 varchar2, param1 varchar3, PARAM_ROWCOUNT OUT NUMBER) -- here 
    return g_ref -- a ref cursor 
    is 
    l_return g_ref; 
{ 
    open l_return for 
    select col1_i_need, col2_i_need 
    from foo 
    join bar on --[...] 
    where [...]; 

    PARAM_ROWCOUNT := l_return%ROWCOUNT; -- and here 

    return l_return; 
} 

UPD : 죄송합니다, 당신은 수를 찾을 것인지 알아 차리지 않았다 인출 전에 행 수 불행히도, 불가능할 수도 있습니다. 그러나 저장 프로 시저가 너무 많은 행을 반환하지 않도록하려면 언제든지 WHERE ROWNUM < = 1000 절을 쿼리에 추가 할 수 있습니다.

관련 문제