2009-06-30 2 views
3

레코드의 out 변수가있는 oracle 11g 서버에 저장된 proc가 있습니다. 이 절차를 편집 할 수 없습니다. 프로 시저를 호출하고 레코드 세트의 정보를 반환하는 함수를 작성 중입니다. 나는 다음과 같은 질문을 보았다 : past question레코드 수집 유형에서 데이터 선택

내 질문은 레코드의 테이블 형식을 만들고 SQL에서 직접 쿼리 할 수 ​​있습니까? 또는 레코드를 개체 유형으로 변환하고 직접 쿼리 할 수 ​​있도록 테이블 형식을 만들어야합니까?

+0

어떤 RDMS를 사용하고 있습니까? 저장 프로 시저 내에서 수행 할 수있는 작업은 플랫폼에 따라 다릅니다. –

+0

죄송합니다. oracle 11g을 사용하고 있습니다. – Slowbie

답변

1

링크가 가리키는 질문에 Oracle 태그가 붙어 있으므로 사용중인 것으로 가정합니다.

 
SQL> VAR cr_dual REFCURSOR 

SQL> BEGIN 
    2   OPEN :cr_dual FOR 
    3   SELECT 1 
    4   FROM dual 
    5   UNION ALL 
    6   SELECT 2 
    7   FROM dual; 
    8 END; 
    9/

Процедура PL/SQL успешно завершена. 

SQL> PRINT cr_dual 

     1 
---------- 
     1 
     2 
0

당신은 단지 하나의 레코드를 수신하고 있고 레코드 정의를 알고 있다면, 당신이 직접 이름으로 레코드의 필드 수 있어야한다 :

가장 쉬운 방법

아마 CURSOR가 반환됩니다.

CREATE OR REPLACE FUNCTION myFunction(theRecord IN myrecord%TYPE) RETURN NUMBER 
IS 
BEGIN  
    RETURN recordInstance.itemA; 
END myFunction; 

노트이 주위에 얻을 수있을 수 : 당신이 데 MyRecord 유형의 기록이있을 때

TYPE myrecord IS RECORD (
     itemA NUMBER, 
     itemB myTable.columnName%TYPE 
); 

, 당신은 이런 방식으로 itemA을 참조 할 수 있습니다 : 예를 들어

귀하의 호출 코드에서 단순히 원래 프로 시저가 반환하는 레코드 유형을 처리 할 수 ​​있습니다.

+0

레코드의 일부만 필요로하면 좋겠지 만 레코드의 여러 부분이 필요합니다. 이 절차는 우편 주소의 레코드를 반환하므로 여러 변수가 포함되어 있습니다. 도시, 우편 번호, 거리 번호, 거리 이름, 거리 접미어. 그리고 다른 몇 가지.주소록을 사용하는 40 개 앱의 코드를 변경하는 대신 SQL 문에서 레코드를 선택할 수 있도록 테이블에 레코드를 전송하려고합니다. – Slowbie

+0

@Slowbie, 알겠습니다. 얼마나 많은 필드를 반환하기를 원하십니까? 아니면 주소의 concatinated varchar가 필요합니까? 나는 당신이 당신의 함수에서 반환 값으로 원하는 것을 보는 것이 좋을 것 같다. – akf

0

Varray를 시도 할 수 있습니다.

첫째 -

create or replace type addr_type 
as object 
(name varchar2(20) 
,city varchar2(20) 
) 

그리고 당신의 VARRAY를 만들

create or replace type varr_addr as varray(10) of addr_type 
/

로 이제 당신은 varr_addr와 함께 작업을 반환 할 수 있습니다. 예 :

SQL> create or replace procedure ret_user_addr (p_out out varr_addr) 
    2 is 
    3 begin 
    4 p_out := varr_addr(addr_type('NAME1','CITY1'),addr_type('NAME2','CITY2')); 
    5 end; 
    6/

Procedure created. 

SQL> sho err 
No errors. 

지금 당신은 당신이하는 것처럼 당신이 테이블 (VARIABLE_NAME)을 선택할 수 있습니다 call.And 곳에서 제대로 구성 아웃 변수가 필요합니다.

3

RECORD는 PL/SQL 개념입니다. 따라서 우리는 RECORD를 기반으로 TABLE TYPE을 생성하고 SQL 문에서 해당 TYPE을 사용할 수 없습니다. SQL은 SQL에서 작성된 TYPE 만 인식합니다.

그래서 시나리오를 올바르게 이해했다면 SQL에서 개체 및/또는 중첩 테이블을 만들어야합니다. 그런 다음 함수는 프로 시저를 호출하고 레코드를 중첩 테이블로 변환 할 수 있습니다. 중첩 된 테이블은 반환되거나 파이프 라인 될 수 있습니다.

1

이 문제의 결과는 저장 프로 시저 논리를 기반으로 뷰를 만들고이를 직접 쿼리하는 것이 었습니다.