【问题标题】:Object type to columns对象类型到列
【发布时间】:2011-03-08 13:06:40
【问题描述】:

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

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

我需要这样的:

SELECT MY_FUNC(params)
FROM   DUAL

结果是:

|field 1| |field 2|
 txt1      txt2

但是现在的结果是:

|MY_FUNC(params)|
(txt1; txt2)

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

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

    【讨论】:

    • 谢谢!但同时,我必须定义我想要检索的列。
    • @Jokke:是的,SQL 是一种声明性语言,你需要事先知道列/对象的名称。
    • 否,如果您使用带有 table() 函数的嵌套表,则不必这样做。只需使用星号。但这不是我想要的所以......
    【解决方案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
    

    【讨论】:

    • 当然可以,但是这样你需要一个嵌套表类型。所以没有帮助。
    • 为什么反对创建嵌套表类型?
    • 也许我必须使用嵌套表类型,但我的想法是在执行函数时只检索一行。通常我使用 SQL 中的函数来检索一个值,但现在我想通过单次执行(对象类型)检索多个值(列)。但是,如果不分别指向每个字段,似乎不可能在 SQL 中将对象类型值作为列...
    • 请记住,没有什么说您必须从表函数返回多于一行。你甚至不必使用嵌套表,它只是用来定义输出的类型。
    • Craig,实际上我不知道您可以在 SQL 中使用流水线函数以及在包内声明的类型。通常我已经创建了模式类型,但这太棒了!谢谢!
    【解决方案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));
    

    【讨论】:

    • 好的,所以这是不可能的,这正是我的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2023-04-01
    • 2021-12-18
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多