테스트 때문에 여러번 썼다 지우게 되네요...
일단, 제가 틀렸습니다. 정확하지 못한 정보 드린점 사과드립니다.
특히 좋은 글 들아주신 테라스님께 죄송하단 말씀 드립니다.
제가 기억하고 있던 결과와 그 당시의 테스트를 제가 정확히 기억하고 있지 못했고, 잘못 알고 있었습니다.
일단, ABAP에서 사용할 때는 타입에 크게 구애받지 않고
initial, ' ', '', '0' 등이 동일하게 적용되는 것으로 판단됩니다.
테스트 코드는 아래의 1번 입니다.
다음으로 테스트한 것은 - 제가 잘못 알고 있게된 근거? 입니다. -
natvie sql을 사용한 것입니다.
별 차이 없지만 fail이 나타납니다.
실데이터는
ZCHAR ZNUM
' ' <- 공백 한개 0000
입니다.
아래는 소스 코드 입니다. 보시고, 잘못 코딩한 것은 짚어 주시면 좋겠습니다.
개인적으로는 다시 잘못된 것을 바로 잡아 좋긴 합니다만...
다른 분들께 틀린 정보를 제공하게 되어서 무척 죄송합니다.
REPORT z_val_type .
START-OF-SELECTION.
DATA: lv_cha(4) TYPE c,
lv_num(4) TYPE i.
CLEAR: lv_cha, lv_num.
IF lv_cha = ' '.
WRITE:/ 'space'.
ENDIF.
IF lv_cha = ' '.
WRITE:/ 'four space'.
ENDIF.
IF lv_cha IS INITIAL.
WRITE:/ 'initial'.
ENDIF.
IF lv_cha = ''.
WRITE:/ 'two quotation'.
ENDIF.
IF lv_cha = space.
WRITE:/ 'SPACE'.
ENDIF.
* BREAK-POINT.
WRITE:/ .
IF lv_num = ' '.
WRITE:/ 'space'.
ENDIF.
IF lv_num = ' '.
WRITE:/ 'four space'.
ENDIF.
IF lv_num IS INITIAL.
WRITE:/ 'initial'.
ENDIF.
IF lv_num = ''.
WRITE:/ 'two quotation'.
ENDIF.
IF lv_num = space.
WRITE:/ 'SPACE'.
ENDIF.
CLEAR: lv_cha, lv_num.
WRITE:/.
WRITE:/'By OPEN SQL'.
WRITE:/.
SELECT SINGLE zchar INTO lv_cha
FROM ztypetest
WHERE znum = ' '.
IF sy-subrc = 0.
WRITE:/ '[num filed 0] = '' '' => success'.
ELSE.
WRITE:/ '[num filed 0] = '' '' => fail'.
ENDIF.
WRITE:/.
SELECT SINGLE zchar INTO lv_cha
FROM ztypetest
WHERE znum = ''.
IF sy-subrc = 0.
WRITE:/ '[num filed 0] = '''' => success'.
ELSE.
WRITE:/ '[num filed 0] = '''' => fail'.
ENDIF.
WRITE:/.
SELECT SINGLE zchar INTO lv_cha
FROM ztypetest
WHERE zchar = ' '.
IF sy-subrc = 0.
WRITE:/ '[char filed '' ''] = '' '' => success'.
ELSE.
WRITE:/ '[char filed '' ''] = '' '' => fail'.
ENDIF.
WRITE:/.
SELECT SINGLE zchar INTO lv_cha
FROM ztypetest
WHERE zchar = ''.
IF sy-subrc = 0.
WRITE:/ '[char filed '' ''] = '''' => success'.
ELSE.
WRITE:/ '[char filed '' ''] = '''' => fail'.
ENDIF.
WRITE: /.
WRITE:/'By NATIVE SQL'.
EXEC SQL.
select zchar into :lv_cha
from ztypetest
where zchar = ' '
and ROWNUM <= 1.
ENDEXEC.
IF sy-subrc = 0.
WRITE:/ '[char filed '' ''] = '' '' => success'.
ELSE.
WRITE:/ '[char filed '' ''] = '' '' => fail'.
ENDIF.
WRITE: /.
EXEC SQL.
select zchar into :lv_cha
from ztypetest
where zchar = ' '
and ROWNUM <= 1.
ENDEXEC.
IF sy-subrc = 0.
WRITE:/ '[char filed '' ''] = '' '' => success'.
ELSE.
WRITE:/ '[char filed '' ''] = '' '' => fail'.
ENDIF.
저도 정확히 알고 답변드린게 아니고 몇가지 테스트 해본 결과로만 답변드린거라서 민망하네요 ㅎㅎ
정군님께서 올려주신 소스로 테스트 해본결과 DB에 저장될때 케릭터 타입의 변수는 SPACE로 저장되는게 아닌가 생각됩니다.
NATIVE SQL 을 사용해보면 공백이 1칸일때만 데이터를 읽어오고 그 이외에는 데이터를 못읽어 오더군요.
ST05에서 트레이스 로 확인해보면 SQL Statement 부분이 OPEN SQL과 차이가 있는데 그것때문에
OPEN SQL에서는 SPACE, '', ' '등을 사용해도 데이터를 읽어올 수 있지만
NATIVE SQL에서는 ' '만 데이터를 읽어 올 수 있는게 아닌가 생각됩니다.
트레이스 결과를 올리고 싶은데 파일첨부 하는 방법을 몰라서 못올리고 있네요 ^^;;