выберите * через dblink - PullRequest
2 голосов
/ 17 мая 2011

У меня возникли проблемы при попытке обновить таблицу с помощью циклического курсора, который выбирает из исходной таблицы через 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 @ DB2

Данные вставки получили неправильное значение.

Значение TEST_COL_A, как я и ожидал, должно быть 'A'.

Однако оно содержит значение NEW_COL, которое я добавляю в таблицу SOURCE.

И значениеиз TEST_COL_B содержит 'A'.

Кто-нибудь сталкивался с такой же проблемой?Похоже, оракул кэширует столбцы таблицы при компиляции.Есть ли способ добавить столбец в исходную таблицу без перекомпиляции?

1 Ответ

1 голос
/ 17 мая 2011

Согласно это :

Oracle Database не управляет зависимости между удаленной схемой объекты, кроме локальная процедура к процедуре дистанционной зависимостей.

Например, предположим, что локальное представление создается и определяется запросом, который ссылается на удаленную таблицу. Также предположим, что локальная процедура включает в себя SQL утверждение, которое ссылается на то же самое удаленный стол. Позже определение таблица изменена.

Поэтому местный вид и процедура никогда не отменяется, даже если представление или процедура используется после таблица изменена, и даже если представление или процедура теперь возвращает ошибки когда используется. В этом случае вид или Процедура должна быть изменена вручную, так что ошибки не возвращаются. В таком случаи, отсутствие управления зависимостями предпочтительнее ненужного перекомпиляции зависимых объектов.

В этом случае вы не видите ошибок, но причина та же. У вас также не будет проблем, если вы будете использовать явные имена столбцов вместо *, который в любом случае обычно безопаснее. Если вы используете *, вы не можете избежать перекомпиляции (если, я полагаю, * не является последним элементом в списке выбора, в этом случае любые дополнительные столбцы в конце не вызовут проблемы - пока их имена не конфликтуют).

...