안녕하세요. 현업에서 PostgreSQL 을 이용하여 시스템을 유지관리 하고 있는 사용자 입니다.
잘 사용하던 함수가 일부 제대로 작동되지않아 분석을 하는도중 전부 똑같은 현상을 보이더군요.
ERROR: 쿼리에 결과 데이터의 대상이 없음
HINT: SELECT의 결과를 취소하려면 대신 PERFORM을 사용하십시오.
CONTEXT: PL/pgSQL 함수 "indigo.fn_04_tb_bsi_hc_blk_m()" 의 145번째 SQL 문
********** Error **********
ERROR: 쿼리에 결과 데이터의 대상이 없음
SQL state: 42601
Hint: SELECT의 결과를 취소하려면 대신 PERFORM을 사용하십시오.
위와 같은 에러를 내뿜고는 insert 나 update 도중 스톱이 되어버립니다. 관련 테이블들 index 재작성, vacum 실행등을 해봐도..들어가가 에러가 발생합니다.
들어가는 데이터는 실행할때 마다 틀립니다. 실행하다보면 정상적으로 작동할떄도 있습니다. ㅡㅡ;; 이런 현상은 당최 외그럴까요..
------------------------------함수는 다음과 같이 작성하였습니다.
CREATE OR REPLACE FUNCTION indigo.fn_02_tb_bsi_bzdt_m()
RETURNS numeric AS
$BODY$
DECLARE
V_SEQ_NO NUMERIC := 0;
V_START_DT VARCHAR;
V1 RECORD;
V2 RECORD;
V_IS_CNT NUMERIC := 0;
V_DEL_IDX NUMERIC := 0;
V_DEL_CNT NUMERIC := 0;
V_INS_IDX NUMERIC := 0;
V_INS_CNT NUMERIC := 0;
V_TOT_CNT NUMERIC := 0;
V_GEO_CNT NUMERIC := 0;
QUERY_STR VARCHAR;
LPPA_CBND VARCHAR;
V_TYPE VARCHAR;
BEGIN
/* BSI_사업지구_기본 */
/* Data Log 번호 조회 */
SELECT SEQ_NO INTO V_SEQ_NO FROM 테이블 WHERE TABLE_NM = '테이블이름';
/* 시작일시 */
SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') INTO V_START_DT FROM DUAL;
/* 삭제 레코드 수 */
SELECT COUNT(*) INTO V_DEL_CNT FROM 테이블 WHERE EAI_CNNT_DS_CD = 'D';
/* 입력 레코드 수 */
SELECT COUNT(*) INTO V_INS_CNT FROM 테이블 WHERE EAI_CNNT_DS_CD <> 'D';
RAISE NOTICE '테이블명 : BSI_사업지구_기본';
RAISE NOTICE '총 삭제건수 : %', V_DEL_CNT;
RAISE NOTICE '총 입력건수 : %', V_INS_CNT;
RAISE NOTICE '삭제시작 !';
/* 연계 데이터 조회 - 삭제 */
FOR V1 IN SELECT 컬럼,
컬럼1,...
FROM 테이블
WHERE EAI_CNNT_DS_CD IN('D')
LOOP
/* 삭제처리 */
DELETE
FROM 테이블
WHERE BZDT_CD = V1.BZDT_CD;
V_DEL_IDX := V_DEL_IDX + 1;
RAISE NOTICE '삭제처리 : %', V_DEL_IDX || '/' || V_DEL_CNT;
END LOOP;
RAISE NOTICE '삭제종료 !';
RAISE NOTICE '입력시작 !';
/* 연계 데이터 조회 - 삭제 외 */
FOR V2 IN SELECT 컬럼
,컴럼1...
FROM 테이블
WHERE EAI_CNNT_DS_CD <> 'D'
ORDER BY EAI_CNNT_NO
LOOP
/* 데이터 존재여부 체크 */
SELECT COUNT(*)
INTO V_IS_CNT
FROM 테이블
WHERE BZDT_CD = V2.BZDT_CD;
/* 수정처리 */
IF V_IS_CNT > 0 THEN
UPDATE 테이블
SET 컬럼 = V2.컬럼 ...
WHERE 컬럼 = V2.컬럼;
V_INS_IDX := V_INS_IDX + 1;
V_TYPE := 'U';
/* 입력처리 */
ELSE
INSERT
INTO 테이블(컬럼,...)VALUES (V2.컬럼,...);
V_INS_IDX := V_INS_IDX + 1;
V_TYPE := 'I';
END IF;
RAISE NOTICE '입력처리 : %', V_INS_IDX || '/' || V_INS_CNT || ' (' || V_TYPE || ')';
END LOOP;
RAISE NOTICE '입력종료 !';
/* 전체 처리 개수 */
SELECT COUNT(*)
INTO V_TOT_CNT
FROM 테이블;
/* 처리 로그 기록 */
UPDATE 테이블
SET 컬럼 = V_START_DT
,컬럼1 = TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS')
,컬럼2 = V_INS_CNT
,컬럼3 = V_DEL_CNT
,컬럼4 = V_TOT_CNT
WHERE 컬럼5 = V_SEQ_NO;
RETURN V_TOT_CNT;
/* 에러처리 */
EXCEPTION
/* 중복에러 */
WHEN DUP_VAL_ON_INDEX
THEN SELECT indigo.FN_SAVE_DATA_ERROR_LOG(V_START_DT, V_SEQ_NO);
/* 그밖의 에러 */
WHEN OTHERS
THEN SELECT indigo.FN_SAVE_DATA_ERROR_LOG(V_START_DT, V_SEQ_NO);
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION indigo.fn_02_tb_bsi_bzdt_m()
OWNER TO indigo;
--------------------------------------------------------------------------------------------------------- |