현상
LAG 및 LEAD 내장 함수의 offset 파라미터에 숫자가 아닌 NULL 값을 입력하면, 쿼리 결과 대신 TBR-11005 오류가 발생합니다.
TBR-11005: Specified value '-E+125' is invalid for mathematical function argument(s).
at line 1, column 45 of null:
SELECT TABLE_NAME, NUM_ROWS, LAG(NUM_ROWS, NULL, 0)
--수행쿼리1: 명시적 offset 파라미터 NULL 값 수행 시
SQL> SELECT TABLE_NAME, NUM_ROWS,
LAG(NUM_ROWS, NULL, 0) OVER (PARTITION BY OWNER ORDER BY NUM_ROWS) AS LROW
FROM DBA_TABLES;
--수행쿼리2: DECODE 문에 해당 하지 않는 값으로 인해 offset 파라미터 NULL 인자로 수행 시
SQL> SELECT TABLE_NAME, NUM_ROWS,
LAG(NUM_ROWS, DECODE(OWNER, 'SYS', 1, 'TIBERO',2), 0) OVER (PARTITION BY OWNER ORDER BY NUM_ROWS) AS LROW
FROM DBA_TABLES;
SQL
복사
LAG(expr, offset, default)
•
LAG 함수는 자기 자신과 조인하지 않고도, 하나의 테이블 내에서 여러 개의 로우를 동시에 참조할 수 있는 분석 함수입니다.
•
지정된 offset만큼 현재 로우 기준으로 앞에 위치한 로우의 값에 접근할 수 있습니다.
LEAD(expr, offset, default)
•
LEAD 함수 역시 별도의 조인 없이, 동일 테이블 내의 여러 로우를 동시에 참조할 수 있도록 하는 분석 함수입니다.
•
지정된 offset만큼 현재 로우 기준으로 뒤에 위치한 로우의 값에 접근할 수 있습니다.
원인
offset 파라미터에 음수 값이 들어가는 것을 방지하기 위해 offset과 number_zero를 비교하는 로직을 사용하고 있었으나, NULL과 number_zero를 비교하여 에러가 발생하였습니다.
해결
NULL 인 경우 별도 처리하도록 쿼리를 변경합니다.
--NULL 인 경우 해당 ROW값으로 출력 되도록 우회
SELECT TABLE_NAME, NUM_ROWS,
LAG(NUM_ROWS, NVL(NULL,0), 0) OVER (PARTITION BY OWNER ORDER BY NUM_ROWS) AS LROW
FROM DBA_TABLES;
--DECODE에 해당하는 데이터와 해당하지 않는 데이터 구분하여 조회 (DECODE에 해당하지 않는 조건은 3번째 인자인 default 파라미터 출력)
SELECT TABLE_NAME, NUM_ROWS,
LAG(NUM_ROWS, DECODE(OWNER, 'SYS', 1, 'TIBERO',2), 0) OVER (PARTITION BY OWNER ORDER BY NUM_ROWS) AS LROW
FROM DBA_TABLES
WHERE OWNER IN ('SYS','TIBERO')
UNION ALL
SELECT TABLE_NAME, NUM_ROWS,
0 AS LROW
FROM DBA_TABLES
WHERE OWNER NOT IN ('SYS','TIBERO')
;
SQL
복사