首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过dblink选择*

通过dblink选择*
EN

Stack Overflow用户
提问于 2011-05-17 21:42:15
回答 2查看 5.2K关注 0票数 2

当我试图通过dblink循环游标从源表中选择时,我遇到了一些麻烦。

我有两个数据库DB1,DB2。

它们是两个不同数据库实例。我在DB1中使用了以下语句:

代码语言:javascript
复制
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在编译时缓存表列。有没有办法在不重新编译的情况下将列添加到源表中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-17 22:31:44

根据this的说法

除了本地过程到远程过程的依赖关系之外,

Oracle数据库不管理远程模式对象之间的依赖关系。

例如,假设本地视图由引用远程表的查询创建和定义。还假设本地过程包含引用同一远程表的SQL语句。随后,该表的定义被更改。

因此,本地视图和过程永远不会失效,即使视图或过程在表更改后使用,即使视图或过程现在使用时返回错误也是如此。在这种情况下,必须手动更改视图或过程,以便不返回错误。在这种情况下,缺少依赖项管理比不必要地重新编译依赖对象更可取。

在这种情况下,您看不到错误,但原因是相同的。如果使用显式列名而不是*,也不会有问题,后者通常更安全。如果您正在使用*,则无法避免重新编译(除非,我想,*是选择列表中的最后一项,在这种情况下,末尾的任何额外列都不会造成问题-只要它们的名称不冲突)。

票数 1
EN

Stack Overflow用户

发布于 2019-12-21 09:10:53

我建议您在DB1中使用单个set processing insert语句,而不是每次使用一行游标for insert循环,例如:

代码语言:javascript
复制
INSERT into  RPT.TARGET 
select COMPANY_NAME, CUST_ID, 'A' TEST_COL_A, 'B' TEST_COL_B
FROM rpt.SOURCE@DB2
;

基本原理:

  1. 集合处理几乎总是比一次一行的处理性能更好,这是真正的一次慢处理。
  2. Set处理插入是一种可扩展的解决方案。如果应用程序需要扩展到数万行或数百万行,则每次行的解决方案不太可能进行扩展。
  3. 此外,由于您遇到的原因和其他类似原因,使用select *构造是危险的。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6031672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档