BEGIN
DECLARE TYPE curType is REF CURSOR;
cnt_cur curType;
net_mem VARCHAR2(100);
node_tbname VARCHAR2(30);
cnt_query VARCHAR2(100);
res_array SDO_NUMBER_ARRAY;
res_string VARCHAR2(1000);
res_numeric NUMBER;
max_cnt NUMBER;
strERR varchar2(200);
strERRCode varchar2(20);
BEGIN
net_mem := i_net_mem;
node_tbname := i_net_mem ||'_NODE$';
cnt_query := 'SELECT COUNT(NODE_ID) FROM '||node_tbname||'';
DBMS_OUTPUT.PUT_LINE(cnt_query);
--FOR LOOP 문 돌리기위해서 노드 테이블 개수 가져오기
OPEN cnt_cur FOR cnt_query;
LOOP
EXIT WHEN cnt_cur%NOTFOUND;
FETCH cnt_cur INTO max_cnt;
END LOOP;
CLOSE cnt_cur;
--네트워크 메모리 최대사이즈 지정(2GB)
SDO_NET_MEM.SET_MAX_MEMORY_SIZE(2036870912);
--네트워크 메모리에 올리기
SDO_net_mem.NETWORK_MANAGER.READ_NETWORK(net_mem, 'TRUE');
FOR SLIST IN 1..max_cnt LOOP
FOR ELIST IN 1..max_cnt LOOP
res_string := SDO_NET_MEM.NETWORK_MANAGER.IS_REACHABLE(net_mem,SLIST,ELIST);
IF(SLIST!=ELIST) THEN
IF(res_string='TRUE') THEN
--ALL_PATH 함수 설정부분(네트워크이름,시작노드,끝노드,네트워크깊이제한,코스트제한,구하는경로수)
res_array := GET_ALLPATH(net_mem,SLIST,ELIST,9999999,9999999,1);
--메모리상 경로에 추가하고 DB 경로에 저장 부분
FOR indx IN res_array.FIRST..res_array.LAST
LOOP
res_numeric := res_array(indx);
sdo_net_mem.network.add_path(net_mem, res_numeric);
SDO_NET_MEM.NETWORK_MANAGER.WRITE_NETWORK(net_mem);
END LOOP;
END IF;
END IF;
END LOOP;
END LOOP;
SDO_NET_MEM.NETWORK_MANAGER.DROP_NETWORK(net_mem);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK ;
-- 오류내역 저장
strErr := SQLERRM ;
strErrCode :=to_char(SQLCODE);
INSERT INTO TMP_ERROR
VALUES (
'ALL_PATH생성', SYSDATE, strErrCode, strErr, i_net_mem);
COMMIT;
SDO_NET_MEM.NETWORK_MANAGER.DROP_NETWORK(net_mem);
END;
PL/SQL 문은 위와 같습니다. 문제점은 최대 커서 오류 에러가 자꾸 난다는 것입니다.
이전에도 올렸던 질문인데, 이전과 달리 소스 수정을 해서
FOR 문 안에서 커서를 쓰는 것은 모두 제외했고, 커서를 사용하는 것은 FOR 루프문 돌리기
위한 갯수 가져오는 처음에 한번 뿐이 없습니다. 그것도 한번 사용하고 커서를 닫았구요 .
SDO~~ 로 시작하는 함수들은 모두 오라클 네트워크 모델링에 관련된 함수들입니다.
GET_ALLPATH 라는 함수 역시 안에 오라클 네트워크 모델링 함수 뿐이 없구요 .
FOR 루프문을 돌리는 개수가 10000 * 10000 정도 되면 돌리는 도중에 최대 커서열기수
오류가 납니다. 에러 원인은 역시 커서겠지만, FOR 루프문 안에 커서 사용이 없는데
왜 오류가 나는지는 모르겠네요 . 조언좀 해주시면 감사하겠습니다.
|