Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL数组操作函数_Oracle_User Defined Types - Fatal编程技术网

Oracle PL/SQL数组操作函数

Oracle PL/SQL数组操作函数,oracle,user-defined-types,Oracle,User Defined Types,我是PL/SQL方面的新手。我有一个矩阵作为嵌套表存储在DB中。大概, 矩阵存储为对象表(对象为t1编号、t2编号、t100编号) 要获得矩阵,它将是从测试t的表(t.matrix)x中选择x.*,其中…,返回 |T1|T2|T3|...|T100| 我想创建一个函数,只使用SQL返回要调用的行的和,相当于 select sum(x.T1),sum(x.T2)...sum(x.T100) from test t, table(t.matrix) x where ... 类似于从表t、表(t

我是PL/SQL方面的新手。我有一个矩阵作为嵌套表存储在
DB
中。大概, 矩阵存储为对象表(对象为t1编号、t2编号、t100编号)

要获得矩阵,它将是
从测试t的表(t.matrix)x中选择x.*,其中…
,返回

|T1|T2|T3|...|T100| 
我想创建一个函数,只使用SQL返回要调用的行的和,相当于

select sum(x.T1),sum(x.T2)...sum(x.T100) from test t, table(t.matrix) x where ...
类似于
从表t、表(t.matrix)中选择bigsum(x*)


它会被调用几次,我不想每次都写100列。

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

尽管这可能会使问题复杂化,而不是简化问题,但如果您确实希望避免写出100个列名,您可以创建一个使用动态SQL生成100个列名并将其添加到一起的表达式的解决方案。然而,使用动态SQL的额外复杂性不太可能带来好处,除非您在这里没有提到过一些实质性的要求,这些要求使得列名的书写有点重复

“它会被调用好几次,而且不想写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
您需要包括来自测试的标识列,以便将视图连接到其他表。这种方法会给你一些你想要的东西:

select *
from bigsum
where whatever = 23

您可以通过在带有regex search'n'replace的体面文本编辑器中处理数据字典视图(或SQL*Plus描述)中的结果集,进一步减少键入量

您可以根据您的条件以下面给定的形式创建函数,如果您需要参数,则可以在创建函数时添加它们,并在所需的条件下使用它们

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;

谢谢,但这不起作用,因为每一行的标识符都是唯一的,所以除非我事先知道是哪一行,否则视图不会编译。还有其他方法使用函数吗?我不明白你的意思:所有标识符都是唯一的。请发布您的数据结构的完整描述。如果你没有提供所有相关的信息,你就不能指望我们给你一个可行的解决方案。我真的很感谢你的帮助(以及编辑我的文章),除了t。?列我有一个ID列。我需要做几次,就是使用id查询给定与另一个表连接的所选行的总和,例如:从表t中选择bigsum(x*),表(t.matrix),其中t.id位于(0,19,30,55)如果我创建一个视图,id不是单个组函数,这就是为什么我认为编写过程或函数可能是一种方法,但我找不到任何帮助好吧,现在我明白你想做什么了。唉,现在我没有时间想出一个解决办法。否决投票的原因是什么。。。我已经提到,如果它的参数是基于参数的,那么可以在where子句中声明参数并在所需条件下使用它们