Oracle 自定义类型跨越DML语句中字段的列数

Oracle 自定义类型跨越DML语句中字段的列数,oracle,function,select,types,plsql,Oracle,Function,Select,Types,Plsql,假设我有一个自定义数据类型,它有许多成员。例如: create type myType as object( field1 number, field2 varchar2(50), field3 varchar2(25) ); select myTypeFunction().field1, myTypeFunction().field2, myTypeFunction().field3 from dual; select x.field1,

假设我有一个自定义数据类型,它有许多成员。例如:

create type myType as object(
  field1  number,
  field2  varchar2(50),
  field3  varchar2(25)
);
select myTypeFunction().field1,
       myTypeFunction().field2,
       myTypeFunction().field3
from   dual;
select x.field1, x.field2, x.field3
from   lookupTable alpha,
       table(anotherTypeFunction(alpha.id)) x;
现在,如果我有一个返回myType的函数,并将其放入select语句中,Oracle将返回类似以下内容:

select myTypeFunction() from dual;

> myTypeFunction()
> -------------------------------------------------
> schemaowner.myType(1,'something','another thing')
是否有一种通用方法可以将本例中的这三个字段跨越到它们自己的列中;因此,在这种情况下,我想返回:

> field1  field2     field3
> --------------------------------
>      1  something  another thing
我知道通过多次调用函数是可能的。例如:

create type myType as object(
  field1  number,
  field2  varchar2(50),
  field3  varchar2(25)
);
select myTypeFunction().field1,
       myTypeFunction().field2,
       myTypeFunction().field3
from   dual;
select x.field1, x.field2, x.field3
from   lookupTable alpha,
       table(anotherTypeFunction(alpha.id)) x;
或者,在子查询中调用函数一次,或者类似地,使用表类型:

select x.y.field1, x.y.field2, x.y.field3
from   (select myTypeFunction() y from dual) x;

-- or, where myTypeFunction has been modified to return a table of myType:

select field1,field2,field3 from table(myTypeFunction());
然而,所有这些方法看起来都是杂乱无章和低效的——最后一种选择可能看起来最有吸引力,除非有其他选择——因此,如果可能的话,我宁愿避免这样做。此外,我认为,如果函数的参数是来自其他地方的fed值,那么这些方法都不起作用;例如:

create type myType as object(
  field1  number,
  field2  varchar2(50),
  field3  varchar2(25)
);
select myTypeFunction().field1,
       myTypeFunction().field2,
       myTypeFunction().field3
from   dual;
select x.field1, x.field2, x.field3
from   lookupTable alpha,
       table(anotherTypeFunction(alpha.id)) x;
或者更复杂的联接,其中另一个类型函数显然会根据其参数返回不同的值。虽然我不是很确定


谢谢:

我不确定你在寻找什么,因为你列出了很多备选方案,然后在没有充分论证的情况下拒绝使用它们。我不认为他们中的任何一个是杂乱无章的个人观点或低效的,我也没有任何资料来证明这一点

在示例中,将参数传递给myTypeFunction和另一个TypeFunction应该没有问题

本例将给出您所要求的输出。myTypeToTable独立于myType的成员


希望这有帮助

谢谢你的回答:我要找的是像选择SomeOracleFunctionmyType34、'foo'、'bar'之类的东西;做这个把戏。我问这个问题的原因是,在我的第一个例子中,我会调用同一个函数三次——这肯定是低效的,除非Oracle足够聪明来缓存结果——在第二个和第三个例子中,我不能假设feed参数值来自其他表字段。如果我错了,那就没问题;现在我要测试Oracle在我面前!!。。。好的,这些参数确实起作用了——但速度太慢了@克里斯托弗·哈里森:好吧,恐怕你要求太多了。您无法获取所需的语法,但必须使用select。。。从桌子上。。。;。我可能错了,因为我是甲骨文的新手。不幸的是,我不知道这个解决方案的性能,我也想听听第二种意见。如果您认为存在性能问题,可以让我们了解这个性能问题是什么。为此,请您提交:1 Oracle版本-2示例数据-3函数代码-4如果您的函数访问数据库中的数据,请提供表定义和索引5预期输出-6预期操作的性能枚举数,以及在一个时间单位内完成的操作。