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

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。

问题原因

  1. 版本配置不匹配:配置中server_version设置为11g,但实际数据库是10g,yajra/oci8包会根据该配置调整驱动的行为逻辑,比如日期字段的解析格式,导致与Oracle 10g的默认格式不兼容。
  2. 会话日期格式未统一: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:46:33