簡體   English   中英

Oracle SQL,如果未運行,則在內部插入語句

[英]Oracle SQL, Insert statement inside if not running

因此,我正在嘗試創建一個小型的Oracle APEX應用程序,使人們可以在診所預約。 我制定了負責預約的程序。 該應用程序具有一個表,該表用於保存有關約會對象的數據以及一個約會表。 該過程將檢查用戶是否已經在患者表中,如果該用戶已經在患者表中,則應在約會表中添加一行,否則還將其添加到患者表中。

select COUNT(p.name) INTO da FROM patients p where p.cnp = cnp;
IF (da = 0) then
    insert into patients values(cnp,name,surname,sex,birth_date,phone_no,email);  
end if;
insert into appointments values(appointment_sequence.nextval,cnp,id_medic,date,time);

問題在於它永遠不會運行if子句中的插入。 即使患者不在數據庫中,它也會跳到第二個插入位置,這會產生錯誤,因為未創建約會表(cnp)的前鍵。

這個問題很可能是在標識符范圍內。 我猜想您的程序有一個參數(cnp),與患者表中的列同名。 因為您沒有限定查詢中的參數引用(即where p.cnp = procedure_name.cnp ),所以Oracle認為您在該列等於該列的行之后(即where p.cnp = p.cnp )意味着您在除非表中沒有行,否則永遠不會得到0的計數。

為避免此問題,您可以在引用參數時對其進行限定(建議使用PL / SQL產品經理Bryn Llewellyn推薦的參數),也可以更改參數的名稱(例如,更改為p_cnp類的p_cnp )。

說了這么多,只計算一下是否需要插入就很浪費時間。 當您只插入記錄並捕獲dup_val_on_index錯誤(假設您定義了主鍵/唯一鍵!您有,對嗎?)還是改用merge語句,為什么為什么只查詢表以進行下一步插入呢? 您應該力求完成盡可能少的工作,以構建高性能的代碼。

我可能會進行合並,例如:

merge into patients tgt
  using (select procedure_name.cnp from dual) src
    on tgt.cnp = src.cnp
when not matched then
  insert (tgt.cnp, tgt.name, ....)
  values (src.cnp, procedure_name.name, ....);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM