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更新了我的答案。干杯,在这种情况下,答案如下,但您也提供了一些我不知道的信息。谢谢