【发布时间】:2011-05-17 13:42:14
【问题描述】:
我在尝试通过 dblink 从源表中选择的循环游标来更新表时遇到了一些麻烦。
我有两个数据库 DB1、DB2。
它们是两个不同的数据库实例。 我在 DB1 中使用以下语句:
CURSOR TestCursor IS
SELECT a.*, 'A' TEST_COL_A, 'B' TEST_COL_B
FROM rpt.SOURCE@DB2 a;
BEGIN
For C1 in TestCursor loop
INSERT into RPT.TARGET
(
/*The company_name and cust_id are select from SOURCE table from DB2*/
COMPANY_NAME, CUST_ID, TEST_COL_A, TEST_COL_B
)
values
(
C1.COMPANY_NAME, C1.CUST_ID, C1.TEST_COL_A , C1.TEST_COL_B
) ;
End loop;
/*Some code...*/
End
在我将“NEW_COL”列添加到 SOURCE table@DB2 之前,一切正常
插入数据的值错误。
正如我所料, TEST_COL_A 的值应该是 'A'。
但是,它包含我在 SOURCE 表中添加的 NEW_COL 的值。
并且 TEST_COL_B 的值包含 'A'。
有人遇到过同样的问题吗? 似乎 oracle 在编译时缓存了表列。 有什么方法可以在不重新编译的情况下向源表添加列?
【问题讨论】:
-
您没有尝试指定严格的列列表(a.COMPANY_NAME、a.CUST_ID)而不是 a.* 吗?
-
REMOTE_DEPENDENCY_MODE的设置是什么?它可以是SIGNATURE或TIMESTAMP,每个都会导致不同的问题;-) 另外使用*也不是一件好事,请尝试使用@heximal 提及的显式列名。 -
@amep:
REMOTE_DEPENDENCY_MODE仅适用于远程过程,不适用于表。 -
你试过在你的 SQL 中使用 NOCACHE 提示吗?好奇缓存是否是您的问题(?)
标签: oracle plsql cursor dblink