当我试图通过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“添加到源表@db2之前,一切都很正常。
插入数据的值不正确。
正如我所期望的,TEST_COL_A的值应该是'A‘。
但是,它包含我在源表中添加的NEW_COL的值。
并且TEST_COL_B的值包含'A‘。
有没有人遇到过同样的问题?它看起来像oracle在编译时缓存表列。有没有办法在不重新编译的情况下将列添加到源表中?
发布于 2011-05-17 22:31:44
根据this的说法
除了本地过程到远程过程的依赖关系之外,
Oracle数据库不管理远程模式对象之间的依赖关系。
例如,假设本地视图由引用远程表的查询创建和定义。还假设本地过程包含引用同一远程表的SQL语句。随后,该表的定义被更改。
因此,本地视图和过程永远不会失效,即使视图或过程在表更改后使用,即使视图或过程现在使用时返回错误也是如此。在这种情况下,必须手动更改视图或过程,以便不返回错误。在这种情况下,缺少依赖项管理比不必要地重新编译依赖对象更可取。
在这种情况下,您看不到错误,但原因是相同的。如果使用显式列名而不是*,也不会有问题,后者通常更安全。如果您正在使用*,则无法避免重新编译(除非,我想,*是选择列表中的最后一项,在这种情况下,末尾的任何额外列都不会造成问题-只要它们的名称不冲突)。
发布于 2019-12-21 09:10:53
我建议您在DB1中使用单个set processing insert语句,而不是每次使用一行游标for insert循环,例如:
INSERT into RPT.TARGET
select COMPANY_NAME, CUST_ID, 'A' TEST_COL_A, 'B' TEST_COL_B
FROM rpt.SOURCE@DB2
;基本原理:
select *构造是危险的。https://stackoverflow.com/questions/6031672
复制相似问题