2017-02-09 2 views
0

У меня есть оператор обновления, который динамически генерируется внутри пакета.Oracle - Обновить столбец, только если источник не является нулевым.

мне нужно обновить target_field2 только тогда, когда source_field2 является NOT NULL, если NULL затем сохранить target_field2 как есть.

Надеюсь, что на это будет легко ответить. Это динамический раздел в беспокойстве:

    ELSIF cur_field_to_update.FIELD_NAME = 'SOURCE_FIELD2' 
       THEN 
        v_update_values := 
         v_update_values 
         || ', CASE WHEN NVL(''' 
         || data_cur.IND_TYPE 
         || ''', NULL) <> ''D'' THEN NULL ELSE TO_NUMBER(NVL(' 
         || cur_field_to_update.FIELD_NAME 
         || ',' 
         || TARGET_FIELD2 
         || ')) END'; 

который заканчивается похожий ..

UPDATE target_table 
SET (target_field1,target_field2) = 
(SELECT source_field1, 
CASE WHEN NVL('A',NULL) <> 'A' 
THEN NULL 
ELSE TO_NUMBER(NVL(source_field2,target_field2)) 
END 
FROM source_table); 
+1

ваш вопрос, кажется, не ясно, пожалуйста, напишите правильный образец данных и ожидаемый результат – scaisEdge

+0

я разместил первый ответ, дайте мне знать, если это WAHT вам нужно – scaisEdge

+0

попробовать эту таблицу обновления набора target_field2 = (случай, когда source_field2 является not null then 1 else target_field2) –

ответ

0

Если значение source_field находится в той же строке

update your_table 
set target_field2 = 'your_value' 
where source_field2 is not null 

;

или если значение сама source_field

update your_table 
set target_field2 = suorce_field2 
where source_field2 is not null 
1

Если вам нужно обновить одно поле, безусловно, но только обновить еще одно поле, если новое значение не равно нулю, то вы могли бы использовать NVL() выбрать между новым и старое значение:

update your_table set 
target_1 = source_1, 
target_2 = NVL(source_2, target_2) 
where ... 

При обновлении из отборного заявления, вы можете сделать что-то вроде этого:

update target_table set 
    (target_1, target_2) = (
    select source_1, 
      (NVL(source_2, 
       (select target_2 from target_table tt 
       where tt.target_key = key_value))) 
) 
where target_key = key_value; 

Предполагается, что target_key является уникальным ключом, поэтому мы обновляем одну и ту же запись.

Если у вас более сложная логика, переход на PL/SQL, вероятно, проще и менее подвержен ошибкам.

+0

. Отказ от ответственности: у меня нет базы данных Oracle, чтобы проверить ее; это должно быть правильным, но будьте осторожны. – 9000

+0

Не уверен, что это будет работать, когда я делаю обновление с помощью select. – user3224907

+0

Ваш оператор updte, как показано в сообщении, будет устанавливать для каждой строки таблицы одинаковые значения. Я пишу инструкцию обновления, которая теперь работает в строке. – 9000

0

Вот как я это сделал. Я загружаю существующие данные в переменные и делаю nvl против этих существующих данных.

PROCEDURE UpdateInventoryCheck(vCondition in varchar2, vQtyOH in number, 
          vQtyAvail in number, vSN in varchar2, vLoc in varchar2, 
          vConsignment in varchar2, vNotes in varchar2, 
          vInventoryID in number) AS 
cond varchar2(10); 
qtyOH number; 
qtyAvail number; 
sn varchar2(40); 
loc varchar2(15); 
consig varchar2(20); 
notes clob; 

BEGIN 

select  cond, qty_oh, qty_avail, serial_numb, loc, consignment, notes 
into  cond, qtyOH, qtyAvail, sn, loc, consig, notes 
from  qctl2.inventory_check 
where  inventory_id = vInventoryID; 

update  qctl2.inventory_check 
set   cond = nvl(vCondition, cond), 
      qty_oh = nvl(vQtyOH, qtyOH), 
      qty_avail = nvl(vQtyAvail, qtyAvail), 
      serial_numb = nvl(vSN, sn), 
      loc = nvl(vLoc, loc), 
      consignment = nvl(vConsignment, consig), 
      notes = nvl(vNotes, notes) 
where  inventory_id = vInventoryID; 
commit; 

END UpdateInventoryCheck; 
Смежные вопросы