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 38966 게시물 읽기
No. 38966
커서 최대열기 오류수 질문
작성자
박주영(vf19)
작성일
2011-10-14 10:42
조회수
5,353

 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 루프문 안에 커서 사용이 없는데 
왜 오류가 나는지는 모르겠네요 . 조언좀 해주시면 감사하겠습니다.
 
이 글에 대한 댓글이 총 2건 있습니다.

오라클 함수들도 cursor를 사용할 수 있읍니다.  BEGIN/EXCEPTION/END 블록들을 추가해서, 어디에서 에러가 나는지 살펴보는 것이 좋을 것 같읍니다. 

hopper(bunny)님이 2011-10-14 12:47에 작성한 댓글입니다.
이 댓글은 2011-10-14 12:48에 마지막으로 수정되었습니다.

 그렇군요. 오라클 함수들도 커서를 사용할 수도 있겠군요. 

함수들 사이사이로 exception 처리를 해봐야겠습니다.

박주영(vf19)님이 2011-10-14 14:02에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
38970테이블스페이스말고 테이블단위로 복원이되나요? [2]
임서희
2011-10-14
3654
38969fuction 생성시 질문입니다. [4]
초보
2011-10-14
3694
38967결과값에 따라서 새로운 값으로 변경 [2]
qa
2011-10-14
3605
38966커서 최대열기 오류수 질문 [2]
박주영
2011-10-14
5353
38963view table 생성 SQL문 만드는 방법 질문 [1]
jazzsir
2011-10-13
4376
38962Oracle Audit 기능에 대해 질문있습니다. [2]
DBA
2011-10-13
4729
38961dblink로 연결한 session의 상태를 확인하는 방법은? [2]
아름다운이
2011-10-13
8831
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다