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

Oracle数据库插入Blob文件报错ORA-01722:无效数字,文件插入失败

问题:插入文件时触发ORA-01722: 无效数字警告,插入失败

执行文件插入数据库的操作时,出现警告 ORA-01722: 无效数字,文件未成功插入。

相关代码

数据库模型函数

public function NewDescriptor(int $type = OCI_DTYPE_LOB): OCILob|false
{
  return oci_new_descriptor($this->connection, $type);
}
public function Execute(int $mode = OCI_COMMIT_ON_SUCCESS): bool
{
        return oci_execute($this->statement, $mode);
}

文件模型的插入函数

public function insertFile(): bool
{
    $database = new Database();
    $database->Connect();
    $database->Parse('INSERT INTO table(
                      id_declaration_agression_file, 
                      nom_declaration_agression_file, 
                      taille_mo_declaration_agression_file, 
                      type_declaration_agression_file, 
                      blob_declaration_agression_file, 
                      id_declaration_agression_form
                  ) VALUES
                  (
                      :id,
                      :name,
                      :size,
                      :type,
                      EMPTY_BLOB(), 
                      :id_form
                  ) 
                  RETURNING blob INTO :blob'
    );

    $blob = $database->NewDescriptor(OCI_D_LOB);
    $database->BindByName(':id', $this->getId());
    $database->BindByName(':name', $this->getName());
    $database->BindByName(':size', $this->getSizeMo());
    $database->BindByName(':type', $this->getType());
    $database->BindByName(':id_form', $this->getIdForm());
    $database->BindByName(':blob', $blob, -1, OCI_B_BLOB);

    $database->Execute()) { 
    $database->Commit();
    $blob->free();
    $database->FreeStatement();
    $database->Close();
}

数据表结构

表中字段及类型如下:

  • ID_DECLARATION_AGRESSION_FILE:NUMBER类型,主键
  • NOM_DECLARATION_AGRESSION_FILE:VARCHAR2(255)类型
  • TAILLE_MO_DECLARATION_AGRESSION_FILE:NUMBER类型
  • TYPE_DECLARATION_AGRESSION_FILE:VARCHAR2(255)类型
  • BLOB_DECLARATION_AGRESSION_FILE:BLOB类型
  • ID_DECLARATION_AGRESSION_FORM:NUMBER类型,外键

问题排查与解决思路

ORA-01722错误核心是字符串与数字类型不匹配,结合你的代码和表结构,重点检查以下几点:

  1. 绑定参数类型匹配
    • 确认getId()、getSizeMo()、getIdForm()返回值为合法数字:若返回带非数字字符的字符串(比如"2.5MB"),Oracle自动转换会失败,需确保返回纯数值。
  2. 修正RETURNING子句字段名
    语句中RETURNING blob INTO :blob的字段名错误,表中对应字段是blob_declaration_agression_file,应改为:
    RETURNING blob_declaration_agression_file INTO :blob
    
  3. 修复PHP语法错误
    插入函数中$database->Execute()) {多了一个右括号,修复后补充逻辑:
    if ($database->Execute()) { 
        $database->Commit();
        $blob->free();
        $database->FreeStatement();
        $database->Close();
        return true;
    } else {
        $database->Close();
        return false;
    }
    
  4. 显式指定绑定参数类型
    绑定数字参数时显式声明类型,避免自动转换问题:
    $database->BindByName(':id', $this->getId(), -1, OCI_B_NUM);
    $database->BindByName(':size', $this->getSizeMo(), -1, OCI_B_NUM);
    $database->BindByName(':id_form', $this->getIdForm(), -1, OCI_B_NUM);
    

内容的提问来源于stack exchange,提问作者vh-dev-web

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:50:15