1) SELECT * INTO TABLE izsdtpont FROM zsdtpont
WHERE kunnr IN s_kunnr
AND zusipnt IN s_zusi
AND zusepnt IN s_zuse
AND zsumpnt IN s_zsum.
2) SELECT kunnr name1 into (izsdtpont-kunnr, izsdtpont-name1)
FROM zsdtpont
WHERE kunnr in s_kunnr
AND zusipnt in s_zusi
AND zusepnt in s_zuse
AND zsumpnt in s_zsum.
ENDSELECT.
1번과 2번은 같은 값을 읽는 select문입니다.
그러나 질문이 있습니다. 스탑을 걸어서 검사를 해본 결과 1)번은 헤더에 있는 값을 바디까지 알아서 들어가고요
2번은 헤더에 머무르고 바디에 들어가지 않습니다.
그래서
2) SELECT kunnr name1 into (izsdtpont-kunnr, izsdtpont-name1)
FROM zsdtpont
WHERE kunnr in s_kunnr
AND zusipnt in s_zusi
AND zusepnt in s_zuse
AND zsumpnt in s_zsum.
MODIFY IZSDTPONT.
ENDSELECT.
하니까 에러가 나네여 실행후 에러요.. 컴파일 에러 말구요
왜그러는거에요??
ㅜ,.ㅠ
댓글 13
-
원니컴
2008.06.18 05:51
-
지의
2008.06.18 17:10
2. 번에서 덤프 떨어지는 이유는
Internal Table( 이하 itab ) 에 데이타가 없는 상태에서 modify 를 사용하게 되어서 해당 itab 에 key 값에 맞는
변경할 데이타가 없어서 덤프 떨어지는겁니다.
즉, 저 부분에서는 append 를 사용하셔야 됩니다.
수고하세요.
-
SD2
2008.06.18 17:28
감사합니다..
그래서 2)번을 1)번과 같은 방식으로 endselect를 없애고 실행해보니 또 에러가 나는 이유가 무엇이에요?
궁금하네요 ^^
-
페리
2008.06.18 17:50
2)번은 loop 형식으로 되어 있는거라서 endselect로 꼭 닫아주셔야해요.
select single kunnr name1 into (izsdtpont-kunnr, izsdtpont-name1)....... 로 시작되면
한개의 값만 가져오는거라서 endselect는 필요 없게되고요.
-
SD2
2008.06.18 18:05
SELECT SINGLE은 1건의 데이터만 가져오잖아여..
그래서 1번과 2번의 다른점은 1)번은 전체를 받아서 통째로 넣는거구
2)번은 필드를 지정해서 넣는거구요
근데 필드를 지정해서 넣으면 꼭 ENDSELECT로 해줘야 하는 건가요?
ARRAY PATCH가 안되고요?
-
페리
2008.06.18 18:16
필드를 지정해서 넣으면 꼭 endselect가 아니라 데이타를 가져올때 into 로 해주시면 한번에 하나씩 가져오게 되요.
지금 select올려주신거 보면 where조건에 만족한 값이 10개가 있다면 10번을 돌겠죠?
그래서 루프형식으로 돌게 되어서 endselect를 써주셔야해요.
한번에 가져오고 싶으시면 select kunnr name1 into corresponding fields of table izsdtpont..... 로 해주시면
izsdtpont의 kunnr name1필드에 한번에 쭉들가요.
-
SD2
2008.06.18 18:26
그렇군요!! 감사합니다..
ENDSELECT로 닫아 주는것보다 수행능력면에서 INTO CORRESPONDING FIELDS OF TABLE IZSDTPONT가 좋겠죠?
복잡하고 어려워요 ㅜ,.ㅠ 두리 똑같은 거져? 나오는 데이터가요..?? endselect랑 corre..
-
페리
2008.06.18 18:33
넵 최대한 DB에 왔다 갔다 하는건 부하가 걸리기 때문에 별로 추천해주진 않아요. 적은양의 데이타라면 그다지 차이는 없지만요 ㅎㅎ
차라리 DB에 있는 데이타를 INTO COREESPONDING FIELDS OF TABLE ITAB으로 가져와서
LOOP 돌면서 READ TABLE ITAB 형식으로 쓰거나 FOR ALL ENTRIES IN 을 사용하시는게 좋아요 ~
-
SD2
2008.06.18 18:34
가급적 IT에 데이터를 담으시고 그 데이터를 가지고 가공하는 방법으로 하시는게 좋습니다.<<endselect도
루핑을 좀 많이 돌려 it에 담는거 아니에여?
-
페리
2008.06.18 18:42
endselect를 사용하게되면 10000건일때 DB에 10000번을 왔다 갔다해서 비추에요.
가급적 IT에 데이터를 담으시고 그 데이터를 가지고 가공하는 방법으로 하시는게 좋습니다<-이건 아에 한번에 INTO CORRESPONDING로 IT에 데이타를 담아오시고 메모리상에서 IT를 처리하기때문에 더 효율적이지요
-
SD2
2008.06.18 18:50
정말 감사합니다..
^^*
-
멍ㄱㅔ
2008.06.23 23:43
저도 좋은 정보 얻었네여..감사합니다.
-
Chaconne
2010.05.31 18:21
입문자로 많은 것을 배워갑니다.
1번은 array patch라고 하구요 2번은 select endselect방식입니다.
차이점이라고 하면 읽는 방식에는 차이가 없습니다. 다만 디비 부하의 문제가 있기 때문에 1번 방식을 추천해 드립니다.
예를 들어서 데이터가 100건이면 위의 방식은 디비한번 접속해서 1번만 select 를 날립니다. 하지만 2번은 100번의 select를 하게되죠.
어떤게 빠르고 응답속도가 빠른지는 금방아시겠죠.. 다만 1번은 인터널 테이블에 담는 형식이고 2번은 그냥 읽는 방법일 뿐입니다.
1번과 2번을 같게 할려면 append izsdtpont를 하시면 되겠죠.
modify izsdtpont에서 에러나는건 아마도 키값이 설정되어 있지 않아서 그럴겁니다.
읽어오는 테이블값중에 디비키값도 같이 읽어와서 modify시키시면 덤프가 떨어지지 않을거에요.
그럼 수고하세요.