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

PL/SQL: ORA-00947: not enough values when creating function

我正在创建一个具有 returns 和 table 功能的程序包。这是(简化的)代码:

DROP TYPE A_TABLE;
 /
CREATE OR REPLACE TYPE A_RECORD IS object (
    ID  varchar(10),
    Name    varchar(500)
);
/ 
CREATE  TYPE A_TABLE IS TABLE OF A_RECORD;
/
CREATE OR REPLACE PACKAGE My_Package AS

  results A_TABLE;

  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 Customer_Table customer

  RETURN results;

  END A_Data;

END My_Package;
/

我在编译包时遇到这个错误:

Error(9,13): PL/SQL: ORA-00947: not enough values

查询本身可以正常工作,尽管此时数据库中没有数据,因为目前正在处理数据库。我不明白为什么会这样。我认为这可能与类型有关?

问题是

SELECT ID,Name  -- here
BULK COLLECT INTO results 
FROM Customer_Table customer

结果中需要收集类型A_RECORD的对象。所以,调用应该是

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 将两个值合并到一条记录中。它不是那样工作的。您应该在 select:

中创建您的记录类型
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;
/