根据现有表创建类型

时间:2016-06-22 15:29:40

标签: oracle plsql

正如标题所说:我想基于现有的表在oracle中创建一个类型。

我做了如下:

create or replace type  MY_NEW_TYPE as object( one_row EXISTING_TABLE%rowtype);

Aim能够将此功能用于一个函数,该函数将返回一个包含表 EXISTING_TABLE 的样本行的表:

create or replace function OUTPUT_FCT() return MY_NEW_TYPE AS
...

2 个答案:

答案 0 :(得分:3)

如果您只需要创建一个从表中返回一行的函数,您可以尝试类似下面的内容,而无需创建类型。

<强>设置:

create table EXISTING_TABLE( a number, b varchar2(100));
insert into EXISTING_TABLE values (1, 'one');

<强>功能

create or replace function OUTPUT_FCT return EXISTING_TABLE%rowtype AS
    retVal EXISTING_TABLE%rowType;
begin
    select *
    into retVal
    from EXISTING_TABLE
    where rownum = 1;
    --
    return retVal;
end;

函数调用

SQL> begin
  2      dbms_output.put_line(OUTPUT_FCT().a);
  3      dbms_output.put_line(OUTPUT_FCT().b);
  4  end;
  5  /
1
one

但是,我不推荐这样的方法,因为select *之类的东西可能真的很危险;我更喜欢用我需要的字段定义一个类型,然后显式查询我的表以获取所需的列。

答案 1 :(得分:2)

不,你不能这样做,你会收到编译错误:

create or replace type my_new_type as object(one_row t42%rowtype);
/

Type MY_NEW_TYPE compiled
Errors: check compiler log

show errors

Errors for TYPE STACKOVERFLOW.MY_NEW_TYPE:

LINE/COL ERROR
-------- -----------------------------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
1/36     PLS-00329: schema-level type has illegal reference to MYSCHEMA.T42

您需要在对象类型中指定每个字段,并且您还必须手动指定数据类型 - 您也不能使用table.column%type

您可以根据数据字典中的列和数据类型信息动态创建类型,但因为这将(希望)是一次性任务,而不是您在运行时所做的事情,而不是#39这真的很值得。

您可以根据表rowtype创建PL / SQL表类型,但是您只能调用从PL / SQL返回的函数,而不是从纯SQL中调用 - 所以你例如,无法在表集合表达式中使用它。如果您只返回单个样本行,则可以返回记录而不是表,但同样适用。您还可以使用一个函数返回一个可以与表格结构匹配的引用光标,但您也无法将其视为表格。

Read more about object type creation in the documentation。特别是属性和数据类型部分。