Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2010, 17:13   #1
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
Счастье Pl/sql Не обновлять поле если переменная пустая

Добрый день!
Интересный вопрос.
PL/SQL.
В процедуре много входящик переменных. По дефолту они NULL.
В теле процедуры делаю update беря все значения с этих же входящих переменных.
Вопрос: можно ли как-то в самом update не обновлять те поля переменные на которых равны NULL?

Например:
update name_table set col1=Name,
col2=Name2, -- NULL
col3=name3;
Можно ли обновить все столбцы кроме col2?
Не хочется делать перед обновлением проверки типа if col2 is not null then
У меня просто очень много входящих.
Спасибо!
Получил помощь — отблагодарил.
GenniY вне форума Ответить с цитированием
Старый 22.10.2010, 20:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну можно рискнуть формировать строку с запросом, а потом эту строку обработать на лету - динамическим запросом.
Не помню как в Оракле это называется что-то типа exec immediate
I'm learning to live...

Последний раз редактировалось Stilet; 22.10.2010 в 20:50.
Stilet вне форума Ответить с цитированием
Старый 22.10.2010, 20:43   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Если не ошибаюсь, в PL/SQL существует возможность выполнить произвольную строчку кода, сформированную тут же, в хранимой процедуре.
Код:
execute immediate 'update Table1 set '||TuTVsePolya;
формируйте строчку где update'ся только нужные поля.
Хотя, конечно, в конечно итоге будет последовательно столько проверок if Параметер is null
сколько у Вас параметров.
Но тут простое copy-paste спасёт..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.10.2010, 14:56   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

да не нужно никакой динамики
просто пишите через nvl
Код:
update your_table
set 
  field1 = nvl(pField1, field1),
  field2 = nvl(pField2, field2),
  field3 = nvl(pField3, field3),
  etc..
where 0=0
    and field_pk = pField_pk
soleil@mmc вне форума Ответить с цитированием
Старый 24.10.2010, 12:48   #5
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
По умолчанию

Цитата:
да не нужно никакой динамики
просто пишите через nvl
Код:


update your_table
set
field1 = nvl(pField1, field1),
field2 = nvl(pField2, field2),
field3 = nvl(pField3, field3),
etc..
where 0=0
and field_pk = pField_pk
Спасибо за ответ! ТО что нужно!
Получил помощь — отблагодарил.
GenniY вне форума Ответить с цитированием
Старый 24.10.2010, 13:06   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
просто пишите через nvl
Логично. Или
Код:
update your_table
set
field1 = decode(pField1,null,field1,pField1),
Если не ошибаюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.10.2010, 13:24   #7
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
По умолчанию

Цитата:
Код:


update your_table
set
field1 = decode(pField1,null,field1,pField1) ,

Если не ошибаюсь.
Да. Это тоже подходит. Спасибо.
Получил помощь — отблагодарил.
GenniY вне форума Ответить с цитированием
Старый 24.10.2010, 13:28   #8
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
По умолчанию

Оказывается NVL работает быстрее.
Получил помощь — отблагодарил.
GenniY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi7 поле Memo, если изменилось - выполнить действие bad_patefa Помощь студентам 2 15.09.2010 16:15
Не обновлять внешние ссылки при вводе istoe Microsoft Office Excel 4 29.01.2010 13:05
Если y – вещественная переменная, а n – целая, то оператор присваивания какой будет иметь вид? Naruto63 Помощь студентам 6 23.11.2009 16:30
Написать программу в результате выполнения которой булевская переменная t получает true если выполняется Корделия Общие вопросы C/C++ 1 28.04.2009 13:53
если поле Patr пусто или null то пустую строку возвращает azat БД в Delphi 5 01.02.2008 13:05