如何将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;
让我们考虑一个具有用户定义类型的 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;