У меня довольно слабое понимание какой-либо более продвинутой функциональности оракула, но я думаю, что это возможно.
Допустим, у меня есть таблица со следующей схемой:
MyTable
Id INTEGER,
Col1 VARCHAR2(100),
Col2 VARCHAR2(100)
Я хотел бы написать sproc со следующим
PROCEDURE InsertOrUpdateMyTable(p_id in integer, p_col1 in varcahr2, p_col2 in varchar2)
Что, в случае обновления, если значение в p_col1, p_col2 равно нулю, не будет перезаписывать Col1, Col2 соответственно
Итак, если у меня есть запись:
id=123, Col1='ABC', Col2='DEF'
exec InsertOrUpdateMyTable(123, 'XYZ', '098'); --results in id=123, Col1='XYZ', Col2='098'
exec InsertOrUpdateMyTable(123, NULL, '098'); --results in id=123, Col1='ABC', Col2='098'
exec InsertOrUpdateMyTable(123, NULL, NULL); --results in id=123, Col1='ABC', Col2='DEF'
Есть ли простой способ сделать это без нескольких операторов SQL?
Я думаю, что мог бы быть способ сделать это с помощью оператора Merge, хотя я только немного знаком с ним.
EDIT:
Cade Roux ниже предлагает использовать COALESCE, который прекрасно работает! Вот несколько примеров использования coalesce kewyord.
И вот решение моей проблемы:
MERGE INTO MyTable mt
USING (SELECT 1 FROM DUAL) a
ON (mt.ID = p_id)
WHEN MATCHED THEN
UPDATE
SET mt.Col1 = coalesce(p_col1, mt.Col1), mt.Col2 = coalesce(p_col2, mt.Col2)
WHEN NOT MATCHED THEN
INSERT (ID, Col1, Col2)
VALUES (p_id, p_col1, p_col2);