Oracle PL/SQL:ORA-00947:创建函数时没有足够的值

Oracle PL/SQL:ORA-00947:创建函数时没有足够的值,oracle,plsql,oracle12c,Oracle,Plsql,Oracle12c,我正在创建一个包,其中包含一个返回表的函数。以下是(简化)代码: 我在编译包时遇到以下错误: Error(9,13): PL/SQL: ORA-00947: not enough values 查询本身可以工作,尽管此时数据库中没有数据,因为此时正在处理数据库。我不明白为什么会这样。我想这可能与类型有关 问题是 SELECT ID,Name -- here BULK COLLECT INTO results FROM Customer_Table customer 需要在结果中收集A_记

我正在创建一个包,其中包含一个返回表的函数。以下是(简化)代码:

我在编译包时遇到以下错误:

Error(9,13): PL/SQL: ORA-00947: not enough values
查询本身可以工作,尽管此时数据库中没有数据,因为此时正在处理数据库。我不明白为什么会这样。我想这可能与类型有关

问题是

SELECT ID,Name  -- here
BULK COLLECT INTO results 
FROM Customer_Table customer
需要在结果中收集A_记录类型的对象。所以,这个电话应该是

SELECT A_RECORD(ID,Name) BULK ...`
此外,我认为您实际上不需要在外部创建类型。这应该起作用:

create or replace PACKAGE My_Package AS
  TYPE A_TABLE IS TABLE OF Customr_Table%rowtype;

  FUNCTION A_Data
  RETURN A_TABLE;

END My_Package;
/

CREATE OR REPLACE PACKAGE BODY My_Package
IS
FUNCTION A_Data
  RETURN A_TABLE
IS
  results A_TABLE;
BEGIN
  SELECT ID, NAME BULK COLLECT INTO results FROM Customr_Table;
  RETURN results;
END A_Data;
END My_Package;
/
您可以这样使用它:

declare
  v My_Package.A_Table;
begin
  v := My_Package.A_data();
  for i in 1 .. v.count loop
    dbms_output.put_line(v(i).id || ' ' || v(i).Name);
  end loop;
end;
/
问题是

SELECT ID,Name  -- here
BULK COLLECT INTO results 
FROM Customer_Table customer
需要在结果中收集A_记录类型的对象。所以,这个电话应该是

SELECT A_RECORD(ID,Name) BULK ...`
此外,我认为您实际上不需要在外部创建类型。这应该起作用:

create or replace PACKAGE My_Package AS
  TYPE A_TABLE IS TABLE OF Customr_Table%rowtype;

  FUNCTION A_Data
  RETURN A_TABLE;

END My_Package;
/

CREATE OR REPLACE PACKAGE BODY My_Package
IS
FUNCTION A_Data
  RETURN A_TABLE
IS
  results A_TABLE;
BEGIN
  SELECT ID, NAME BULK COLLECT INTO results FROM Customr_Table;
  RETURN results;
END A_Data;
END My_Package;
/
您可以这样使用它:

declare
  v My_Package.A_Table;
begin
  v := My_Package.A_data();
  for i in 1 .. v.count loop
    dbms_output.put_line(v(i).id || ' ' || v(i).Name);
  end loop;
end;
/

在一个记录中选择两个值。不是那样的。您应该在选择中创建记录类型:

CREATE OR REPLACE PACKAGE BODY My_Package IS 

  FUNCTION A_Data() RETURN A_TABLE IS results A_TABLE;

  BEGIN

    SELECT A_RECORD(ID,Name)
    BULK COLLECT INTO results 
    FROM Customer_Table customer

  RETURN results;

  END A_Data;

END My_Package;
/

在一个记录中选择两个值。不是那样的。您应该在选择中创建记录类型:

CREATE OR REPLACE PACKAGE BODY My_Package IS 

  FUNCTION A_Data() RETURN A_TABLE IS results A_TABLE;

  BEGIN

    SELECT A_RECORD(ID,Name)
    BULK COLLECT INTO results 
    FROM Customer_Table customer

  RETURN results;

  END A_Data;

END My_Package;
/

如果我想从包外调用函数,我相信我需要在外部指定类型否?@Damien更新了我的答案。干杯,在这种情况下,答案如下,但你提供了一些我不知道的信息。谢谢。如果我想从软件包外部调用函数,我相信我需要在外部指定类型。否?@Damien更新了我的答案。干杯,在这种情况下,答案如下,但您也提供了一些我不知道的信息。谢谢