编写Oracle函数,检查记录是否存在,如果不将其合并到同一个表中

时间:2017-07-11 14:54:20

标签: oracle function merge

如果记录存在返回其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;                

1 个答案:

答案 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块来处理实际上正常的业务处理,但其他方法甚至更不优雅。