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错误核心是字符串与数字类型不匹配,结合你的代码和表结构,重点检查以下几点:
- 绑定参数类型匹配
- 确认
getId()、getSizeMo()、getIdForm()返回值为合法数字:若返回带非数字字符的字符串(比如"2.5MB"),Oracle自动转换会失败,需确保返回纯数值。
- 确认
- 修正RETURNING子句字段名
语句中RETURNING blob INTO :blob的字段名错误,表中对应字段是blob_declaration_agression_file,应改为:RETURNING blob_declaration_agression_file INTO :blob - 修复PHP语法错误
插入函数中$database->Execute()) {多了一个右括号,修复后补充逻辑:if ($database->Execute()) { $database->Commit(); $blob->free(); $database->FreeStatement(); $database->Close(); return true; } else { $database->Close(); return false; } - 显式指定绑定参数类型
绑定数字参数时显式声明类型,避免自动转换问题:$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
相关产品推荐
相关产品推荐

