nvl 에대해 질문드립니다. 0 4 1,167

by 불멸의용병 [Oracle 기초] nvl [2018.02.06 15:58:11]


저는 공장자동화 유지보수 업무를 담당하고 있습니다.

프로그램 수정을 위해 기존 프로그램을 분석하던 중 의문사항이 있어서 질문을 드립니다.

nvl(column, value)에서 항목 전자는 컬럼명으로 알고 있는데

nvl(1, 0)으로 되어있는부분이 있던데

[exec sql select nvl(1,0) into :dummy from coils_setp_auto where coil_id = :T_act_p->coil_id;]

컬럼이 1이 어떤의미 인지 문의좀 드리겠습니다.

coils_setp_auto 테이블을 조회 해보면 첫번째 컬럼은 coil_id 항목인데

위 쿼리의 dummy 항목과는 일치하지 않네요

미리 답변에대해 감사드립니다.

by 우리집아찌 [2018.02.06 17:21:53]

1. 오라클인가요?

2. PL-SQL 인가요?

3. exec sql <= 이것의 의미를 모르겠네요.


by 불멸의용병 [2018.02.06 17:45:42]

제가 미처 언급을 안했네요 proc 입니다


by 마농 [2018.02.06 17:31:06]

nvl(column, value) 만 가능한게 아니고
nvl(exp1, exp2) 로 생각하셔야 합니다.
exp 는 표현식이구요. 다양한 표현식이 올 수 있습니다.
표현식 : 컬럼, 상수, 변수, 내장함수, 사용자 함수, 서브쿼리 등등


nvl(1,0) 은 그냥 1 이죠. 의미 없이 사용된 거네요.
아마도 특정 의도를 가지고 사용한 것 인데
의도와는 다른 결과가 나온 것으로 잘못 사용한 예입니다.


추측되는 의도는 조건 검색 결과가 있으면 1 을 리턴하기 위한 것인데
조건 검색 결과가 없을 경우 0 을 리턴하기 위해 NVL 을 사용한 것인데요.
의도와는 다르게 실제로 검색결과가 없으면 0 이 리턴되지 않습니다.


nvl 은 null 을 다른 값으로 바꾸는 역할을 하는데
검색결과가 없으면 null 조차도 없습니다.
nvl 할 대상이 없는거죠.


검색 대상이 있는지를 체크하려면 단순하게 집계함수 count(*) 를 사용하면 됩니다.
SELECT COUNT(*) INTO :dummy FROM coils_setp_auto WHERE coil_id = :T_act_p->coil_id


by 불멸의용병 [2018.02.06 17:47:31]

대단히 감사합니다

많은 도움이 되었습니다.

제가 바꾸고 싶은 부분은 해당 부분이 아니라 다른부분을 수정하려고 분석중에 이해가 안되서 문의드렸습니다.

20년도 넘은 시스템이라 초짜인 제가 함부로 바꾸기가 어려워서요 ㅠ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입