存在性檢查是經常使用的一個數據庫操作,然而在實際工作中,作者發現很多人並沒有在意這一點,DB的存在性檢查寫的很隨意,並不規範。
本篇博客列出了DB檢查的常見錯誤寫法,並給出了ABAP進行DB的存在性檢查的常用方式。
1.常見錯誤
請看下面代碼:
DATA: lv_count TYPE i,
ls_sflight TYPE sflight.
SELECT COUNT(*) FROM sflight
INTO lv_count WHERE carrid = 'LH'.
IF lv_count > 0.
WRITE: 'exist'.
ELSE.
WRITE: 'not exist'.
ENDIF.
這是最常見的一種錯誤寫法,通過COUNT(*)來檢查數據是否存在。但是,如果並不需要統計數據的數目,那麼就不要引入額外的DB數據運算!!在DB數量巨大時,這樣的一種寫法會對程序的性能產生明顯的影響。
類似的,下面的代碼中,錯誤地混淆了COUNT(*)和UP TO n ROWs的用法,使用下面這種方式進行存在性檢查也是錯誤的。
SELECT COUNT(*) FROM sflight
UP TO 1 ROWS
INTO lv_count WHERE carrid = 'LH'.
2.正確寫法
在指定檢查條件的前提下,直接使用UP TO 1 ROWS。如果有數據返回,則說明存在;否則即不存在。
DATA: lv_count TYPE i,
ls_sflight TYPE sflight.
SELECT * FROM sflight
INTO ls_sflight UP TO 1 ROWS
WHERE carrid = 'LH'.
ENDSELECT.
IF sy-subrc = 0.
WRITE: 'exist'.
ELSE.
WRITE: 'not exist'.
ENDIF.
或者,當檢查某一字段是否存在時,可進一步明確字段名稱。
DATA: lv_count TYPE i,
ls_sflight TYPE sflight.
SELECT carrid FROM sflight
INTO ls_sflight-carrid
UP TO 1 ROWS
WHERE carrid = 'LH'.
ENDSELECT.
IF sy-subrc = 0.
WRITE: 'exist'.
ELSE.
WRITE: 'not exist'.
ENDIF.
3.小結
在對DB進行存在性檢查時,應使用最精簡的程序邏輯完成需求,不要自增複雜度。