正如标题所说:我想基于现有的表在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
...
答案 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。特别是属性和数据类型部分。