Sql 尝试在求和表达式中使用包函数时,标识符无效

Sql 尝试在求和表达式中使用包函数时,标识符无效,sql,oracle,plsql,Sql,Oracle,Plsql,我试图将sum函数与包函数一起使用,但遇到了一个“无效标识符”错误。下面是一些注释了导致错误的函数的示例代码 create or replace type numType as object ( myNum number ) ; / create or replace type numTypes is table of numType; / create or replace package testNumberPackage as function ReturnNum(in_numT

我试图将sum函数与包函数一起使用,但遇到了一个“无效标识符”错误。下面是一些注释了导致错误的函数的示例代码

create or replace type numType as object
(
  myNum number
)
;
/ 
create or replace type numTypes is table of numType;
/
create or replace package testNumberPackage as
  function ReturnNum(in_numType numType) return number;
end;
/
create or replace package body testNumberPackage as
  function ReturnNum(in_numType numType) return number is
  begin
    return in_numType.myNum;
  end;
end;
/
declare l_numTypes numTypes; 
  l_count number; 
begin 
  l_numTypes := numTypes();
  for i in 1 .. 100 loop 
    l_numTypes.extend(1); 
    l_numTypes(l_numTypes.last) := numType(i); 
  end loop;

  select sum(n.myNum) into l_count from table(l_numTypes) n;
  select sum(testNumberPackage.ReturnNum(n)) into l_count from table(l_numTypes) n; --causes the error

  dbms_output.put_line(l_count); 
end;
/
此代码的确切错误是

ORA-06550: line 11, column 42
PL/SQL: ORA-00904: "N": invalid identifier
ORA-6550:  line 11, column 3:
PL/SQL: SQL Statement ignored

谢谢您的帮助。

第一个问题是,您不能使用表的别名将表传递到参数中。这样做根本没有意义

下一个问题是如何将从
表(l_numTypes)
返回的列
mynum
转换为正确的格式,以传递到
testNumberPackage.ReturnNum
,因为它是数字数据类型,并且函数需要一个numtype参数

为此,您需要传入一个包含该列的对象,如下所示:
numtype(n.mynum)

以下是我的作品:

declare
  l_numTypes numTypes; 
  l_count number; 
begin 
  l_numTypes := numTypes();
  for i in 1 .. 100 loop 
    l_numTypes.extend(1); 
    l_numTypes(l_numTypes.last) := numType(i); 
  end loop;

  select sum(n.myNum) into l_count from table(l_numTypes) n;
  select sum(testNumberPackage.ReturnNum(numtype(n.mynum))) into l_count from table(l_numTypes) n; --causes the error

  dbms_output.put_line(l_count); 
end;
/

5050

清除为mud?

这种方法在这种情况下有效,但是当类型可能有几十个属性时,总是重新构造类型有点困难。是否无法使用已存储在l_numTypes表中的numtype?为什么需要使用numtype?通过使用table(l_numtypes),您基本上已经将数组转换为一个表,该表包含由数组所基于的记录/对象定义的列。您已经完全跳过了引用记录类型的需要。我想你可能想得太多了?为什么不像在前面的select语句中那样直接引用mynum列呢?在本例中,testNumberPackage.ReturnNum函数对传入的对象没有太多作用,但您可以想象这样一种情况:一个函数将被传递给一个对象,并使用大量该对象的属性或函数来进行复杂的计算?仅仅使用PL/SQLI给人的印象是,使用求和函数可以提高性能。使用sql语句进行许多计算不是比for循环更快吗?