create or replace
PROCEDURE ALL_PATH AS
net_mem VARCHAR2(100);
res_string VARCHAR2(1000);
cost_result VARCHAR2(30);
origin_cost_result VARCHAR2(30);
cost NUMBER;
res_numeric NUMBER;
res_array SDO_NUMBER_ARRAY;
res_array1 SDO_NUMBER_ARRAY;
indx NUMBER;
indx1 NUMBER;
max_cnt NUMBER;
var1_array SDO_NUMBER_ARRAY;
BEGIN
net_mem := 'TEST';
FOR get_maxcnt IN (SELECT COUNT(NODE_ID) mcnt FROM TEST_NODE$) LOOP
max_cnt := get_maxcnt.mcnt;
END LOOP;
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
--DBMS_OUTPUT.PUT_LINE(SLIST.NODE_ID || '노드가' || ELIST.NODE_ID ||'노드까지 도달할수 있나?'|| res_string);
IF(res_string='TRUE') THEN
cost_result := SET_COST(net_mem,ELIST,99);
--DBMS_OUTPUT.PUT_LINE(cost_result);
res_array := SDO_NET_MEM.NETWORK_MANAGER.ALL_PATHS(
net_mem => 'TEST'
,start_node_id => SLIST
,goal_node_id=> ELIST
,depth_limit => 9999999
,cost_limit => 9999999
,no_of_solutions => 5
,constraint => null
);
--DBMS_OUTPUT.PUT_LINE('ALL PATH구하기');
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;
origin_cost_result := SET_ORIGIN_COST(ELIST);
--DBMS_OUTPUT.PUT_LINE(origin_cost_result);
END IF;
END IF;
END LOOP;
END LOOP;
SDO_NET_MEM.NETWORK_MANAGER.DROP_NETWORK(net_mem);
EXCEPTION
WHEN OTHERS THEN
SDO_NET_MEM.NETWORK_MANAGER.DROP_NETWORK(net_mem);
END ALL_PATH;
밑에 올렸던 글 문제로 이것저것 다 해보다가 댓글달아주신 분에 방법을
보기 전에 생각한 방법으로 한번 돌려봤습니다. 혹시나 해서 모든 sql 문을
위에 올렸구요 . 이전 방법이랑 다른 점이라면 FOR 문안에 넣었던 커서를
아예 빼버렸습니다. 어차피 가져오는 게 1부터 차례대로 증가하는 수라
max 값으로 아이디 하나 가져오고 1부터 아이디까지 차례대로 증가하면
똑같은 형태라서 변형했습니다.
문제는 이렇게 MAX 값 가져오는 쿼리 제외하고 FOR 문 안에 커서를 다 빼버렸음
에도 불구하고 이전에 있던 것보다는 좀더 오래 돌지만 결국엔 최대 열기 커서수
초과 에러가 난다는 것입니다.
이제 남은 방법은 명시적 커서로 선언하고 close 해보는 방법인데
이 방법도 오류가 안날것 같지는 않습니다. ..도대체 모가 문제인지 몇일쨰
못풀겠네요. 문제점좀 알려주시면 감사하겠습니다.
|