如何将return用户自定义类型设为varchar2?

How to return user-defined type as varchar2?

让我们考虑一个具有用户定义类型的 table。

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 returns 列包含用户类型的对象。当我在 SQL*plus 中执行它时,我会看到:

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

如何将查询写入 return 这样的文本输出(假设为 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 发送到应用程序。你能告诉我如何编写一个查询,它将 return varchar2 表示与我在 SQL*PLUS 中看到的相同吗?

编辑

我的实际情况是使用:

create or replace type reftypetab as table of reftype;

并查询:

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

我希望将该输出作为 varchar2: 'KACPER.REFTYPETAB(KACPER.REFTYPE(4,'asd','aaa'),KACPER.REFTYPE(3,'asf','baa'),KACPER.REFTYPE(2,'asg','aba'),KACPER.REFTYPE(1,'ash','aab'))' 或 XML。但是调用时:

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

我得到了:

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

您有什么建议可以让我获得 XML 或我的 table 类型的文本表示吗?

尝试这样的事情:

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 出于我从未理解的原因,明确的 table 别名是强制性的 - 即以下 not 工作:

-- 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;

你可以使用这个:

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

如果你想把所有的东西都放在一起(XML 字符串)你也可以使用

SELECT XMLTYPE(c1)
FROM TESTREF;

另一种方式是这个:

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;