Oracle обновляет и изменяет несколько записей столбцов в двух таблицах одним запросом - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть две таблицы с именами местоположений и стран в базе данных My Oracle. Таблица местоположений содержит столбцы с именами location_id (fk), street_address, state_province и country_id. В таблице стран есть столбцы с именами country_name, country_id, location_id (fk). Я хочу обновить некоторые столбцы таблицы местоположений и стран в одном запросе. Я сделал это с помощью запроса ниже, но он не работает.

update (select l.street_address, l.postal_code, l.city, l.state_province, c.country_name 
 from hr.countries c, hr.locations l where l.country_id = c.country_id ) 
 set l.street_address = '147 Spadina Ave',
       l.postal_code = '122000215',
       l.city = 'Toronto',
       l.state_province = 'Ontario',
       c.country_name = 'US'
 where l.location_id = 1200;

но я столкнулся с ошибкой из PL / SQL (ORA-00911: недопустимый символ).

, пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Эта ошибка, ORA-00911: недопустимый символ не имеет ничего общего с вашим оператором обновления и может исходить из другой части вашего PL / SQL?

Что на самом деле не так с вашим заявлением об обновлении, так это то, что вы не можете обновить более одной таблицы через встроенное представление. Итак, если вы удалите псевдоним l в предложении set и запустите оператор, вы должны получить ORA-01776: невозможно изменить более одной базовой таблицы через представление объединения

Однако вы можете сделать это, используя INSTEAD OF TRIGGER с view.

В вашем случае, поскольку вы обновляете таблицы на основе заданного первичного ключа (location_id = 1200), выполнение этих двух простых обновлений должно быть в порядке. Нет необходимости в соединениях

UPDATE hr.locations
SET street_address = '147 Spadina Ave',
    postal_code = '122000215',
    city = 'Toronto',
    state_province = 'Ontario'
WHERE location_id = 1200;


UPDATE hr.countries
SET country_name = 'US' -- Toronto in United states, how did that happen?
WHERE country_id IN ( SELECT country_id
                       FROM hr.locations
                       WHERE location_id = 1200
                     );
0 голосов
/ 10 ноября 2018

Попробуйте это:

    UPDATE hr.locations l
set l.street_address = '147 Spadina Ave',
    l.postal_code = '122000215',
    l.city = 'Toronto',
    l.state_province = 'Ontario',
    l.country_name = 'US'
WHERE l.location_id = 1200
AND EXISTS( SELECT   '1'
            FROM hr.countries c
        WHERE l.country_id = c.country_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...