database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38940 게시물 읽기
No. 38940
밑에 커서오류 이어서 문제..미치겠습니다.
작성자
박주영(vf19)
작성일
2011-10-05 19:10
조회수
4,753
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 해보는 방법인데 
 
이 방법도 오류가 안날것 같지는 않습니다. ..도대체 모가 문제인지 몇일쨰 
 
못풀겠네요. 문제점좀 알려주시면 감사하겠습니다.

 

이 글에 대한 댓글이 총 3건 있습니다.

프로시져 내에서 호출하는 각각의 프로시져에 문제가 있는게 아닌지요..

그부분도 한번 살펴보심이.. 

1님이 2011-10-06 10:33에 작성한 댓글입니다. Edit

다음 세가지 값이 대략 얼마 인지 궁금 합니다. 

 

max_cnt

res_array.Count

open_cursors  ... a parameter in init.ora

hopper(bunny)님이 2011-10-06 13:33에 작성한 댓글입니다.

 한참 다른걸 하다가 지금에서야 댓글 확인하네요 . 

프로시저 내에서 호출하는 함수가.. 있었군요 .. 지금에서야

그게 보이네요. 여기서도 FOR 문안에 커서가 쓰이는데 ;;;

그 부분을 수정해봐야겠습니다. 

max_cnt 값은 에러가 났을때는 2000개로 테스트 중이었습니다.

res_array count 값은 52021개 였구

오픈 커서수 제한은 300개로 했습니다.

박주영(vf19)님이 2011-10-06 18:04에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
38943암호화 대상 컬럼의 크기는 얼마나 잡아야되나요? [2]
흰자
2011-10-06
4104
38942컬럼을 나누면서 connect by를 하려는데요 [3]
ㅇㅇ
2011-10-06
5319
38941DELETE 관련 간단한 질문요 [4]
궁그미
2011-10-06
4005
38940밑에 커서오류 이어서 문제..미치겠습니다. [3]
박주영
2011-10-05
4753
38939pl/sql 최대 열기 커서 수 에러 도움 급합니다. [3]
박주영
2011-10-05
4216
38937댓글의 총 갯수 [2]
서유미
2011-10-05
5899
38936ORA-29275 오라클 캐릭터 셋 관련..... [1]
곽정호
2011-10-04
6073
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다