我熟悉Oracle的对象,嵌套表,table()函数等。 但是有可能创建对象类型,例如两个varchar2列并选择该类型作为列而不创建该对象类型的嵌套表类型?
我试图创建返回它的类型和函数。并选择该函数结果,但结果显示对象类型(不是我想要的列)。使用表类型,可以很容易地使用table()将对象类型字段转换为常规列。
我需要这样:
SELECT MY_FUNC(params)
FROM DUAL
结果将是:
|field 1| |field 2|
txt1 txt2
但现在的结果是:
|MY_FUNC(params)|
(txt1; txt2)
答案 0 :(得分:3)
您可以使用Oracle对象返回多个数据。考虑:
SQL> CREATE OR REPLACE TYPE t AS OBJECT (
2 x NUMBER,
3 y NUMBER
4 );
5 /
Type created
SQL> SELECT a.obj.x, a.obj.y FROM (SELECT t(0,1) obj FROM DUAL) a;
OBJ.X OBJ.Y
---------- ----------
0 1
答案 1 :(得分:2)
我可能会使用pipelined table function执行此操作,因此它看起来像:
CREATE OR REPLACE PACKAGE test_pkg
AS
TYPE rec_t IS RECORD(field_1 varchar2(10), field_2 varchar2(10));
TYPE tbl_t IS TABLE OF rec_t;
FUNCTION my_func(p1_in IN NUMBER)
RETURN tbl_t
PIPELINED;
END test_pkg;
/
CREATE OR REPLACE PACKAGE BODY test_pkg
AS
FUNCTION my_func(p1_in IN NUMBER)
RETURN tbl_t
PIPELINED
IS
rec REC_T;
BEGIN
IF p1_in > 10
THEN
rec.field_1 := 'one';
rec.field_2 := 'two';
ELSE
rec.field_1 := 'three';
rec.field_2 := 'four';
END IF;
PIPE ROW(rec);
RETURN;
END my_func;
END test_pkg;
然后可以查询:
select *
from table(test_pkg.my_func(2))
返回:
FIELD_1 FIELD_2
three four
答案 2 :(得分:0)
我认为没有任何方法可以直接将对象视为表,而不会根据对象声明嵌套表类型。但是,如果您要避免修改函数,可以通过在SQL语句中转换函数结果来实现:
CREATE OR REPLACE TYPE testtype AS OBJECT( x NUMBER, y NUMBER);
/
CREATE OR REPLACE TYPE testtypetab AS TABLE OF testtype;
/
CREATE OR REPLACE FUNCTION testfunc RETURN testtype AS
BEGIN
RETURN testtype(1,1);
END testfunc;
/
select * from table(cast(multiset(select testfunc from dual) as testtypetab));