【发布时间】:2019-02-03 07:07:09
【问题描述】:
我们有一个(!)客户将 Oracle CLOB 字段设置为 NULL 失败,原因是
[FireDAC][Phys][Ora] ORA 22275 - Invalid LOB locator specified
发送到数据库的查询*是
update tt_hrs set
TT_INFO = ?
where
TT_HRS_ID = ?
Params:
0 - : <NULL>
1 - : 276727
通过 FireDAC 查询数据集显示 lDataset.Fields[i].DataType 字段 TT_HRS 是 ftWideMemo。
我在互联网上找到的许多东西都与更新您使用的 CLOBS 的“旧方式”(Oracle 8.0.5 IIRC)有关
UPDATE ClobTable
SET
Value = EMPTY_CLOB()
WHERE
Id = :Id
RETURNING
Value
INTO
:Value
但 AFAIK 不再需要此类语句。
在 SQLPLUS 中,我可以在我们自己的 Oracle 12c 数据库上毫无问题地执行这些操作,因此 the difference between EMPTY_CLOB() and NULL 似乎无关紧要:
update tt_hrs set tt_info='test' where tt_hrs_id=276727;
update tt_hrs set tt_info=NULL where tt_hrs_id=276727;
update tt_hrs set tt_info=empty_clob() where tt_hrs_id=276727;
- 如错误消息所示,我们在 Delphi Tokyo 10.2.2 中使用 FireDAC 32 位 Windows 应用。
- 该字段没有 NOT NULL 约束,它不在索引中, 没有触发器。
- 客户端使用 OracleDB12 Release 1。
- 我们的更新代码由 FireDAC 从 TClientDataSet 生成 连接到用户编辑的网格。
问题:
Oracle 设置中有什么可以解释这种行为吗?
也许他们设置了一些“兼容模式”来支持旧应用程序之类的……我对 Oracle 还不够熟悉。
注意:这绝不会与 2 字节字符 I reported earlier 的问题有关吗?
在这里抓着稻草......
* 我们可以记录这一点,因为我们有一个 TDataSetProvider 后代记录正在被覆盖的 DoBeforeExecute 中发送的内容。
【问题讨论】:
标签: oracle delphi clob firedac delphi-10.2-tokyo