首页 文章

对象类型到列

提问于
浏览
0

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

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

我需要这样:

SELECT MY_FUNC(params)
FROM   DUAL

结果将是:

|field 1| |field 2|
 txt1      txt2

但现在的结果是:

|MY_FUNC(params)|
(txt1; txt2)

3 回答

  • 3

    我认为没有任何方法可以直接将对象视为表,而无需根据对象声明嵌套表类型 . 但是,如果您要避免修改函数,可以通过在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));
    
  • 2

    您可以使用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
    
  • 0

    我可能会用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
    

相关问题