누군가 언제 어떻게 누군가 sys_refcursor를 사용해야하는지에 대한 작은 설명을 해줄 수 있습니까?
누군가 언제 어떻게 누군가 sys_refcursor를 사용해야하는지에 대한 작은 설명을 해줄 수 있습니까?
답변:
커서는 쿼리 결과 집합에 대한 포인터입니다. 를 반환 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
위와 같은 일반적인 "쿼리 열기"함수를 만드는 데 사용 하고 있다면 아마도 뭔가 잘못했을 것입니다!
get_emps
및 get_depts
기능
가능성의 예 : 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을 보고서에서 데이터베이스로 푸시하고 프로 시저를 호출하여 레코드 세트를 가져 와서 보고서 측이 형식화에 집중할 수 있습니다.