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

Posted

技术标签:

【中文标题】Oracle Open Cursor for Using 给出错误 ORA-00932:不一致的数据类型【英文标题】:Oracle Open Cursor for Using gives error ORA-00932: inconsistent datatypes 【发布时间】:2018-01-26 12:35:28 【问题描述】:

我编写了一个 Oracle 存储函数,我试图将数据库表中的几条记录读入游标并设置为自定义类型。但是我在调​​用这个函数时遇到了错误。

自定义对象类型:

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

我得到的错误是:

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

ORA-06512:在“APP.PKG_DATA_HELPER_UTIL”,第 1403 行

【问题讨论】:

sharedAccounts_query 这个名字有三个变体,所以这甚至不能编译。与错误无关,但为什么要使用动态 SQL? 【参考方案1】:

忽略导致无法编译的不一致命名,错误来自获取,而不是打开。

这里的问题是您有一个目标对象集合,但您选择的是标量值 - 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;

【讨论】:

感谢@Alex,您的解决方案帮助我解决了我的问题。

以上是关于Oracle Open Cursor for Using 给出错误 ORA-00932:不一致的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 19c Open_cursor 超出问题

oracle数据库 参数open_cursors和session_cached_cursor详解!

橙色预警:Oracle游标泄露(open_cursor耗尽)

BULK COLLECT INTO inside OPEN cursor FOR SELECT... 不填充集合

Oracle/PLSQL CURSOR FOR Loop

Open for