Обновление в Oracle - PullRequest
       32

Обновление в Oracle

0 голосов
/ 24 декабря 2008

Мне нужно обновить поле комментариев в таблице для большого списка customer_ids. Комментарий должен быть обновлен, чтобы включить существующий комментарий и добавить некоторый текст и пароль, который находится в другой таблице. Я не совсем уверен, как это сделать.

Вот код, который делает это для одного идентификатора клиента. Как бы я поступил так для списка из более чем 100 идентификаторов клиентов? Моя первая мысль - создать временную таблицу и разместить там все идентификаторы клиентов, но я до сих пор не уверен, как ее кодировать после этого, поскольку customer_id используется в запросе дважды.

Update Contract
SET Contract_Comment= Contract_Comment || '; 12/29/2008 Password `' ||
(SELECT Password FROM WLogin WHERE default_customer_id='1234' ) ||'`'|| ' reinstated per Mickey Mouse;'
WHERE Customer_id='1234'

Ответы [ 3 ]

1 голос
/ 24 декабря 2008

Ну, если предположить, что у Contract_comment есть customer_id или его легко объединить с таблицей, в которой он есть ....

update contract c
set contract_comment = contract_comment || '; 12/29/2008 Password ' ||
(select password from WLogin w where w.default_customer_id = c.customer_id) ||''|| ' reinstated per Mickey Mouse;' WHERE Customer_id in (1234, 4567).

Или замените список в конце другим подвыбором ...

ГДЕ Customer_id в (выберите customer_id из ...).

0 голосов
/ 02 января 2009

Ответ Тодда, приведенный выше, будет хорошо работать с использованием предложения IN (или EXISTS, если вы храните идентификаторы во временной таблице. Я бы просто улучшил его следующим образом:

UPDATE contract c
   SET contract_comment = nvl2(contract_comment, contract_comment || '; ', '') || '12/29/2008 Password ' ||
                          NVL((SELECT PASSWORD
                                FROM wlogin p
                               WHERE p.default_customer_id = c.customer_id),
                              '<NULL>') || '' || ' reinstated per Mickey Mouse'
 WHERE EXISTS (SELECT 'x' FROM wlogin l WHERE l.default_customer_id = c.customer_id)

Это гарантирует, что 1) вы обрабатываете, если пароль пуст, и 2) обновляете только для клиентов с записью wlogin.

Не стесняйтесь добавлять что-то вроде:

AND EXISTS (SELECT 'y' FROM temp_ids_table t WHERE t.customer_id = c.customer_id)

Спасибо за кредит, который вы дали за эти правильные ответы.

  • Стью
0 голосов
/ 29 декабря 2008

Я согласен со всем, что сказал Тодд, и хочу добавить следующее.

Хотя это может быть неочевидно, он также (вероятно) исправил еще одну ошибку из вашей публикации, которая рассматривает поле customer_id как строку.

Помещая id в кавычки (по крайней мере, в вашем примере), вы заставляете Oracle либо преобразовывать все строки в строку перед сравнением, либо конвертировать предоставленные вами идентификаторы в целые числа - мне пришлось бы поэкспериментировать с определить действительные правила, которые будут применяться.

В любом случае, гораздо лучше быть согласованным с вашими типами данных и не оставлять их на усмотрение базы данных.

Вы указали, что предоставленный код предназначен для одного клиента. Убедитесь, что при развертывании этого кода в цикле вы используете переменные связывания, а не просто объединяете идентификатор клиента в создаваемый оператор SQL. Если вы делаете это в PL / SQL, то это делается для вас - на Java или другом языке вам придется делать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...