PL / SQL数组操作函数

时间:2014-12-16 00:14:49

标签: oracle user-defined-types

我是PL / SQL的新手。我有一个矩阵存储在DB作为嵌套表。就像是, 矩阵存储为对象TABLE(对象为t1 number,t2 number,... t100 number)

要获得矩阵,它将是select x.* from test t, table(t.matrix) x where...,返回

|T1|T2|T3|...|T100| 

我想创建一个函数,该函数仅使用SQL返回要调用的行的总和,等同于

select sum(x.T1),sum(x.T2)...sum(x.T100) from test t, table(t.matrix) x where ...

select bigsum(x.*) from table t, table(t.matrix)

这样的东西

它会多次调用,我不想每次写100列。

3 个答案:

答案 0 :(得分:0)

如果要对100个不同列中的值求和,则必须在某个时刻明确列出这100个列。您可以在视图或函数或流水线表函数或其他构造中封装该表达式的逻辑,这样您就不必多次重复表达式,只需引用您的抽象即可。已创建(即调用总和100个值的函数)。

虽然它可能会使问题复杂化而不是简化它,但您可能会创建一个使用动态SQL生成100列名称的解决方案,并将表达式添加到一起,如果您真的,真的想避免写出100列名。然而,使用动态SQL的额外复杂性极不可能是有益的,除非你在这里提到的大量要求使得列名更多地重写。

答案 1 :(得分:0)

  

"它会被多次调用,并且不想写100   列每次"

为什么不创建视图?写一次,根据需要多次调用:

create or replace view bigsum
     select t.whatever
            , sum(x.T1) as sum_t1
            , sum(x.T2) as sum_t2
            ...
            , sum(x.T100) as sum_t100
      from test t
           , table(t.matrix) x
      group by t.whatever

您需要在TEST中包含标识列,以允许您将视图加入其他表。这种方法会给你一些你想要的东西:

select *
from bigsum
where whatever = 23

您可以通过在正确的文本编辑器中使用正则表达式搜索来处理数据字典视图USER_TYPE_ATTRS(或SQL * Plus说明)中的结果集,从而进一步减少输入的数量' n'更换。

答案 2 :(得分:-1)

您可以根据您的条件在下面给出的表单中创建一个函数,如果您需要参数,那么您可以在创建函数时添加它们并在需要的条件下使用它们

create or replace function bigsum
return number
as
sumall number;
begin
  select (sum(x.T1),sum(x.T2)...sum(x.T100)) into sumall 
   from test t, table(t.matrix) x where .(your condition).. ;
 return sumall;
end;/

and call it in the manner

select  bigsum from dual;