.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 - 安装兼容版本:
降级后重新测试,驱动会生成11g兼容的SQL执行逻辑,不再使用dotnet add package Oracle.EntityFrameworkCore --version 6.21.11DBMS_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
相关产品推荐
相关产品推荐

