ORA-00932 在执行 BULK COLLECT 时

Posted

技术标签:

【中文标题】ORA-00932 在执行 BULK COLLECT 时【英文标题】:ORA-00932 while executing into BULK COLLECT 【发布时间】:2021-11-24 12:43:48 【问题描述】:

我收到错误:ORA-00932:inconsistent datatypes: expected - got -。 没有什么类型不一致的信息。我只看到-。有没有办法检查它? 下面的代码被简化了:

create type IMPORT_R as object (
  ID int,
  IMPORT1_ID int,
  IMPORT2_ID int,
  PROD_ID int
);
create type IMPORT_T as table of IMPORT_R;

CREATE FUNCTION GetImport(
  id IN BINARY_INTEGER, 
  id2 IN BINARY_INTEGER, 
  id3 IN BINARY_INTEGER) 
return IMPORT_T
IS
  sqlCommand VARCHAR2(32000);
  v_Result IMPORT_T;
begin
    sqlCommand :=
        'SELECT ID, IMPORT1_ID, IMPORT2_ID, PROD_ID
        FROM 
        (
            SELECT ID,
                   IMPORT1_ID,
                   -1 AS IMPORT2_ID,
                   PROD_ID                
              FROM TABLE1
              WHERE IMPORT1> '|| id1;

       
    IF id := 123 THEN    
        sqlCommand := sqlCommand||
        'UNION
        SELECT ID,
               -1 AS IMPORT1_ID,
               IMPORT2_ID,
               PROD_ID               
          FROM TABLE2
          WHERE IMPORT2> '|| id2;
    END IF;
    
    sqlCommand := sqlCommand||')' ;
    
    EXECUTE IMMEDIATE sqlCommand BULK COLLECT INTO v_Result;
    
    return v_Result;
end;

错误发生在执行 EXECUTE IMMEDIATE 的行。 有什么线索吗?谢谢!

【问题讨论】:

【参考方案1】:

发生这种情况是因为 Oracle 尝试将 4 个数字(id、import1_id、import2_id、prod_id)放入一个结果列但失败了。

为了解决这个问题,您需要明确告诉数据库如何将这 4 个数字转换为对象。好在只需要修改第一行,查询部分的第一行:

sqlCommand :=
    'SELECT IMPORT_R(ID, IMPORT1_ID, IMPORT2_ID, PROD_ID)

一切都会好起来的

(我不知道为什么在这种情况下 ORA 消息如此不清楚)

【讨论】:

谢谢!更改了它,但现在我得到:`不一致的数据类型:预期的 UDT 得到了 NUMBER。` @hajduk 你是把它改成“SELECT IMPORT_T..”还是“SELECT IMPORT_R...)?指定IMPORT_T时会出现这个错误 确实!非常感谢!!

以上是关于ORA-00932 在执行 BULK COLLECT 时的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:在 UNION 语句 ORA-00932 中,clob 列与自身不一致

ORA-00932不一致的数据类型预期 char 得到数字

ORA-00932 数据类型不一致: 应为 -, 但却获得 -

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

ORA-00932: inconsistent datatypes: expected - got NCLOBORA-00932: 数据类型不一致: 应为 -, 但却获得 NCLOB 解决办法

ORA-00932: inconsistent datatypes: expected - got NCLOBORA-00932: 数据类型不一致: 应为 -, 但却获得 NCLOB 解决办法