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;
/
我正在创建一个具有 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;
/