Laravel8用Yajra OCI-8执行SELECT查询遇ORA-01861错误求助
Laravel 8 + Yajra OCI8 连接Oracle 10g 查询报ORA-01861问题排查
问题场景
使用Laravel 8框架集成yajra/oci8包连接Oracle数据库,可正常建立连接,但执行以下Query Builder查询时:
$pdo = DB::connection('oracle'); $data = $pdo->table('SD_WH_V')->first();
始终返回错误:
Error Code : 1861 Error Message : ORA-01861: literal does not match format string Position : 7929 Statement : select * from (select * from "SD_WH_V") where rownum = 1 Bindings : [] (SQL: select * from (select * from "SD_WH_V") where rownum = 1)
但使用原生OCI扩展执行相同SQL语句可正常获取结果:
$s = oci_parse($conn, 'select * from (select * from "SD_WH_V") where rownum = 1'); oci_execute($s); oci_fetch_all($s, $res)
数据库配置如下:
'oracle' => [ 'driver' => 'oracle', 'tns' => '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.11X)(PORT = 15XX))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =PRXX)))', 'host' => env('DB_HOST_ORA', ''), 'port' => env('DB_PORT_ORA', '1521'), 'database' => env('DB_DATABASE_ORA', ''), 'username' => env('DB_USERNAME_ORA', ''), 'password' => env('DB_PASSWORD_ORA', ''), 'charset' => env('DB_CHARSET', 'UTF8'), 'prefix' => env('DB_PREFIX', ''), 'prefix_schema' => env('DB_SCHEMA_PREFIX', ''), 'server_version' => env('DB_SERVER_VERSION', '11g'), 'load_balance' => env('DB_LOAD_BALANCE', 'yes'), 'dynamic' => [], 'session' => [] ]
实际Oracle数据库版本推测为10g。
问题原因
- 版本配置不匹配:配置中
server_version设置为11g,但实际数据库是10g,yajra/oci8包会根据该配置调整驱动的行为逻辑,比如日期字段的解析格式,导致与Oracle 10g的默认格式不兼容。 - 会话日期格式未统一:Laravel的DB连接会话未显式设置日期格式,yajra/oci8在不同Oracle版本下的默认日期格式处理存在差异,引发隐式转换时的格式不匹配错误(ORA-01861)。
解决方案
1. 修正数据库版本配置
将配置中的server_version改为实际的10g:
'server_version' => env('DB_SERVER_VERSION', '10g'),
yajra/oci8会根据正确的版本调整驱动的适配逻辑,避免版本不兼容导致的格式问题。
2. 显式设置会话日期格式
在数据库配置的session数组中添加日期格式参数,强制会话使用统一的日期解析格式:
'session' => [ 'NLS_DATE_FORMAT' => 'YYYY-MM-DD HH24:MI:SS', 'NLS_TIMESTAMP_FORMAT' => 'YYYY-MM-DD HH24:MI:SS.FF', 'NLS_TIMESTAMP_TZ_FORMAT' => 'YYYY-MM-DD HH24:MI:SS.FF TZR' ]
该设置会在建立数据库会话时自动执行ALTER SESSION语句,统一日期字段的解析格式,消除隐式转换的格式冲突。
3. 验证视图字段类型
确认视图SD_WH_V中的日期类型字段是否存在异常格式(比如字符串存储的日期),不过原生OCI查询可正常执行,此步骤可作为补充验证。
内容的提问来源于stack exchange,提问作者siape aja bole
相关产品推荐
相关产品推荐

