2016-11-16 3 views
0

사용자 정의 유형이있는 테이블을 생각해 봅시다.사용자 정의 유형을 varchar2로 반환하는 방법은 무엇입니까?

create or replace type reftype is object (id number, name varchar2(40), details varchar2(1000)); 
create table testref(c1 reftype); 
insert into testref values (REFTYPE(4, 'asd', 'aaa')); 
insert into testref values (REFTYPE(3, 'asf', 'baa')); 
insert into testref values (REFTYPE(2, 'asg', 'aba')); 
insert into testref values (REFTYPE(1, 'ash', 'aab')); 
/
select * from testref; 

Select는 사용자 유형의 객체를 반환합니다. 나는 SQL의 *에서 실행 플러스 내가 볼 때 :

SQL> select * from testref 
REFTYPE(4, 'asd', 'aaa') 
REFTYPE(3, 'asf', 'baa') 
REFTYPE(2, 'asg', 'aba') 
REFTYPE(1, 'ash', 'aab') 

어떻게 텍스트 등의 출력을 반환하는 내 쿼리를 작성할 수 있습니다 (의는 VARCHAR2를 가정 해 봅시다).

SQL> select substr(c1,1,4) from testref; 
select substr(c1,1,4) from testref 
       * 
ERROR at line 1: 
ORA-00932: inconsistent datatypes: expected CHAR got KACPER.REFTYPE 

같은 :

select substr(cast(c1 as varchar2(1000)),1,4) from testref; 

그리고 텍스트가 아닌 UDT 등으로 응용 프로그램에 문자열을 대표하는 사용자 정의 형식을 보내드립니다. SQL * PLUS에서 볼 수있는 것과 동일한 varchar2 표현을 반환하는 쿼리를 작성하는 방법을 알려 줄 수 있습니까?

create or replace type reftypetab as table of reftype; 

및 쿼리 : 'KACPER.REFTYPETAB(KACPER.REFTYPE(4,'asd','aaa'),KACPER.REFTYPE(3,'asf','baa'),KACPER.REFTYPE(2,'asg','aba'),KACPER.REFTYPE(1,'ash','aab'))' 또는 XML과 같이

select cast(collect(c1) as reftypetab) from testref; 

내가 그 출력 중 하나 VARCHAR2로를 가지고 싶다을

편집

내 실제 케이스는 사용하고 . 그러나 호출 할 때 :

select xmltype(cast(collect(c1) as reftypetab)) from testref; 

내가 가지고 :

ORA-06553: PLS-306: wrong number or types of arguments in call to 'XMLTYPE' 

당신은 내가 내 TABLETYPE의 XML 또는 텍스트 표현을 얻을 수있는 방법 어떤 제안이 있습니까?

+0

은 무엇 정확히 같은 결과를보고 싶지 않습니다이 하나 하나 (XML 문자열)의 모든 당신이 또한

SELECT XMLTYPE(c1) FROM TESTREF; 

또 다른 방법으로 사용할 수 있습니다 얻을 수있다? 객체의 각 필드에 대한 열? –

+0

@AlexPoole 아니요. 'REFTYPE (4,'asd ','aaa ')' '같은 값을 하나의 열로 가져오고 싶습니다. 지금은 SQL * PLUS와 똑같은 결과를 얻고 싶지만 UDT가 아닌 varchar2가 필요합니다. – Kacper

답변

5

당신이 할 수있는 이 파일을 사용하십시오 :

SELECT T.c1.ID, T.c1.NAME, T.c1.details 
FROM TESTREF T; 

CREATE OR REPLACE TYPE reftype IS OBJECT (ID NUMBER, NAME VARCHAR2(40), details VARCHAR2(1000), 
    MEMBER FUNCTION TO_VARCHAR2 RETURN VARCHAR2); 

CREATE OR REPLACE TYPE BODY reftype IS 

MEMBER FUNCTION TO_VARCHAR2 RETURN VARCHAR2 IS 
BEGIN 
    RETURN SELF.ID||','||SELF.NAME||','||SELF.details; 
END TO_VARCHAR2; 

END; 
/


SELECT t.c1.TO_VARCHAR2() 
FROM TESTREF t; 
+0

XML이 도움이 될 수 있습니다. 감사합니다. – Kacper

+0

레코드 유형의 테이블 형식 빌드를 어떻게 만들 수 있습니까? 오류가 발생하여 편집했습니다. – Kacper

+0

이 기능이 작동합니까? 'SELECT XMLELEMENT (reftypetab, XMLAGG (XMLTYPE (c1))) FROM testref; –

2

이 같은 것을보십시오 :

내가 이해 적이없는 이유
select t.c1.id||','||t.c1.name||','||t.c1.details text 
from testref t; 

TEXT 
---------------- 
4,asd,aaa 
3,asf,baa 
2,asg,aba 
1,ash,aab 

NB, 명시 적 테이블 별칭이 필수입니다 - 다음 IE 것이다 하지 일 :

-- No alias: 
select c1.id||','||c1.name||','||c1.details text 
from testref; 

-- Implicit use of table name as alias: 
select testref.c1.id||','||testref.c1.name||','||testref.c1.details text 
from testref; 
+0

이것은 단지 샘플 유형입니다. 실제 사례에서는 UDT 레코드의 UDT 테이블이 훨씬 복잡해 지므로 이러한 쿼리는 해결책이 아닙니다. 난 구조를 알지 못하고 UDT를 인쇄하거나 캐스팅하는 방법을 찾고 있습니다. 그러나 당신의 노력에 감사드립니다. – Kacper

+0

그냥 궁금 해서요. 왜 UDT 레코드의 복잡한 "UDT 테이블"을 가지고 있습니까? 단순한 관계형 테이블을 사용하여 데이터를 보유하는 것이 어떨까요? –

+0

@ Kacper의 이점 (Tony가 이미 알고 있다고 확신합니다) [별칭 요구 사항이 문서화되어 있습니다] (https://docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjbas.htm#ADOBJ7080); 그것은 일종의 설명이지만 아주 명확하지는 않습니다. –

관련 문제