Oracle Open Cursor for Using给出错误ORA-00932:不一致的数据类型

时间:2018-01-26 12:35:29

标签: oracle stored-procedures plsql cursor

我编写了一个Oracle存储函数,我试图将数据库表中的少量记录读入Cursor并设置为自定义类型。但是在调用此函数时我收到错误。

自定义对象类型:

create or replace 
TYPE SHARED_ACCOUNT_TYPE AS object(
    item_account_id NUMBER(11),
    share_by_id NUMBER(11),
    share_to_id NUMBER(11)
  )

自定义表类型:

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)类型的DB表中提取的所有3个字段。

我得到的错误是:

  

ORA-00932:不一致的数据类型:预期%s获得%s

     

ORA-06512:at" APP.PKG_DATA_HELPER_UTIL",1403行

1 个答案:

答案 0 :(得分:4)

忽略阻止编译的不一致命名,错误来自fetch,而不是open。

这里的问题是你有一个目标的对象集合,但你正在选择标量值 - Oracle不能(或不会)自动将它们转换为你的对象类型。因此,您需要将对象创建为查询的一部分,即代替

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';

这样:

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;

顺便说一句,您不需要在此处使用动态SQL或游标;静态SQL没问题:

{{1}}