oracle - 执行 BULK COLLECT 时出现 ORA-00932

标签 oracle plsql

我收到错误:ORA-00932:数据类型不一致:预期 - 已得到 -。 没有任何信息表明不一致的类型。我只看到-。有办法检查吗? 下面的代码经过简化:

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 的行中。 有什么线索吗?谢谢!

最佳答案

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

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

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

一切都会正常进行

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

关于oracle - 执行 BULK COLLECT 时出现 ORA-00932,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70096296/

相关文章:

java - 将日期字符串数组上传到 oracle

java - 如何将时间戳字段发送到 Oracle 存储过程。尽管数据库配置来自 Java?

java - 如何生成独特的优惠券代码?

oracle - Oracle存储过程中的表变量

java - 大表映射到另一个表

oracle - impdp 奇怪的 ora 错误

spring - 使用simplejdbccall时如何在spring中关闭refcursor

sql - 数组在IN()子句中oracle PLSQL

java - 从 Oracle 调用 Java,PL SQL 导致 oracle.aurora.vm.ReadOnly 对象异常

oracle - Plsql 将数字(货币)拼写为意大利货币,无需硬编码翻译数字