Oracle Open Cursor for Using 给出错误 ORA-00932:数据类型不一致
Oracle Open Cursor for Using gives error ORA-00932: inconsistent datatypes
我编写了一个 Oracle 存储函数,我试图从数据库 table 中读取几条记录到游标中并设置为自定义类型。但是我在调用这个函数时遇到错误。
自定义对象类型:
create or replace
TYPE SHARED_ACCOUNT_TYPE AS object(
item_account_id NUMBER(11),
share_by_id NUMBER(11),
share_to_id NUMBER(11)
)
自定义 table 类型:
create or replace
TYPE SHARED_ACCOUNT_TYPE_COLLECTION
as table of SHARED_ACCOUNT_TYPE
主要存储函数:
FUNCTION getUserSharedAccounts(v_user_id IN NUMBER)
RETURN SHARED_ACCOUNT_TYPE_COLLECTION
IS
sharedAccounts_query VARCHAR2(200);
sharedAccountCollection SHARED_ACCOUNT_TYPE_COLLECTION;
TYPE SharedAccountCursorType IS REF CURSOR; -- define weak REF CURSOR type
shared_account_cursor SharedAccountCursorType; -- declare cursor variable
BEGIN
shareAccounts_query :=
'SELECT item_id, share_by_id, share_to_id FROM share_accounts WHERE share_to_id = :s';
OPEN shared_account_cursor FOR sharedAccount_query USING v_user_id;
FETCH shared_account_cursor bulk collect into sharedAccountCollection;
CLOSE shared_account_cursor;
RETURN sharedAccountCollection;
END;
我这样调用上面的函数:
declare
sharedAccount SHARED_ACCOUNT_TYPE_COLLECTION;
begin
sharedAccount := PKG_DATA_POINT_UTIL.getUserSharedAccounts(991033632);
end;
注意:从类型 NUMBER(11) 开始,从数据库 table 中提取的所有 3 个字段。
我得到的错误是:
ORA-00932: inconsistent datatypes: expected %s got %s
ORA-06512: at"APP.PKG_DATA_HELPER_UTIL", line 1403
忽略完全阻止此编译的不一致命名,错误来自获取,而不是打开。
这里的问题是您有对象的目标集合,但您正在选择标量值——Oracle 不能(或不会)自动将它们转换为您的对象类型。所以你需要创建对象作为查询的一部分,即而不是
SELECT item_id, share_by_id, share_to_id
你需要
SELECT SHARED_ACCOUNT_TYPE(item_id, share_by_id, share_to_id)
所以:
sharedAccounts_query :=
'SELECT SHARED_ACCOUNT_TYPE(item_id, share_by_id, share_to_id) FROM share_accounts WHERE share_to_id = :s';
顺便说一句,您不需要在此处使用动态 SQL 或游标;静态 SQL 可以:
FUNCTION getUserSharedAccounts(v_user_id IN NUMBER)
RETURN SHARED_ACCOUNT_TYPE_COLLECTION
IS
sharedAccountCollection SHARED_ACCOUNT_TYPE_COLLECTION;
BEGIN
SELECT SHARED_ACCOUNT_TYPE(item_id, share_by_id, share_to_id)
bulk collect into sharedAccountCollection
FROM share_accounts
WHERE share_to_id = v_user_id;
RETURN sharedAccountCollection;
END;
我编写了一个 Oracle 存储函数,我试图从数据库 table 中读取几条记录到游标中并设置为自定义类型。但是我在调用这个函数时遇到错误。
自定义对象类型:
create or replace
TYPE SHARED_ACCOUNT_TYPE AS object(
item_account_id NUMBER(11),
share_by_id NUMBER(11),
share_to_id NUMBER(11)
)
自定义 table 类型:
create or replace
TYPE SHARED_ACCOUNT_TYPE_COLLECTION
as table of SHARED_ACCOUNT_TYPE
主要存储函数:
FUNCTION getUserSharedAccounts(v_user_id IN NUMBER)
RETURN SHARED_ACCOUNT_TYPE_COLLECTION
IS
sharedAccounts_query VARCHAR2(200);
sharedAccountCollection SHARED_ACCOUNT_TYPE_COLLECTION;
TYPE SharedAccountCursorType IS REF CURSOR; -- define weak REF CURSOR type
shared_account_cursor SharedAccountCursorType; -- declare cursor variable
BEGIN
shareAccounts_query :=
'SELECT item_id, share_by_id, share_to_id FROM share_accounts WHERE share_to_id = :s';
OPEN shared_account_cursor FOR sharedAccount_query USING v_user_id;
FETCH shared_account_cursor bulk collect into sharedAccountCollection;
CLOSE shared_account_cursor;
RETURN sharedAccountCollection;
END;
我这样调用上面的函数:
declare
sharedAccount SHARED_ACCOUNT_TYPE_COLLECTION;
begin
sharedAccount := PKG_DATA_POINT_UTIL.getUserSharedAccounts(991033632);
end;
注意:从类型 NUMBER(11) 开始,从数据库 table 中提取的所有 3 个字段。
我得到的错误是:
ORA-00932: inconsistent datatypes: expected %s got %s
ORA-06512: at"APP.PKG_DATA_HELPER_UTIL", line 1403
忽略完全阻止此编译的不一致命名,错误来自获取,而不是打开。
这里的问题是您有对象的目标集合,但您正在选择标量值——Oracle 不能(或不会)自动将它们转换为您的对象类型。所以你需要创建对象作为查询的一部分,即而不是
SELECT item_id, share_by_id, share_to_id
你需要
SELECT SHARED_ACCOUNT_TYPE(item_id, share_by_id, share_to_id)
所以:
sharedAccounts_query :=
'SELECT SHARED_ACCOUNT_TYPE(item_id, share_by_id, share_to_id) FROM share_accounts WHERE share_to_id = :s';
顺便说一句,您不需要在此处使用动态 SQL 或游标;静态 SQL 可以:
FUNCTION getUserSharedAccounts(v_user_id IN NUMBER)
RETURN SHARED_ACCOUNT_TYPE_COLLECTION
IS
sharedAccountCollection SHARED_ACCOUNT_TYPE_COLLECTION;
BEGIN
SELECT SHARED_ACCOUNT_TYPE(item_id, share_by_id, share_to_id)
bulk collect into sharedAccountCollection
FROM share_accounts
WHERE share_to_id = v_user_id;
RETURN sharedAccountCollection;
END;