You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6+EF Core连接Oracle 11g迭代查询结果报错求助

问题分析

你遇到的PLS-00302错误根源是:Oracle 11g不支持DBMS_SQL.RETURN_RESULT这个API,该特性是Oracle 12c才引入的。尽管你配置了UseOracleSQLCompatibility("11"),但Oracle.EntityFrameworkCore 7.21.11版本在生成动态SQL时,没有正确降级到11g兼容的执行逻辑,仍然使用了12c+的特性。

解决方案

1. 降级Oracle.EntityFrameworkCore版本

Oracle官方从EF Core 6.x之后的版本(包括7.x),已逐步停止对Oracle 11g的支持。你可以降级到适配.NET 6且兼容11g的版本,比如Oracle.EntityFrameworkCore 6.21.x系列:

  • 卸载当前版本:
    dotnet remove package Oracle.EntityFrameworkCore
    
  • 安装兼容版本:
    dotnet add package Oracle.EntityFrameworkCore --version 6.21.11
    
    降级后重新测试,驱动会生成11g兼容的SQL执行逻辑,不再使用DBMS_SQL.RETURN_RESULT。

2. 调整查询写法,避免生成PL/SQL块

EF Core在某些场景(如带参数的分页查询)会生成封装的PL/SQL块,你可以调整查询方式,让EF直接生成普通SELECT语句:

  • 提前物化查询结果,避免延迟执行触发动态PL/SQL生成:
    // 原写法(可能生成PL/SQL块)
    var data = dbContext.SomeTable.Take(10);
    // 修改为直接物化结果,EF会生成普通SELECT语句
    var data = dbContext.SomeTable.Take(10).ToList();
    
  • 复杂场景下可手动指定原生SQL:
    var data = dbContext.SomeTable.FromSqlRaw(@"
        SELECT a, b, c FROM schema.sometable
        FETCH FIRST :rows ROWS ONLY", 10).ToList();
    

3. 修改连接字符串配置

尝试在连接字符串中添加StatementType=Direct参数,强制Oracle驱动直接执行SQL语句,而非封装成PL/SQL块:

Data Source=your_oracle_source;User Id=user;Password=pass;StatementType=Direct
验证方法

修改后查看EF Core生成的SQL日志,若不再出现包含DBMS_SQL.RETURN_RESULT的PL/SQL块,而是直接生成SELECT ... FETCH FIRST N ROWS ONLY的语句,说明配置生效。

内容的提问来源于stack exchange,提问作者Subin Adhikari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:03:16