存在性检查是经常使用的一个数据库操作,然而在实际工作中,作者发现很多人并没有在意这一点,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进行存在性检查时,应使用最精简的程序逻辑完成需求,不要自增复杂度。