Oracle에서 sys_refcursor를 사용하는 방법과시기


답변:


10

커서는 쿼리 결과 집합에 대한 포인터입니다. 를 반환 sys_refcursor하면 클라이언트가 쿼리에서 필요한만큼 행을 가져올 수 있습니다. 상태 저장 응용 프로그램에서는 결과를 페이징하는 데 사용할 수 있습니다.

커서는 가져올 행 수와 중지시기를 클라이언트에게 전적으로 의존하므로 배열을 리턴하는 PL / SQL 함수를 작성하는 것보다 커서가 더 유연합니다. 즉,이 추가 유연성이 유용한 경우를 많이 찾지 못했습니다.

가 있다는 지적이의 가치가 sys_refcursor약하게 당신이 절에서 또는 다른 경우가 아니라 쿼리에 대한 포인터를 반환 할 수 있도록, 입력,하지만 서로 다른 숫자와 열 유형도있다. 또는 결과 집합의 열이 고정 된 강력한 형식의 커서를 사용할 수 있습니다.

이를 통해 다음과 같이 다른 쿼리를 반환하는 함수를 작성할 수 있습니다.

create function get_data ( type varchar2 ) return sys_refcursor as
  ret_cur sys_refcursor;
begin

  if type = 'EMP' then
    open ret_cur for select * from emp;
  elsif type = 'DEPT' then
    open ret_cur for select * from dept;
  end if;

  return ret_cur;
end;

그러나 sys_refcursor위와 같은 일반적인 "쿼리 열기"함수를 만드는 데 사용 하고 있다면 아마도 뭔가 잘못했을 것입니다!


@Chris ... 예제 함수가 "잘못된"이유는 무엇입니까?
Johnny Wu

2
@JohnnyWu "get me anything"기능은 관리하기가 더 어려울 것입니다. 모든 경우에 올바른 결과를 얻도록 테스트하는 방법은 무엇입니까? 보안은 어떻습니까? 프레임 워크를 작성하는 경우 필요할 수 있습니다. 그러나 일반적으로 비즈니스 로직의 경우, 별도의 가지고 더 나은 get_empsget_depts기능
크리스 색슨

1

가능성의 예 : pl / sql이 다시 있기 때문에 행을 나타내는 객체를 정의하고 해당 객체의 pl / sql 테이블을 정의 할 수 있습니다.

create type T_MY_TABLE as table of t_my_object;

그리고 끝

OPEN p_recordset FOR select * from table( v_my_table );

따라서 데이터베이스 테이블에서 종종 고밀도 및 / 또는 암호 직접 쿼리 인 mongo를 구성하는 대신 내부 테이블을 작성하고이를 채우는 pl / sql의 전체 성능을 가질 수 있습니다. 그리고 결과 집합을 수집하는 클라이언트는 더 현명하지 않습니다. 그리고 내부 테이블의 정의를 변경하는 것은 데이터베이스 테이블을 변경하는 것보다 관리 관점에서 더 쉽습니다.

또한 Jasper와 같은 보고서 생성기를 사용할 때 SQL을 보고서에서 데이터베이스로 푸시하고 프로 시저를 호출하여 레코드 세트를 가져 와서 보고서 측이 형식화에 집중할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.