V1
我在 Oracle 11g DB 中创建了一个可更新视图(它具有、和 的INSTEAD OF
触发器);它最初有一个查询,我将其移至另一个视图。这个另一个视图加入到我的视图中,使视图可以从 Oracle 更新。UPDATE
DELETE
INSERT
GROUP BY
V2
V1
V1
V1
我使用oracle_fdw从 Oracle 视图在 PostgreSQL 数据库中创建一个外部表;OPTIONS (key 'true')
为主键列设置。
我希望外部表可以更新,但我收到此错误:
与数据库同步数据时出错
原因:SQL-Fehler [HV00L]:错误:执行查询时出错:OCIStmtExecute 无法执行远程查询详细信息:ORA-02014:无法从具有 DISTINCT、GROUP BY 等的视图中选择 FOR UPDATE 从具有 DISTINCT、GROUP BY 等的
视图。
有没有办法告诉 oracle_fdw 允许更新外部表?如前所述,从 Oracle 方面UPDATE
来看,视图V1
工作得很好。
SELECT ... FOR UPDATE
(来自 Oracle 端)失败并出现相同的错误 ORA-02014。
SELECT FOR UPDATE
我想这可以归结为防止 oracle_fdw 在 ing 外部表时在视图上执行 a 操作UPDATE
,但文档似乎暗示这种逐行处理是由外部数据包装器设计的。
那么,有办法吗?或者我是否必须将INSTEAD OF
触发器放置在 PostgreSQL 端的视图上并且仅将 Oracle 基表映射为外部表?
不,那是不可能的。正如您正确提到的,这
UPDATE
发生在两个部分:首先,使用 获取主键列SELECT ... FOR UPDATE
,然后每个需要更改它的 rown 单独更新。理论上可以通过在第一(扫描)阶段执行更新并在第二阶段不执行任何操作来避免这种情况,但这并不是微不足道的,并且没有计划实现这一点。