对象类型到列

时间:2011-03-08 13:06:41

标签: oracle plsql

我熟悉Oracle的对象,嵌套表,table()函数等。 但是有可能创建对象类型,例如两个varchar2列并选择该类型作为列而不创建该对象类型的嵌套表类型?

我试图创建返回它的类型和函数。并选择该函数结果,但结果显示对象类型(不是我想要的列)。使用表类型,可以很容易地使用table()将对象类型字段转换为常规列。

我需要这样:

SELECT MY_FUNC(params)
FROM   DUAL

结果将是:

|field 1| |field 2|
 txt1      txt2

但现在的结果是:

|MY_FUNC(params)|
(txt1; txt2)

3 个答案:

答案 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));