如果记录存在返回其ID,则尝试基于reference_no有效地检查记录是否存在,如果没有,则插入并返回新ID。
也许MERGE不是要走的路?
无法弄清楚语法!
create or replace FUNCTION get_note_history_id(
p_owner_id VARCHAR2, --to insert to the note history table
p_open_date DATE, --to insert to the note history table
p_note_log CLOB, --to insert to the note history table
p_collection_id VARCHAR2, --not to break the previous code
p_reference_no NUMBER --correlates to the notice (date) sent)
)
return VARCHAR2 is
v_note_history_id NUMBER
MERGE INTO NOTE_HISTORY n
USING(
select NOTE_HISTORY_ID
from NOTE_HISTORY
where p_reference_no = n.notice_reference_no
) h
WHEN MATCHED THEN
v_note_history_id := h.NOTE_HISTORY_ID;
WHEN NOT MATCHED THEN
INSERT INTO NOTE_HISTORY (create_user_id,create_date,note,collection_id,notice_reference_no)
VALUES (p_owner_id,p_open_date,p_note_log,p_collection_id,p_reference_no) returning NOTE_HISTORY_ID into v_note_history_id;
RETURN v_note_history_id;
END get_note_history_id;
答案 0 :(得分:1)
你的方法有几个问题。 MERGE是纯粹的SQL构造,因此我们不能在其中包含PL / SQL代码。此外,MERGE不支持RETURNING子句(这很烦人)。
所有这些意味着您需要实施老式的UPSERT。您可以尝试UPDATE并切换到no_data_found
上的INSERT或带INSERT的前导并切换到dup_val_on_index
上的UPDATE。决定应该基于普遍的路径:如果你期望主要匹配首先更新UPDATE,主要是错过去INSERT。如果您对notice_reference_no
(tsk,tsk)没有唯一约束,则无论如何都需要使用UPDATE。
虽然你实际上没有在WHEN MATCHED手臂上更新任何东西,但是简单的查找就足够了:
create or replace FUNCTION get_note_history_id(
p_owner_id VARCHAR2, --to insert to the note history table
p_open_date DATE, --to insert to the note history table
p_note_log CLOB, --to insert to the note history table
p_collection_id VARCHAR2, --not to break the previous code
p_reference_no NUMBER --correlates to the notice (date) sent)
)
is
v_note_history_id number;
begin
begin
select n.note_history_id
into v_note_history_id
from NOTE_HISTORY n
where n.notice_reference_no = p_reference_no ;
exception
WHEN no_data_found THEN
INSERT INTO NOTE_HISTORY (create_user_id,create_date,note,collection_id,notice_reference_no)
VALUES (p_owner_id,p_open_date,p_note_log,p_collection_id,p_reference_no)
returning NOTE_HISTORY_ID into v_note_history_id;
end;
return v_note_history_id;
end;
/
作为一项规则,我不喜欢使用Exception块来处理实际上正常的业务处理,但其他方法甚至更不优雅。