2011-05-17 52 views
2

當嘗試通過循環遊標從源表通過dblink選擇來更新表時遇到了一些麻煩。select * throgh dblink問題

我有兩個數據庫DB1,DB2。

它們是兩個不同的數據庫實例。 我正在使用DB1此聲明如下:

CURSOR TestCursor IS 
    SELECT a.*, 'A' TEST_COL_A, 'B' TEST_COL_B 
    FROM [email protected] 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'。

但是,它包含了我在SOURCE表中添加的NEW_COL的值。

而且TEST_COL_B的值包含'A'。

有沒有人遇到同樣的問題? 看起來oracle在編譯時會緩存表列。 有沒有什麼辦法可以將列添加到源表中而無需重新編譯?

+2

你沒有嘗試指定嚴格的列列表(a.COMPANY_NAME,a.CUST_ID)而不是。*? – heximal 2011-05-17 13:51:28

+0

['REMOTE_DEPENDENCY_MODE'](http://psoug.org/reference/db_link.html)設置了什麼?它可以是'SIGNATURE'或'TIMESTAMP',每個都會引起不同的問題;-)另外使用'*'不是一件好事,請嘗試顯式的列名作爲@heximal所提到的。 – arnep 2011-05-17 14:12:22

+0

@amep:'REMOTE_DEPENDENCY_MODE'只適用於遠程過程,不適用於表格。 – 2011-05-17 14:34:31

回答

1

根據this

Oracle數據庫不遠程模式 對象比 本地程序到遠程過程 依賴其他中管理 依賴性。

例如,假設本地視圖 由 引用遠程表的查詢創建並定義。同樣假設 本地過程包括引用相同的 遠程表的SQL 語句。後來, 表的定義被改變了。

因此,本地視圖和 過程永遠不會失效,即使 如果視圖或過程中使用的表被改變 之後,並在使用時即使 視圖或過程會返回錯誤 。在這種情況下,必須手動更改視圖或 過程,因此 不會返回錯誤。在這種情況下,缺少依賴管理 優於不必要的 依賴對象的重新編譯。

在這種情況下,您看不到錯誤,但原因是相同的。如果您使用明確的列名稱而不是*,那麼通常也會更安全,您也不會遇到問題。如果您使用的是*,則無法避免重新編譯(除非,我想*是選擇列表中的最後一項,在這種情況下,最後的任何額外列都不會導致問題 - 只要它們的名稱沒有衝突)。

+2

+1,「select *」是邪惡的。 – DCookie 2011-05-17 14:36:32

+0

感謝您的幫助!這些是我們數據庫中的一些現有代碼,現在我認爲是時候更改代碼了。 :p – starwilly 2011-05-17 15:49:05