반응형

출처 : http://openhunis.tistory.com/


[Oracle] 오라클 Table/Index Analyze 통계 확인 및 실행방법

ANALYZE란?

ANALYZE는 인덱스, 테이블, 클러스터의 통계정보를 생성 한다.

ANALYZE가 생성한 통계정보들은 비용기준(Cost-based)의 옵티마이저가 가장 효율적인 실행계획을 수립하기 위해 최소비용을 계산할 때 사용 된다.

각 오브젝트의 구조를 확인하는 것과 체인(Chain) 생성 여부를 확인할 수 있으므로 시스템의 저장공간 관리를 도와준다.

ANALYZE는 다음과 같은 통계정보를 생성하여 데이터 사전에 저장 한다.
  • - 테이블 : 총 로우의수, 총 블럭의 수, 비어있는 블럭에 쓰여질 수 있는 빈 공간의 평군, 체인이 발생된 로우의 수, 로우의 평균 길이
  • - 인덱스 : 인덱스의 깊이(Depth), Leaf block의 개수, Distinct Key의 수, Leaf Blocks/Key의 평균, Data blocks/key의 평균, Clustering Factor, 가장 큰 key 값, 가장 작은 key 값
  • - 컬럼 : Distinct한 값의 수, 히스토그램 정보
  • - 클러스터 : Cluster Key당 길이의 평균
문법

object-clause : TABLE, INDEX, CLUSTER중에서 해당하는 오브젝트를 기술하고 처리할 오브젝트 명을 기술 한다.

operation : operation 옵션에는 다음 3가지중 한가지 기능을 선택할 수 있다.

  • COMPUTE : 각각의 값들을 정확하게 계산 한다. 가장 정확한 통계를 얻을 수 있지만 처리 속도가 가장 느리다.
                        (테이블에 저장되어 있는 모든 행을 대상으로 통계정보를 수집한다.)
  • ESTIMATE : 자료사전의 값과 데이터 견본을 가지고 검사해서 통계를 예상 한다. COMPUTE보다 덜 정확 하지만 처리속도가 훨씬 빠르다
                        (오라클 서버의 자동화 알고리즘에 의해 데이터를 추출하여 통계정보를 수집한다.)
  • DELETE : 테이블의 모든 통계 정보를 삭제 한다
                     (수집되어 있는 통계정보를 삭제한다.)

정보수집

주기적인 ANALYZE 작업을 수행 시켜 주어야 한다.

테이블을 재생성 하거나, 새로 클러스터링을 한 경우, 인덱스를 추가하거나 재생성한 경우, 다량의 데이터를 SQL이나 배치 애플리케이션을 통해 작업한 경우 ANALYZE를 수행 시켜 주는 것이 좋다.

사용자는 USER_TABLES, USER_COLUMNS, USER_INDEXS, USER_CLUSTER 등의 자료사전 뷰를 통해 정보를 확인할 수 있다

테이블을 ANALYZE 시킨다면 거기에 따르는 인덱스들도 같이 실시하는 것이 좋다.


오라클에서는 20,000건 이하의 행수를 가진 데이터에 대해서는 COMPUTE STATISTICS절의 사용을 권장하며 20,000건 이상되는 경우에는 ESTIMATE STATISTICS절의 사용을 권장하고 있다. 또한, 통계정보의 분석은비 일과시간에 수행하는게 원칙이며 일과 시간에 수행해야 하는 경우라면 ESTIMATE STATISTICS절의 사용을 권장한다.



테이블 정보수집 예제
SQL> ANALYZE TABLE emp COMPUTE STATISTICS ;

새로운 정보를 구하기 전에 기존 정보를 삭제
SQL> ANALYZE TABLE emp DELETE STATISTICS;


특정 column에 대한 data 분포 수집
SQL> ANALYZE TABLE emp COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;


통계 정보의 확인 예제

 SQL> SELECT NUM_ROWS
, BLOCKS
, EMPTY_BLOCKS
, AVG_SPACE
, CHAIN_CNT
, AVG_ROW_LEN
, SAMPLE_SIZE
, LAST_ANALYZED
FROM USER_TABLES
WHERE TABLE_NAME = 'CMS_CATEGORY';
 
SQL> SELECT NUM_DISTINCT
, DENSITY
, LOW_VALUE
, HIGH_VALUE
, LAST_ANALYZED
, COLUMN_NAME
FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'CMS_CATEGORY';
 
오라클을 통해 작업할 시
insert시점에서 정상적으로 인덱싱이 되지 않는 경우가 발생한다.
특히 결합인덱스를 많이 사용하고 있는 경우 발생될 확률이 높다.
 
이런경우 오라클의 Analyzed를 통해서 해결이 가능하고
어느정도의 실행속도를 향상 시킬 수있다.
(실제 오라클사에서도 3개월에 한번씩은 Analyze를 실행하라 권고하고 있다.)
 

[Analyzed 확인 방법]
1-1. 테이블 통계정보
SELECT TABLE_NAME
     , BLOCKS  
-- 해당 데이터가 저장되어 있는 블록 수.
     , NUM_ROWS  -- 데이터 행 수.
     , AVG_ROW_LEN  -- 하나의 행의 평균 길이.
     , TO_CHAR( LAST_ANALYZED, 'YYYYMMDD' )
  FROM USER_TABLES
[WHERE TABLE_NAME = '테이블명']

1-2. 테이블 통계정보
SELECT TABLE_NAME
          , COLUMN_NAME  
-- 컬럼명
          , LOW_VALUE       -- 해당 컬럼에 저장되어 있는 최소값.
          , HIGH_VALUE      -- 해당 컬럼에 저장되어 있는 최대값.
          , NUM_DISTINCT   -- 유일한 값의 수. (히스토그램 기준)
  FROM USER_TAB_COLUMNS
[WHERE TABLE_NAME = '테이블명']

2. 인덱스 통계정보
SELECT INDEX_NAME
     , BLEVEL                        
-- 인덱스의 깊미(Depth)
     , LEAF_BLOCKS              -- 리프 블록의 수.
     , DISTINCT_KEYS            -- 인덱스 컬럼의 유일한 값의 수.
     , CLUSTERING_FACTOR  -- 조건을 만족하는 데이터를 검색할 때 인덱스 키 값이 각 블록에 얼마나 잘 분산 저장되어 있는지를 나타내는 정도.
     , NUM_ROWS                 -- 전체 행수.
     , TO_CHAR( LAST_ANALYZED, 'YYYYMMDD' )
  FROM USER_INDEXES
 
ex) SELECT TABLE_NAME
                , NUM_ROWS
                , TO_CHAR( LAST_ANALYZED, 'YYYYMMDD' )
      FROM USER_TABLES;
TABLE_NAME                       NUM_ROWS TO_CHAR(
------------------------------ ---------- --------
ABS_TYPE                               38 20040101
ANNIVERS                              183 20040101
APPRFLDRHISTORY                       570 20040101
APPRFOLDER                          16885 20040101
APPRFOLDER_ERR                       3670 20040101
APPRFORM                              359 20040101
.
.
.
USR_INFO_ADMIN                          0 20040101
VAR_DEPT_INFO                           0 20040101
VIEW_TYPE                               0 20040101
WASTEBOX                                0 20040101
ZIP_CODE                            44195 20040101
252 rows selected.
 
※ 참고 : desc user_tables 에서 보통 num_rows 로도 확인 가능
             
 
[특정 Table만 Analyze 하는 방법]
 
ANALYZE TABLE DOCUMENT COMPUTE STATISTICS
ex) DOCUMENT Table 만 Analyze
 
ANALYZE INDEX XPKDOCBOX COMPUTE STATISTICS
ex) XPKDOCBOX Index 만 Analyze
 
[전체 Table Analyze 하는 간단한 방법]
 
1. vi analyze_all.sql
    SELECT 'analyze table || table_name || estimate statistics;' FROM USER_TABLES
 
2. @analyze_all.sql
 
3. set heading off
     set echo off
     set feedback off
     set pagesize 300  (line 이 300 미만일 경우)
     spool analyze_table.sql
     /
     spool off
 
4. vi analyze_table.sql
    필요없는 Line 제거 및 정리
 
5. @analyze_table.sql
 

[전체 Index Analyze 하는 간단한 방법]
 
1. vi analyze_all.sql
    SELECT 'analyze index || index_name || estimate statistics;' FROM USER_INDEXES
 
2. @analyze_all.sql
 
3. set heading off
     set echo off
     set feedback off
     set pagesize 300  (line 이 300 미만일 경우)
     spool analyze_index.sql
     /
     spool off
 
4. vi analyze_index.sql
    필요없는 Line 제거 및 정리
 
5. @analyze_index.sql

 

===========================================================================================================================
===========================================================================================================================

 

출처 : http://blog.naver.com/vxxv122?Redirect=Log&logNo=130128144052

 

정의

→ 비용기반 옵티마이저에서 통계정보를 모아주기 위한 튜닝 도구.

    테이블과 인덱스, 클러스터, 컬럼에 대한 통계정보를 수집.

권한

→ Analyze Any 시스템 권한

통계 수집

1 . 테이블

→ Analyze Table 테이블명 Compute Statistics;

* Row수, 사용된 Block수, 사용안된 Block수, 사용가능한 평균공간, 변경된 Row수, 컬럼당 distinct 값수

  컬럼당 두번째로 가장 작은 값, 컬럼당 두번째로 가장 큰 값

   (질문) 왜 두번째로 가장 작은값과 큰값을 ?

2 . 인덱스

→ Analyze Index 인덱스명 Estimate Statistics;

* 인덱스 레벨, 레벨 Block수, distinct Key수, Key당 Leaf와 Data Block수 평균, Clustering Factor, 최소 Key 값

  최대 Key값

3 . 클러스터

→ Analyze Cluster 클러스터명 Delete Statistics;

* Cluster Key당 길이의 평균

4 . 컬럼

→ Analyze Table 테이블명 Compute Statistics For Table;

→ Analyze Table 테이블명 Compute Statistics For Columns 컬럼명 Size 75;

→ Analyze Table 테이블명 Compute Statistics For All Indexed Columns Size 75;

* 디볼트 버켓 수는 75개

  Distinct 한 값의 수, 히스토그램 정보

유효성 검사

→ Analyze Table 테이블명 Validate Structure [Cascade];

* 검사하려는 테이블과 관련된 모든 테이블을 검사하려면 Cascade 옵션 사용.

옵션

1 . Compute

→ 테이블에 저장되어 있는 모든 행을 대상으로 통계정보 수집

2 . Estimate

→ 오라클 서버의 자동화 알고리즘에 의해 데이터를 추출하여 통계정보를 수집

3 . Delete

→ 수집되어 있는 통계정보를 삭제

* 20,000건 이하의 Row는 Compute 권장, 이상은 Estimate 권장.

확인

1 . User_Tables

2 . User_Tab_Columns

3 . User_Indexes, Index_Stats, Index_histogram

4 . User_Cluster

5 . DBA_Analyze_Objects


 


===========================================================================================================================
===========================================================================================================================



출처 : http://www.oracleclub.com/article/23928

 

1. 개요
- TABLE, COLUMN, 그리고 INDEX 에 대한 통계 정보를 수집 하게 하는 PROCEDURE
 
2. SYNTAX 
DBMS_STATS.GATHER_TABLE_STATS (OWNNAME          VARCHAR2, 
                               TABNAME          VARCHAR2, 
                               PARTNAME         VARCHAR2 DEFAULT NULL,
                               ESTIMATE_PERCENT NUMBER   DEFAULT TO_ESTIMATE_PERCENT_TYPE 
                                                                            (GET_PARAM('ESTIMATE_PERCENT')), 
                               BLOCK_SAMPLE     BOOLEAN  DEFAULT FALSE,
                               METHOD_OPT       VARCHAR2 DEFAULT GET_PARAM('METHOD_OPT'),
                               DEGREE           NUMBER   DEFAULT TO_DEGREE_TYPE(GET_PARAM('DEGREE')),
                               GRANULARITY      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'), 
                               CASCADE          BOOLEAN  DEFAULT TO_CASCADE_TYPE(GET_PARAM('CASCADE')),
                               STATTAB          VARCHAR2 DEFAULT NULL, 
                               STATID           VARCHAR2 DEFAULT NULL,
                               STATOWN          VARCHAR2 DEFAULT NULL,
                               NO_INVALIDATE    BOOLEAN  DEFAULT  TO_NO_INVALIDATE_TYPE (
                                                                 GET_PARAM('NO_INVALIDATE')),
                               FORCE            BOOLEAN DEFAULT FALSE);

 

3. PARAMETER 설명
- DBMS_STATS.SET_PARAM 에 의해서 디폴트 파라미터 설정 변경이 가능하다.
- 수동 통계정보 생성 시에 저정을 하지 않았을 때 적용되는 DEFAULT 값에 영향을 미치는 값
    => CASCADE
    => DEGREE
    => ESTIMATE_PERCENT
    => METHOD_OPT
    => NO_INVALIDATE
    => GRANULARITY
- 자동 통계정보(GATHER_STATS_JOB) 시에만 영향을 미친다.
    => AUTOSTATS_TARGET [ AUTO   : ORACLE이 자동으로 대상 OBJECT 결정, 
                          ALL    : 대상 시스템의 모든 OBJECTS
                          ORACLE : SYS/SYSTEM OBJECT 만 ]

 

1) DEFAULT 값 확인
    SELECT DBMS_STATS.GET_PARAM('METHOD_OPT') FROM DUAL ;

 

    DBMS_STATS.GET_PARAM('METHOD_OPT')
    ----------------------------------
    FOR ALL COLUMNS SIZE AUTO
 
2) DEFAULT 값 변경 
    EXECUTE DBMS_STATS.SET_PARAM('METHOD_OPT', 'FOR ALL COLUMNS SIZE 1') ;

 

    PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
 
3) 변경된 DEFAULT 값 확인

    SELECT DBMS_STATS.GET_PARAM('METHOD_OPT') FROM DUAL ;

 

    DBMS_STATS.GET_PARAM('METHOD_OPT')
    ---------------------------------- 
    FOR ALL COLUMNS SIZE 1
    

Parameter

Description

OWNNAME분석할 테이블 소유자
TABNAME테이블 이름
PARTNAME파티션 이름, 지정 하지 않으면 NULL 값
ESTIMATE_PERCENT- 분석할 Row의 Percentage, NULL 이면 Compute(Row 전체)
- 유효값은 1/1000000 ~ 100 
- 디폴트로, DBMS_STATS.AUTO_SAMPLE_SIZE 에 의해서 최적의 값을 결정
BLOCK_SAMPLE- random block sampling or random row sampling 결정
- random block sampling 이 좀더 효과적이다.
- 데이터의 블록 별 분포도가 안좋을 시에는 부적절한 정보 생성
- 디폴트 값이 False로, random row sampling 을 수행한다.
METHOD_OPT- Histogram 생성시 사용하는 옵션
    * FOR ALL [ INDEXED | HIDDEN ] COLUMNS [ size_clause ]
    * FOR COLUMN [ size clause ] column | attribute [size clause] [, column|attribute [ size clause ]…]
- Size_clause := SIZE { integer | REPEAT | AUTO | SKEWONLY }
    => Integer  : Histogram Bucket 수, Max 는 1,254
    => REPEAT   : 이미 Histogram 이 있는 칼럼에 대해서만 생성
    => AUTO     : 데이터 분산도와 칼럼 부하 정도에 따라서 생성 결정
    => SKEWONLY : 데이터 분산도에 따라서 생성 결정
- 디폴트 값은 FOR ALL COLUMNS SIZE AUTO 이다.
- 즉, Histogram 의 생성여부를 Oracle 이 알아서 판단하게 된다.
- 이 경우 EX) method_opt => FOR ALL COLUMNS SIZE 1
    => 모든 컬럼에 대해서 Histogram bucket 의 수를 1로 한다.
      즉, 컬럼 내에 존재하는 여러 가지 값들의 cardinality 는 모두 동일한 값으로 간주한다. ( histogram 을 사용하지 않는다.) 
      이것은 where 조건에 들어오는 특정 컬럼에 대한 값의 변화에 따라서 PLAN 이 변경될 가능성을 없애고자 함이다.
- FOR ALL COLUMNS SIZE 1 로 설정하여 Histogram 정보가 생성되지 않도록 조치 한다.
DEGREE- 병렬처리 정도
- 디폴트 값은 NULL 이고, CREATE TABLE, ALTER TABLE 시 설정된 DEGREE 값에 의해 정해진다.
- AUTO_DEGREE 값은 병렬처리 정도를 자동으로 결정한다.
- 이것은 1 or DEFAULT_DEGREE [ Object Size 와 CPU Count 에 의해 결정 ]
GRANULARITY- Parition table 에 대한 분석시 사용
    => ‘ALL’                  : Global, Partition, Subpartition 통계정보 수집 – Parition Table 대상
    => ‘AUTO’                 : 디폴트 값으로 ,Partition Type 에 따라서 결정 – 일반 Table 대상
    => ‘DEFAULT’              : Global, Partition 통계정보 수집, Old Version 과 호환을 위해 사용
    => ‘GLOBAL’               : Global 통계정보 수집
    => ‘GLOBAL AND PARTITION’ : SubPartition 에 대한 통계정보는 수집되지 않는다.
    => ‘PARTITION’            : Partition 통계정보 수집
    => ‘SUBPARTITION’         : SubPartition 통계정보 수집
CASCADE- 대상 테이블의 인덱스에 대한 통계수집 여부
- 인덱스 통계정보는 병렬처리가 불가능하다.
- TRUE : 대상 테이블에 관련된 index 에 대해서 통계정보 수집
STATTAB- 통계수집을 통한 기존 통계정보 Update 전에, 기존에 존재하는 통계정보를 저장할 User Stat Table 을 지정
STATID- Stattab 와 연관된 구분자 값
STATOWN- Stattab 에 지정한 User Stat Table 의 소유자가 다를 경우 지정
NO_VALIDATE- 의존적인 Cursor를 Invalidate 할지 , 안할지 결정
    => True : 관련된 Cursor 를 invalidate 하지 않는다.
    => False : 디폴트 값으로, 관련된 Cursor 를 Invalidate 한다. 
- Default 로 DBMS_STATS.AUTO_INVALIDATE 값이고, 의미는 DBMS 가 의존적 Cursor를 언제 invalidate 할지 자동으로 결정
- 이때 작용하는 Parameter는 _OPTIMIZER_INVALIDATION_PERIOD 이고, Default 롤 18000 초(5시간) 이다.
- 즉, 통계 정보 수집에 의해 통계 정보가 변경된 후 약 5시간에 걸쳐 랜덤한 시점에 해당 Cursor가 실행될 때 invalidation이 발생한다. 
- 이것을 Auto Invalidation이라고 부른다.
- 일정 시간에 걸쳐 랜덤하게 Cursor를 Invalidation함으로써 특정 시점에 Hard Parse가 한꺼번에 몰리는 현상을 피할 수 있다. 
FORCE- Lock 걸린 Table 에 대해서도 강제로 통계정보 생성

 

4. Test
1) Mission
    CASCADE => TRUE
        E 인덱스에 대한 통계정보도수집하라.
    
    CASCADE => FALSE
        E 인덱스에 대한 통계정보도수집하라.
    
    METHOD_OPT =>'FOR ALL COLUMNS SIZE 1'
        E 칼럼(HIGH AND LOW COLUMN VALUE)에 대한 통계정보도 수집하라.
    
    METHOD_OPT =>'FOR COLUMNS'
        E컬럼에 대한통계정보를 수집하지 마라

 

2) Test 
2-1) 일반 테이블
    SHOW USER

 

    USER IS"SYS"

 

    ① SCOTT의 BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고, 테이블, 칼럼(HIGHAND LOW COLUMN VALUE), 
       연관 인덱스의 통계정보를 생성한다.( COMPUTE STATISTICS )

       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT', 
                                         TABNAME    => 'BIG_TABLE', 
                                         CASCADE    => TRUE,
                                         METHOD_OPT => 'FOR ALL COLUMNS SIZE 1');
 
    ② SCOTT의 BIG_TABLE의 15% ROW를 가지고, 테이블, 칼럼, 연관인덱스의 통계정보를 생성한다.( SAMPLE 15 PERCENT )
       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME          => 'SCOTT',
                                         TABNAME          => 'BIG_TABLE', 
                                         CASCADE          => TRUE, 
                                         ESTIMATE_PERCENT => 15);

 

    ③ SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블의 통계정보를 수집하라. 
       인덱스와 칼럼에 대한 통계정보는 제외
       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
                                         TABNAME    => 'BIG_TABLE', 
                                         CASCADE    => FALSE, 
                                         METHOD_OPT => 'FOR COLUMNS');
 
    ④ SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블과인덱스에 대한 통계정보를 수집하라. 
       칼럼에 대한 통계정보는 제외
       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
                                         TABNAME    => 'BIG_TABLE', 
                                         CASCADE    => TRUE, 
                                         METHOD_OPT => 'FOR COLUMNS');

 

    ⑤ SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블과 컬럼(NO HISTOGRAM),

       그리고 인덱스에 대한 통계정보를 수집하라.
       잠시 후에 인덱스 칼럼들의 HISTOGRAM 통계정보를 수집하라.

       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
                                         TABNAME => 'BIG_TABLE', 
                                         CASCADE => TRUE);

       잠시 후에..

       EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME    =>'SCOTT',
                                          TABNAME    => 'BIG_TABLE', 
                                          CASCADE    => TRUE,
                                          METHOD_OPT => 'FOR ALL INDEXED COLUMNSSIZE 1');

 

    ⑥ SCOTT 의 BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고, 테이블과 인덱스칼럼(ONLY HIGH AND LOW )에

       대한 통계정보를 수집하라. 인덱스에 대한 통계정보는수집하지 마라.
        EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
                                          TABNAME    => 'BIG_TABLE', 
                                          CASCADE    => FALSE,
                                          METHOD_OPT => 'FOR ALL INDEXED COLUMNSSIZE 1');
 
2-2) PARTITIONTABLE 의 경우 
    ① 추가적으로 GRANULARITY 정보를 'ALL', 'AUTO', 'PARITION', 'GLOBAL AND PARTITION', 'GLOBAL', 'SUBPARTITION'을

       통해서 통계수집 대상 TABLE SEGMENT를 선정 가능하다.
 
 
    ② 참고 
        - LOCK VS DBMS_STATS.GATHER_TABLE_STATS
            : DML 이 LOCK 이 발생 하여도 GATHER_TABLE_STATS 는 정상적으로 진행된다.

            BEGIN
                FOR I IN 1001 .. 5000 LOOP
                    INSERT INTO CHECK_LOCK VALUES ( I , I , 'LOCK');
                END LOOP ;
            END ;
            /

        - @CHECK_USER_LOCK.SQL
            ENTER VALUE FOR USER_NAME: SCOTT10
            OLD  46: AND B.USERNAME =UPPER('&USER_NAME')
            NEW  46: AND B.USERNAME =UPPER('SCOTT10')
            
            USERNAME    SID LOCK_TYPE       MODE_HELD   MODE_REQUE LOCK_ID1 LOCK_ID2
            ---------- ---- --------------- ----------- ---------- -------- --------
            SCOTT10     151 DML             ROW-X (SX)  NONE       51782    0
            SCOTT10     151 TRANSACTION     EXCLUSIVE   NONE       131077   307

        - EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'SCOTT10',TABNAME => 'CHECK_LOCK');
        
        ==> DML LOCK 과는 무관하게 진행 된다.



반응형
반응형

 

출처 : http://zzznara2.tistory.com/228

 

 

 

이것저것 하다면 가끔은 DB를 삭제하고 다시 만들고 싶은 생각이 들 때가 듭니다.

그렇지만, DB를 다시 만든 내가 만든 테이블만 모두 삭제하면 더 편리하겠다는 생각이 들었죠.

 

 

SELECT  'DROP TABLE ' || object_name || ' CASCADE CONSTRAINTS;'
  FROM    user_objects
WHERE   object_type = 'TABLE';



생성된 쿼리를 긁어다가 [F5] 버튼 꾹~ 눌러주면 테이블이 다 삭제됩니다.


SELECT  'DROP VIEW ' || object_name
  FROM    user_objects
WHERE   object_type = 'VIEW';

View도 이렇게 쿼리를 만들어 같은 방법으로 삭제하시면 됩니다.

 

반응형
반응형


- 현재 연결되어 있는 모든 세션을 볼 수 있음.

SELECT * FROM v$session



-- 관련 파라미터 --> 최대 세션수는 (Process*1.1) + 5

show parameter processes ;

show parameter sessions ;


-- 현재 세션 확인

select count(*) from v$session ;

select * from v$session where status = 'ACTIVE'



- 상태별로 모든 세션 상태 보는 쿼리.

SELECT COUNT (*) total_cnt,
       COUNT (DECODE (server, 'DEDICATED', 1, NULL)) dedicated_cnt,
       COUNT (DECODE (TYPE, 'BACKGROUND', 1, NULL)) background_cnt,
       COUNT (DECODE (status, 'ACTIVE', 1, NULL)) active_cnt
  FROM v$session



- 현재 active 상태인 것과 inactive 상태인것을 확인할 때. 

SELECT status,COUNT(*) FROM v$session
WHERE username='유저명
GROUP BY status



- 세션 kill

alter system kill  session 'SID, Serial' ;

ex) alter system kill  session '1352,28337' ;

위 명령으로 kill 불가시 spid 를 콘솔에서 kill -9 로 제거



출처 : http://hoonsik69.tistory.com/106

-------------------------------------------------------------------------------------------------------

DB를 사용하다 보면 batch작업이나 long query를 사용하는 경우가 있는데, 이럴때 장시간 반응이 없어서 pc의 전원을 강제로 꺼버리거나 작업도중 정전이 발생할 수도 있는데, 이럴 경우 세션은 비정상적으로 종료가 되어 세션이 정리가 되지 않고 남아 있게된다.


만약 이러한 세션이 다수가 되면 정상적인 다른 세션들에게 자원배분(메모리등)이 정상적으로 되지 않거나 프로세스 초과 에러 메세지가 발생할 수 있다. 이렇게 실제 사용하지 않은 세션들을

DEAD SESSION(죽은 세션)이라고 하는데 이들을 정리할 필요가 있다.

 

KeepAlive 란 Idle TCP/IP Connection 의 Time out 기능을 말한다.

TCP/IP 기반으로 remote 로 연결된 상태에서 클라이언트의 갑작스런 리부팅이나 스위치 Off 의 경우 해당 연결을 서버에서 Closing 하지 못하게 된다.


이것은 TCP/IP의 제한인 것이지 오라클의 문제는 아니다.
이 때 KeepAlive가 정확하게 configure되어 있다면 좀 더 빨리 Dead connection을 발견하고 빨리 Closing할 것이다.
TCP/IP 에 관련된 것이므로 KeepAlive를 각 플랫폼 별로 지정하는 방법이 모두 틀리다.

예를들면 유저가 PC 에서 Unix Oracle Server로 연결 후 실수로 다음 쿼리 문을 실행했다.

 

SQL> select * from largetable, greatetable, verybigtable;

 

적게는 수십분, 많게는 몇시간이 걸릴 작업이라면 유저는 쿼리를 인터럽트하기 보다 reset 버튼을 누르게 될 것이다. 이때 클라이언트 프로세스는 없어졌지만 백그라운드 서버 프로세스는 계속

running 중일것이다.
이런 현상은 수시로 일어날 수 있다. 또한 당연한 것이다.

유저가 사용을 잘못하는 것이기 때문이다.

하지만 SQL*NET 2.1 이상에서 Dead-Connection-Detection 이라 불리는 기능을 지원한다.

이것은 곧 KeepAlive 를 지정할 수 있는 기능이다 

반드시 서버 사이드의 $ORACLE_HOME/network/admin/sqlnet.ora 파일에 다음의 파라미터

지정해야 한다. 클라이언트에는 지정해봐야 전혀 소용이 없다.


sqlnet 설정 속성 값 설명 : http://docs.oracle.com/cd/B28359_01/network.111/b28317/sqlnet.htm#BIIEEGJH


설정 파일 : $ORACLE_HOME/network/admin/sqlnet.ora


각 세션의 INACTIVE 상태가 길게 유지될 때 세션 강제 종료 시간 설정은 아래의 설정 값을 설정.


만약 설정 값이 없을 경우 각 OS의 TCPKeepAliveTime을 따른다. (일반적으로 2시간, 종종 30분 단위로)

ex ) sqlnet.expire_time = 10         

설정 값 단위는 '분'

default = 0

mimimum Value : 0

recommended Value : 10



Netware를 제외한 모든 Platform, Protocol에서 지원이 된다.

# Windows NT 에서 KeepAlive 를 지정하는 방법(타 플랫폼은 제외)

Regedt32 를 실행한다.

레지스트리에서

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

까지 이동한다.
여기서 키 추가가 아닌 값 추가를 한다.

파라미터는  KeepAliveTime (REG_DWORD) 로 입력한다.

값은 Decimal  -> 180000 (for example = 3 minutes) 으로 지정한다.

-------------------------------------------------------------------------------------------------------


KeepAliveTime (윈도우의 경우)

KeepAliveTime 값은 TCP/IP가 대기 연결이 계속 원래 상태를 유지하는지 확인을 시도하는 빈도를 제어합니다. 이 시간 동안 활동이 없었을 경우 활성화 상태 지속 전송이 전송됩니다. 네트워크가 원래 상태를 유지하며 상대가 활성 상태일 경우 상대가 응답합니다. 손실된 상대에 대해 민감하게 되려는 경우(즉, 상대가 손실되었음을 더 빨리 인식해야할 경우) 이 값을 줄여 보십시오. 오랜 기간 동안 비활성 상태를 유지하는 연결은 공통이고 손실된 상대는 공통이 아닐 경우 이 값을 늘려 오버헤드를 줄여도 됩니다.

7,200,000밀리초(2시간) 동안 대기 연결이 비활성 상태일 경우 Windows에서는 활성화 상태 지속 메시지를 전송하는 것이 기본값입니다. 종종 값에 1,800,000밀리초를 선택하여 반쯤 닫힌 연결을 30분마다 감지합니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

  1. regedit 명령을 시작하여 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 레지스트리 하위 키를 탐색한 후 이름이 KeepAliveTime인 새 REG_DWORD 값을 작성하거나 설정하십시오.
  2. 이 값을 적절한 밀리초로 설정하십시오.
  3. 레지스트리 편집기를 닫으십시오.
  4. 시스템을 중지한 후 다시 시작하십시오. 




출처 : http://nearby2.tistory.com/18

-----------------------------------------------------------------------------------------------

Oracle 세션(Session) 관리

 

오라클은 데이터베이스 접속이 이루어지면 세션을 시작한다.세션은 사용자가 데이터베이스에 연결되어 있는 동안 계속 유지된다.
세션이 시작되면 오라클은 해당 세션에 세션 ID(SID)를 할당한다. 사용자 세션을 출력하려면 v$session 뷰에 쿼리를 수행하면 된다.
v$session에서 각 세션은 고유한 SID(Session identifier)와 SERIAL#(serial number)를 갖는다.
시리얼 번호는 세션이 종료되었으나 다른 세션이 동일한 SID를 갖고 시작되었 때, 세션 명령들이 정확한 세션 객체에 적용될 수 있도

록 보장해준다.

 

v$session 뷰는 사용자 이름, 장치 이름, 프로그램 이름, 상캐 및 로그인 시각 등 세션에 대한 많은 유욯한 정보들을 갖고 있다.

 

(ex)
select username, program from v$session;


-> 어떤 사용자들이 DB에 접속하였고 어떤 프로그램들을 수행하고 있는지 확인하는 쿼리

 

 

세션 강제 종료

 

세션을 강제 종료해야할때는 alter system 명령어를 사용하는데, 사용자 세션을 강제 종료하기 위해서는 v$session 뷰의 SID와

SERIAL# 값이 필요하다.

 

상황 # 사용자 SUNNY에 의해 생성된 세션을 종료할때..

 

SQL> select username, sid, serial#, status
from v$session
where username = 'SUNNY';


USERNAME                SID         SERIAL#       STATUS
--------------------- -------------- -------------- ----------------
SUNNY                       10               3             INACTIVE


SQL> alter system kill session '10, 3';


System altered.


SQL> select username, sid, serial#, status
from v$session
where username = 'SUNNY';


USERNAME                SID         SERIAL#       STATUS
--------------------- -------------- -------------- ----------------
SUNNY                       10               3              KILLED


 

- 오라클이 세션을 강제 종료할 떄, 해당 세션은 더 이상의 SQL문을 실행하는 것을 막는다. 만일 강제 종료하는 시점에 SQL문을 실행

중이었다면, 해당 SQL문은 종료되고 모든 변경사항들은 롤백된다. 또한 해당 세션에 의해 사용되던 잠금(LOCK) 및 기타 자원들도 해

제된다.

 

 - 오라클이 INACTIVE 세션을 강제 종료하는 경우에는 세션을 종료시키고, 상태를 KILLED로 표시한다. 사용자가 계속하여 해당 세션을

사용하려고 시도하면 에러 메세지가 반환되며, 세션 정보는 v$session에서 제거된다.

 

 - ACTIVE 세션을 강제 종료하는 경우에는 오라클이 세션을 종료시키고, 해당 세션이 종료되었다는 에러 메시지를 사용자에게 즉시 발생 시킨다. 만일 오라클이 세션에 의해 사용되고 있던 자원을 60초 이내에 해제할 수 없을 때에는 해당 세션이 강제 종료될 것이라는

메시지를 사용자에게 발생시킨다. v$session 뷰의 상태는 다시 KILLED로 조회될 것이다.

 

- 만일 사용자가 현대 트랜잭션을 완료하고 사용 중이던 세션을 종료하려고 하면 DISCONNECT SESSION 옵션을 사용하면 된다.

 

alter system disconnect '10', '3' post_transation;

 

immediate 옵션과 사용하면 진행중이던 트랜잭션을 롤백하고 모든 세션의 잠금을 해제하며 전체 세션 상태를 복수한 후 사용자에게

즉시 제어 권한을 넘긴다.

 

alter system disconnect session '10', '3' immediate;
alter system kill session '10', '3' immediate;

 

 

+)

 

Q. SID는 세션식별자로 유니크한 값을 가지는데 SERIAL#값까지 갖는 이유는 무엇일까?

 

A. SID는 사용자별로 할당되는 값이 아니라 세션마다 할당되기 때문에 재사용됩니다. 만약 10, 12번 세션을 확인 후 KILL SESSION명령을 하기전에 10번 세션이 로그아웃을 하고 바로 다른 세션이 연결되어서 SID가 10번으로 할당되는 경우가 있다고 해봅시다. 이럴경우 SID만 가지고 세션을 KILL시키면 내가 원하는 세션이 아닌 다른 세션을 KILL 시키는 문제가 발생할 수 있습니다. 그래서 SERIAL#값을 하나 더 두어 세션을 구분하는 것입니다.




참고 : http://dblab.changwon.ac.kr/corenet/education/oraclelec/admin/chap4-6.html

참고 : http://database.sarang.net/?inc=read&aid=27232&criteria=oracle

참고 : http://tip.daum.net/question/62996686

참고 : https://community.oracle.com/thread/468729?start=0&tstart=0

참고 : http://database.sarang.net/?inc=read&aid=27232&criteria=oracle

반응형
반응형

출처 : http://shaharear.blogspot.kr/2013/06/recover-database-from-ora-00333-redo.html



아래의 step을 차근차근 따라하면 해소된다. 

빨간 글씨는 직접 입력 내용이다.

파란 글씨는 출력 내용중 핵심 내용이다.



In development environment, it is very common scenario that we have multiple databases in a single machine by using VMware (i.e, each VMware contains one database). Again those machines doesn't have consistant power backup. Therefore we have to face power failure or VMware hang-up. So, we are forced to restart the machine while databases are still up & running. After restarting the machine, we have mostly got he following error:


   ORA-00333: redo log read error block count .

Here are the steps to overcome the error
SQL> startup
ORACLE instance started.
Total System Global Area ***** bytes
Fixed Size               ***** bytes
Variable Size            ***** bytes
Database Buffers         ***** bytes
Redo Buffers             ***** bytes
Database mounted.
 
 ORA-00333: redo log read error block *Number* count *Number*
 
Step 1: As the Db is in mount mode, We can query v$log & v$logfile to identify the status of log file group and their member.
 SQL> select l.status, member from v$logfile inner join v$log l using (group#); 
 STATUS  MEMBER
 ------------- --------------------------------------
 CURRENT /oracle/fast_recovery_area/redo01.log
 INACTIVE /oracle/fast_recovery_area/redo02.log
 INACTIVE /oracle/fast_recovery_area/redo03.log
 
Step 2: Recover the database using ackup controlfile.
 SQL> recover database using backup controlfile;
ORA-00279: change  generated at  needed for thread 1
ORA-00289: suggestion : /oracle/fast_recovery_area/archivelog/o1_mf_1_634_%u_.arc
ORA-00280: change  for thread 1 is in sequence #
Specify log: {=suggested | filename | AUTO | CANCEL}

Step3: Give 'CURRENT' log file member along with location as input. If it does not work give other log file members along with location in input prompt. In our case we give (위의 step 1의 current log 파일을 입력하면 됨)

/oracle/fast_recovery_area/redo01.log
Log applied.
Media recovery complete.

Step 4: Open the database with reset logfile
SQL> alter database open resetlogs;
Database altered.


반응형
반응형

출처 : http://reznoa.nayana.com



윈도우에서 Oracle의 TNSListener는 서비스로 등록된다. 제어판이나 services.msc를 통하면 등록된 서비스를 확인할 수 있다.

만약 TNSListener가 시작되지 않는다면 HOST 설정이 잘못된 것은 아닌지 의심해볼 필요가 있다. 제공된 관리용 도구를 이용할 수도 있겠지만, 직접 설정 파일을 조작하는것이 훨씬 바르고 간단하다.1

<< IMG : HOST 설정이 올바르지 않을 경우의 에러 메시지 : HOST 설정이 잘못됐을 경우, TNSListener 서비스가 실행되자마자 죽어(끝나)버리는 현상이 생긴다. >>

관련 파일은 다음과 같다.

${ORACLE}/product/10.2.0/db_1/NETWORK/ADMIN

  • listener.ora
  • tnsnames.ora

여기서 ${ORACLE}은 Oracle이 설치된 경로를 의미한다. 버전에 따라서 10.2.0은 달라질 수 있다.

파일을 텍스트 편집기로 열어보면 대충 다음과 같은 구문이 보인다. (IP는 대충 랜덤으로 친거니까 개의치 마시라.)

listener.ora

  1. ORCL =
  2. (DESCRIPTION =
  3. (ADDRESS = (PROTOCOL = TCP)(HOST = 240.102.20.135)(PORT = 1521))
  4. (CONNECT_DATA =
  5. (SERVER = DEDICATED)
  6. (SERVICE_NAME = orcl)
  7. )
  8. )
<TEXTAREA class="Cpp" style="DISPLAY: none" name=CodeHighLighterCode rows=10 readOnly cols=60>ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 240.102.20.135)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )</TEXTAREA>

tnsnames.ora

  1. ORCL =
  2. (DESCRIPTION =
  3. (ADDRESS = (PROTOCOL = TCP)(HOST = 240.102.20.135)(PORT = 1521))
  4. (CONNECT_DATA =
  5. (SERVER = DEDICATED)
  6. (SERVICE_NAME = orcl)
  7. )
  8. )
<TEXTAREA class="Cpp" style="DISPLAY: none" name=CodeHighLighterCode rows=10 readOnly cols=60>ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 240.102.20.135)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )</TEXTAREA>

여기서 HOST 값을 다시 확인해보고 설정해주면 된다.

이 때 IP를 이용하는 것 보다는 호스트 이름을 이용하는것이 여러모로 좋은데, IP가 변경되더 설정 파일을 바꾸지 않아도 되기 때문이다.

윈도우에서 호스트 이름을 확인하려면, 명령행에서 hostname이란 명령을 사용하면 된다.


hostname 명령을 이용하면 호스트 이름을 확인할 수 있다.

설정을 바꾸고 다시 서비스를 시작하면, 이제는 제대로 동작하는것을 확인할 수 있을 것이다.


반응형
반응형

출처 : http://blog.naver.com/tarzan09?Redirect=Log&logNo=150087747707


윈도우7 (windows 2008 R2)에 오라클 10g 를 설치하기 위해서 아래 3개의 파일을 수정해줘야 한다.


1)..databaseinstalloarparam.ini
을 편집기로 열어서...끝에 6.1을 추가한다.
#You can customise error message shown for failure,~
CERTIFIED_VERSION_FAILURE_MESSAGE
Windows=5.0,5.1,5.2,6.0,6.1   <= 6.1 추가

2)..databasestageprereqdbrefhost.xml
을 열어서 편집기로 열어 아래 내용 추가.
< OPERATING_SYSTEM>
      <VERSION VALUE="6.1"/>
</OPERATING_SYSTEM>

3>..databasestageprereqdb_prereqsdbrefhost.xml
을 열어서 아래 내용 추가.
  <OPERATING_SYSTEM>
      <VERSION VALUE="6.1"/>
  </OPERATING_SYSTEM>


### companion 설치도 마찬가지

companioncompanionrefhst_DB.xml
companion_prereqscompanionrefhst_DB.xml

반응형
반응형



오라클 기본 관리자 계정으로 접속해서 해당 부분을 수행해보자

툴은 sqlplus를 이용해서 진행하자


1. sqlplus / as sysdba

(원래는 sqlplus 아이디/비번으로 접속하는데 관리자로 접속하므로 sqlplus (생략)/(생략) as [관리자]로 접속한다는 뜻이라고 알고 있다)


2. 테이블 스페이스 생성


---------------------------------------------------------------------------------------------------------------

1차 출처 : http://www.oracleclub.com

2차 출처 : http://javaiyagi.tistory.com/11






   
옵션절을 생략할 경우 밑줄친 옵션이 디폴트 값입니다. 
   - tablespace_name : 생성할 테이블 스페이스 명
   - DATAFILE : 새로 생성하는 테이블스페이스가 사용할 데이터 파일
   - filespec : 디렉토리 경로명을 포함한 파일명
   - size : 새로 생성되는 데이터 파일의 크기 

   - ONLINE/OFFLINE 
       ONLINE : 새로 생성되는 테이블 스페이스를 활성화 시키며, 생성 후 바로 사용할 수 있게 함
       OFFLINE : 테이블 스페이스를 비활성화 시키며, 생성 후 바로 사용할 수 없음

   - PERMANT/TEMPORARY : TEMPORARY 옵션을 사용하면 생성하는 테이블스페이스는 
                                         임시 테이블스페이스가 됩니다. 


  
DEFAULT STORAGE


     
INITIAL : 테이블 스페이스의 맨 첫번째 Extents의 크기
     * NEXT : 다음 Extents의 크기
     * MINEXTENTS : 생성할 Extents의 최소 값
     * MAXEXTENTS : 생성할 Extents의 최대 값
     * PCTINCREASE : Extents의 증가율, Default값은 50 입니다


테이블 스페이스 생성 예제 

-- 테이블스페이스 생성
SQL>CREATE TABLESPACE storm
         DATAFILE 'C:\ORACLE\ORADATA\app_data.dbf' SIZE 100M
         DEFAULT STORAGE 
             (INITIAL    10K
              NEXT      10K
              MINEXTENTS 2
              MAXEXTENTS 50
              PCTINCREASE 50)


▣ 테이블스페이스의 자동 확장


▣ 생성한 데이터파일이 다 채워졌을 경우 자동으로 데이터 파일을 확장하는 방법 입니다. 

▣ AUTOEXTEND 옵션을 사용 하시면 됩니다. 

▣ AUTOEXTEND 옵션 사용법
   - ON 아니면 OFF
   - CREATE DATABASECREATE TABLESPACEALTER TABLESPACE에서 
     사용 할 수 있습니다. 

▣ AUTOEXTEND 사용 예제

SQL> ALTER TABLESPACE storm
          ADD DATAFILE 'C:\ORACLE\ORADATA\app_data02.dbf' SIZE 200M
          AUTOEXTEND ON NEXT 10M
          MAXSIZE 500M;

storm 테이블스페이스에 200M 데이터 파일을 추가 했는데요,  
이 데이터 파일의 크기인 200M를 전부 사용하게 되면 500M이 될 때까지 자동으로  10M 증가합니다. 


▣ AUTOEXTEND 의 OFF

 SQL>  ALTER DATABASE DATAFILE ‘C:\ORACLE\ORADATA\app_data02.dbf'
                 AUTOEXTEND OFF;

App_data02.dbf파일의 자동확장을 중지 시킵니다.    

---------------------------------------------------------------------------------------------------------------

테이블 스페이스를 삭제할 땐 아래의 두가지를 포함시킬지를 결정하면 된다.

INCLUDING CONTENTS AND DATAFILES : 모든 내용 삭제 및 .dbf 파일까지 삭제

CASCADE CONSTRAINTS : 종속된 제약 조건 삭제


SQL> DROP TABLESPACE (테이블 스페이스명)

INCLUDING CONTENTS AND DATAFILES

CASCADE CONSTRAINTS;



3. 계정 생성
SQL> CREATE USER (user_name)
IDENTIFIED BY [password)
[DEFAULT TABLESPACE (tablespace_name)]
[TEMPORARY TABLESPACE (tablespace_name)]

계정 삭제을 삭제하려면 drop을 하면 된다.
DROP USER (user_name) CASCADE;

4. 생성한 USER에 권한 주기

GRANT connect, resource TO (user_name);

dba : 데이터베이스 관리자 (다 됨)

connect : 테이터베이스 접속 권한

resource : 테이블 생성 권한


------------------

system 계정 패스워드를 변경하려면 아래 참고

sqlplus / as sysdba 로 접속

alter user system identified by "패스워드" -> 특수문자 포함의 경우 스트링으로 감싸주기.


반응형
반응형

원본 : http://jacking75.cafe24.com/Network/OCI_Ref%28k%29.htm

 

작성일 : 2005. 08. 25          작성자 : 최흥배  ( jacking@korea.com )



OCIEnvCreate(),  OCIHandleAlloc(),  OCILogon(),  OCIStmtFetch(),

OCIStmtFetch2(), OCIStmtPrepare(), OCIAttrGet(), OCIStmtExecute(),

OCIParamGet(), OCIDefineByPos(), OCILogoff(), OCIHandleFree()

 

 

 

 

OCIEnvCreate()

 

 

용도

OCI 함수가 실행되는 환경을 작성 및 초기화합니다.

 

구문

sword OCIEnvCreate ( OCIEnv **envhpp,

ub4 mode,

CONST dvoid *ctxp,

CONST dvoid *(*malocfp)(dvoid *ctxp, size_t size),

CONST dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),

CONST void (*mfreefp)(dvoid *ctxp, dvoid *memptr))size_t xtramemsz,

dvoid **usrmempp );

 

 

파라미터

 

envhpp (OUT)

: 환경 핸들에의 포인터입니다. 환경 핸들의 인코딩 설정은 mode로 지정 합니다.

 설정은  envhpp 부터 도출된 문장 핸들에 계승됩니다.

 

mode (IN)

: 모드의 초기화를 지정합니다. 다음의 모드가 유효합니다.

_ OCI_DEFAULT - 디폴트 값. UTF-16 인코딩 입니다.

_ OCI_THREADED thread 환경을 사용합니다. 유저에게 공개되어 있지 않은 내부

데이터 구조체가 멀티 thread에 의해 동시에 액세스 되지 않게 보호합니다.

_ OCI_OBJECT - 오브젝트 기능을 사용합니다.

_ OCI_UTF16 - 환경 핸들과 환경 핸들로부터 계승된 핸들은  UTF-16 인코딩으로 간주해집니다.

_ OCI_SHARED - 공유 데이터 구조를 이용합니다.

_ OCI_EVENTS 파브릿슈/ 사브스크라이브 통지를 이용합니다.

_ OCI_NO_UCB - 동적 콜백·루틴 OCIEnvCallback 의 콜을 억제 합니다.

 디폴트의 동작에서는 환경의 작성시에 OCIEnvCallback 의 콜이 허가 됩니다.

_ OCI_ENV_NO_MUTEX - 이 모드에서는 mutex 화 되지 않습니다. 환경 핸들 또는 환경 핸들로부터 도출된 핸들로 행해진 모든 OCI 콜은 시리얼화 필요가 있습니다.

_ OCI_NEW_LENGTH_SEMANTICS - 캐릭터 셋에 관계없이 모든 핸들에 대해서 일관된 바이트 장() 시멘틱스를 사용합니다.

 

ctxp (IN)

: 메모리·콜백·루틴의 유저 정의 문맥을 지정합니다.

 

malocfp (IN)

: 유저 정의의 메모리 할당 함수를 지정합니다. 모드가 OCI_THREADED 의 경우 이 메모리 할당 루틴은  thread ·세이프로 해 주세요.

 

ctxp (IN)

: 유저 정의의 메모리 할당 함수의 문맥·포인터를 지정합니다.

 

size (IN)

: 유저 정의의 메모리 할당 함수에 의해 할당할 수 있는 메모리의 사이즈를 지정 합니다

 

ralocfp (IN)

: 유저 정의의 메모리 재할당 함수를 지정합니다. 모드가 OCI_THREADED 의 경우 이 메모리 할당 루틴은 thread·세이프로 해 주세요.

 

ctxp (IN)

: 유저 정의의 메모리 재할당 함수의 문맥·포인터를 지정합니다.

 

memp (IN)

: 메모리 블록의 포인터입니다.

 

newsize (IN)

: 새롭게 할당할 수 있는 메모리의 사이즈를 지정합니다.

 

mfreefp (IN)

: 유저 정의의 메모리 해방 함수를 지정합니다. 모드가 OCI_THREADED 의 경우 이 메모리 해방 루틴은 thread·세이프로 해 주세요.

 

ctxp (IN)

: 유저 정의의 메모리 해방 함수의 문맥·포인터를 지정합니다.

 

memptr (IN)

: 해방되는 메모리의 포인터입니다.

 

xtramemsz (IN)

: 환경의 계속(연속) 시간 중에 할당할 수 있는 유저 메모리의 양을 지정합니다.

 

usrmempp (OUT)

: (호출)에 의해 유저가 할당할 수 있던 사이즈 xtramemsz 의 유저 메모리의 포이터를 되돌립니다.

 

코멘트

 

이 콜(호출)의해  유저에 의해 지정된 모드를 사용해 모든 OCI 콜의 환경이 작성됩니다.

이 콜은 다른 OCI 콜의 앞에 불려 집니다.  따라서 이 콜에 의해 톱 레벨에서의 환경 핸들의 Unicode 서포트가 설정됩니다.

Unicode의 설정은 mode 의 인수에 의해 행해집니다.  mode OCI_UTF16로 설정합니다.

이 콜에서는 나머지 OCI 함수로 사용되는 환경 핸들이 되돌려집니다. OCI 에는 독자적인 환경 모드를 가지는 복수의 환경이 존재할 가능성이 있습니다. 이 함수에서는 어떤 모드로 초기화가 요구되어도 프로세스 레벨의 초기화를 실행합니다. 예를 들어 환경계를 OCI_THREADED로 초기화했을 경우는 OCI로 사용되는 모든 라이브러리도 그 thread 모드로 초기화됩니다.

OCI 라이브러리를 사용해 DLL 또는 공유 라이브러리를 기술하고 있는 경우는 반드시 이 콜을 사용해 OCIInitialize() OCIEnvInit() 콜은 사용하지 말아주세요.

 

 

관련 함수

OCIHandleAlloc(), OCIHandleFree(), OCIEnvInit(), OCIEnvNlsCreate(), OCITerminate()



 

 

 

 

 

 

 

OCIHandleAlloc()

 

용도

이 콜은 할당 및 초기화가 끝난 핸들의 포인터를 되돌립니다.

 

구문

sword OCIHandleAlloc ( CONST dvoid *parenth,

dvoid **hndlpp,

ub4 type,

size_t xtramem_sz,

dvoid **usrmempp );

 

파라미터

parenth (IN)

: 환경 핸들입니다.

 

hndlpp (OUT)

: 핸들을 되돌립니다.

 

type (IN)

: 할당할 수 있는 핸들의 형태를 지정합니다. 사용할 수 있는 형태를 다음에 나타냅니다.

_ OCI_HTYPE_AUTHINFO C 형의 인증 정보 핸들 OCIAuthInfo 의 생성을 지정 합니다.

_ OCI_HTYPE_COMPLEXOBJECT C 형의 복합 오브젝트 검색 핸들 OCIComplexObject 의 생성을 지정합니다.

_ OCI_HTYPE_SECURITY C 형의 보안 핸들 OCISecurity 의 생성을 지정합니다.

_ OCI_HTYPE_CPOOL C 형의 접속 풀링 핸들 OCICPool 의 생성을 지정 합니다.

_ OCI_HTYPE_DIRPATH_CTX C 형의 다이렉트 패스 문맥 핸들 OCIDirPathCtx 의 생성을 지정합니다.

_ OCI_HTYPE_DIRPATH_COLUMN_ARRAY C 형의 다이렉트 패스 열배열 핸들 OCIDirPathColArray 의 생성을 지정합니다.

_ OCI_HTYPE_DIRPATH_STREAM C 형의 다이렉트 패스 스트림 핸들 OCIDirPathStream 의 생성을 지정합니다.

_ OCI_HTYPE_ENV C 형의 환경 핸들 OCIEnv 의 생성을 지정합니다.

_ OCI_HTYPE_ERROR C 형의 에러 리포트 핸들 OCIError 의 생성을 지정 합니다.

_ OCI_HTYPE_SVCCTX C 형의 서비스 문맥 핸들 OCISvcCtx 의 생성을 지정합니다.

_ OCI_HTYPE_STMT C 형의 문장(어플리케이션 요구) 핸들 OCIStmt 의 생성을 지정합니다.

_ OCI_HTYPE_DESCRIBE C 형의 선택 리스트 기술 핸들 OCIDescribe 의 생성을 지정합니다.

_ OCI_HTYPE_SERVER C 형의 서버·문맥·핸들 OCIServer 의 생성을 지정합니다.

_ OCI_HTYPE_SESSION C 형의 유저·세션·핸들 OCISession 의 생성을 지정합니다.

_ OCI_HTYPE_TRANS C 형의 트랜잭션(transaction)·문맥·핸들 OCITrans 의 생성을 지정합니다.

_ OCI_HTYPE_SPOOL C 형의 세션·풀·핸들 OCISPool 의 생성을 지정 합니다.

_ OCI_HTYPE_SUBSCR C 형의 예약 구독·핸들 OCISubscription 의 생성을 지정합니다.

_ OCI_HTYPE_PROCESS C 형의 프로세스·핸들 OCIProcess 의 생성을 지정합니다.

 

xtramem_sz (IN)

: 할당할 수 있는 유저 메모리의 양을 지정합니다.

 

usrmempp (OUT)

: 콜에 의해 유저가 할당할 수 있던 사이즈 xtramem_sz 의 유저 메모리의 포인터를 되돌립니다.

 

코멘트

type 으로 지정된 형태에 대응하는 할당 및 초기화가 끝난 핸들의 포인터를 반환.

성공시에는 NULL 핸들이 돌아옵니다. 모든 핸들이 부모 핸들로서 반환되는 환경 핸들과 대응 붙여 할당할 수 있습니다.

에러 발생시에 진단은 이용할 수 없습니다. 이 콜은 성공했을 경우는 OCI_SUCCESS 에러가 발생했을 경우는 OCI_INVALID_HANDLE 되돌립니다.

핸들은 OCI 콜에 건네주기 전에 OCIHandleAlloc()를 사용해 할당할 필요가 있습니다.

 

환경 핸들의 할당 및 초기화를 실시하려면  OCIEnvInit()를 콜 합니다.

 

관련 항목 :  xtramem_sz 파라미터를 사용한 유저 메모리 할당에 대한 자세한 내용은 2-14 페이지의 「유저 메모리의 할당」을 참조해 주세요

 

다음의 코드예는  OCIHandleAlloc()를 사용해 어플리케이션의 시작 시에 여러가지 핸들을 할당하는 예입니다.

 

OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, (ub4)

           OCI_HTYPE_ERROR, 0, (dvoid **) &tmp);

 

OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, (ub4)

            OCI_HTYPE_SERVER, 0, (dvoid **) &tmp);

 

OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp, (ub4)

            OCI_HTYPE_SVCCTX, 0, (dvoid **) &tmp);

 

관련 함수

OCIHandleFree(), OCIEnvInit()

 

 

 

 

 

 

 

 

OCILogon()

 

용도

이 함수는 로그인 세션을 작성할 경우에 사용합니다.

 

구문

sword OCILogon ( OCIEnv *envhp,

OCIError *errhp,

OCISvcCtx **svchp,

CONST OraText *username,

ub4 uname_len,

CONST OraText *password,

ub4 passwd_len,

CONST OraText *dbname,

ub4 dbname_len );

 

파라미터

envhp (IN)

: OCI 환경 핸들입니다.

 

errhp (IN/OUT)

: 에러 발생시의 진단 정보를 위해서 OCIErrorGet()에 건네주는 에러·핸들입니다.

 

svchp (IN/OUT)

: 서비스 문맥 포인터입니다.

 

username (IN)

: 유저명 입니다.  OCI_UTF16 환경 모드에서의 UTF-16 인코딩인 것이 필요합니다.

 

uname_len (IN)

: username 의 길이는 인코딩의 유무에 관계없이 바이트 단위입니다.

 

password (IN)

: 유저의 패스워드입니다.  OCI_UTF16 환경 모드에서의 UTF-16 인코딩인 것이 필요합니다.

 

passwd_len (IN)

: password 의 길이는 인코딩의 유무에 관계없이 바이트 단위입니다.

 

dbname (IN)

: 접속처의 데이터베이스 명 입니다.  OCI_UTF16 환경 모드에서의 UTF-16 인코딩 이어야 합니다.

 

dbname_len (IN)

: dbname 의 길이는 인코딩의 유무에 관계없이 바이트 단위입니다.

 

코멘트

이 함수는 어플리케이션을 위한 로그인 세션을 작성할 경우에 사용 합니다.

이 콜은 건네 받은 서비스·문맥 핸들의 할당을 실시합니다. 이 콜은 세션에 대응 관련된 서버와 유저 · 세션 핸들의 암묵적인

할당도 실행합니다. 이러한 핸들은 서비스 문맥 핸들에 대해서 OCIAttrGet()를 콜 하는 것으로써 꺼낼 수 있습니다.

 

관련 함수

OCILogoff()

 

주의 :  TP 모니터 어플리케이션 등의 복잡한 세션을 필요로 하는 유저는 2-26 페이지의 「어플리케이션의 초기화, 접속 및

세션 작성」을 참조해 주세요.

 

 

 

 

 

 

 

 

 

OCIStmtFetch()

 

용도

질의로 부터 행을 패치 합니다. 새로운 패치 콜 OCIStmtFetch2()의 사용을 추천합니다. 이 콜은 사용할 수 없습니다.

 

구문

sword OCIStmtFetch ( OCIStmt *stmtp,

OCIError *errhp,

ub4 nrows,

ub2 orientation,

ub4 mode );

 

파라미터

 

stmtp (IN)

: 문장(어플리케이션 요구) 핸들입니다.

 

errhp (IN)

: 에러 발생시의 진단 정보를 위해서 OCIErrorGet()에 건네주는 에러·핸들입니다.

 

nrows (IN)

: 현 행의 위치로부터 패치 되는 행수입니다.

 

orientation (IN)

: 릴리스 8.1. 7 이하로 사용 가능한 값은 OCI_FETCH_NEXT(디폴트 ) 뿐입니다.

 

mode (IN)

: OCI_DEFAULT 건네줍니다.

 

코멘트

프리패치 된 행으로 질의한 경우 패치 콜은 로컬 콜이 됩니다.

다만 이것은 어플리케이션에 대해서 투과적으로 행해집니다.

LOB 열이 읽히는 경우 LOB locator에 대해서 실행되는 후속의 LOB 조작을 위해서 그러한 locator가 패치 됩니다.

LONG 열의 경우 프리패치는 오프가 됩니다.

이 함수는 다음의 에러 중 한쪽이 발생하면  EOF OCI_NO_DATA OCI_SUCCESS_WITH_INFO 반환합니다.

 

_ ORA-24344 「정상적으로 종료했습니다만 컴파일·에러가 있습니다.

_ ORA-24345 「잘라서 버림 또는 NULL 패치 에러가 발생했습니다.

_ ORA-24347 「경고: 그룹 함수에 NULL 열이 있습니다.

 

nrows 파라미터에 0(제로)을 설정해 OCIStmtFetch()를 콜 했을 경우는 커서가 삭제됩니다.

OCI_ATTR_ROWS_FETCHED 사용해 마지막 패치 콜로 유저의 버퍼에 정상적으로 패치 된 행수를 검색합니다.

 

관련 함수

OCIStmtExecute()

 

 

 

 

 

 

 

OCIStmtFetch2()

 

용도

이 콜은 (스크롤 가능한) 결과 세트로부터 행을 패치 합니다. 사용할 수 없는 OCIStmtFetch() 대신에 이 패치 콜을 사용하는 것을 추천 합니다.

 

구문

sword OCIStmtFetch2 ( OCIStmt *stmthp,

OCIError *errhp,

ub4 nrows,

ub2 orientation,

sb4 fetchOffset,

ub4 mode );

 

파라미터

stmthp (IN/OUT)

: 이것은(스크롤 가능한) 결과 세트의 문장 핸들입니다.

 

errhp (IN/OUT)

: 에러 발생시의 진단 정보를 위해서 OCIErrorGet()에 건네주는 에러·핸들입니다.

 

nrows (IN)

: 현행의 위치로부터 패치 되는 행수입니다.

 

orientation (IN)

: 받아들이기 가능한 값은 다음과 같습니다.

_ OCI_DEFAULT OCI_FETCH_NEXT 와 같은 결과를 얻을 수 있습니다.

_ OCI_FETCH_CURRENT - 현재 행을 취득합니다.

_ OCI_FETCH_NEXT - 현행 위치의 다음의 행을 취득합니다. 이것은 디폴트입니다

(OCI_DEFAULT 와 같은 결과를 얻을 수 있습니다). 스크롤 불가인 문장 핸들에 사용 합니다.

_ OCI_FETCH_FIRST - 결과 세트의 최초의 행을 취득합니다.

_ OCI_FETCH_LAST - 결과 세트의 마지막 행을 취득합니다.

_ OCI_FETCH_PRIOR - 결과 세트의 현재 행의 전의 행을 취득합니다.

_ OCI_FETCH_ABSOLUTE - 절대적인 위치 지정을 사용해 결과 세트의 행 번호

   (fetchOffset 파라미터로 지정) 패치 합니다.

_ OCI_FETCH_RELATIVE - 상대적인 위치 지정을 사용해 결과 세트의 행 번호

    (fetchOffset 파라미터로 지정) 패치 합니다.

 

fetchOffset (IN)

: 현재 행의 위치를 변경하기 위해서 orientation 파라미터와 병용 하는 오프셋(offset)입니다.

 

mode (IN)

: OCI_DEFAULT 건네줍니다.

 

코멘트

패치 콜은 OCIStmtFetch() 콜에 fetchOffset 파라미터를 추가한 경우와 같은 기능을 합니다. 스크롤 가능한가 어떤가에 관계없이 모든 문장 핸들에 사용 할 수 있습니다.  스크롤 불가인 문장 핸들의 경우 유일하게 받아들이는 것이 가능한 orientation 값은 OCI_FETCH_NEXT 입니다.  fetchOffset 파라미터는 무시됩니다.

새로운 어플리케이션에는 이 새로운 콜 OCIStmtFetch2()의 사용을 추천 합니다.

 

orientation OCI_FETCH_RELATIVE 설정되어 있는 fetchOffset 는 다음의 모든 콜과 등가입니다.

_ fetchOffset 의 값이 0(제로) OCI_FETCH_CURRENT.

_ fetchOffset 의 값이 1 OCI_FETCH_NEXT.

_ fetchOffset 의 값이―1 OCI_FETCH_PRIOR.

 

OCI_ATTR_ROW_COUNT 에는 패치 된 최상위 행의 절대치가 포함됩니다.

OCI_FETCH_ABSOLUTE OCI_FETCH_RELATIVE 제외하는 모든 orientation 모드에는 fetchOffset 치는 무시됩니다.

이 콜을 사용하면 OCI_FETCH_LAST 사용하고 나서 OCI_ATTR_CURRENT_POSITION 에 대해서 OCIAttrGet()를 콜 하는 것으로 결과

세트내의 행수를 검색할 수도 있습니다. 다만 이 콜의 응답 시간은 꽤 길게 됩니다.

리턴 코드는 OCIStmtFetch()의 경우와 같습니다. 다만 스크롤 가능한 문장 핸들의 패치(또는 실행)마다 리턴 코드 OCI_NO_DATA 포함하는 OER(1403)가 되돌려집니다. 또 어플리케이션이 요구하는 모든 행이 패치 된다는 것은 아닙니다.

서버측의 자원을 이 스크롤 커서용으로 해방하려면 스크롤 가능한 문장 핸들을 명시적으로 취소할까( 0(제로) 행으로 패치 한다) 또는 해방하는 필요점이 있습니다. 스크롤 불가인 문장 핸들은 OER(1403)를 받으면 암묵적으로 취소됩니다.

OCI_ATTR_ROWS_FETCHED 사용해 마지막 패치 콜로 유저의 버퍼에 정상적으로 패치 된 행수를 검색합니다.

 

 

 

 

 

 

 

 

OCIStmtPrepare()

 

용도

이 콜은 실행하는 SQL 문 또는 PL/SQL 문을 준비합니다.

 

구문

sword OCIStmtPrepare ( OCIStmt *stmtp,

OCIError *errhp,

CONST text *stmt,

ub4 stmt_len,

ub4 language,

ub4 mode );

 

파라미터

stmtp (IN)

: 실행 대상의 문장에 관련 지어지는 문장 핸들입니다. 디폴트에서는 도출원(導出元)의 환경 핸들의 인코딩 설정이 포함되어 있습니다. 문장을 UTF-16 인코딩으로 준비할 수 있는 것은 UTF-16 환경만입니다.

 

errhp (IN)

: 에러 발생시의 진단 정보를 위해서 OCIErrorGet()에 건네주는 에러 핸들입니다.

 

stmt (IN)

: 실행되는 SQL 문 또는 PL/SQL 문입니다. 널 문자로 종료하는 캐릭터 라인으로 해 주세요. 이를테면 마지막 문자는 인코딩에 따라서는 NULL 바이트의 수치입니다. 환경 핸들이 OCI_UTF16 모드로 작성되어 있는 경우는 문장도 UTF-16 인 것이 필요합니다.

파라미터를 반드시(text *)에 캐스트 해 주세요. 문장이 UTF-16 준비되면 바인드 버퍼와 정의 버퍼의 캐릭터 셋은 UTF-16 에 디폴트 설정됩니다.

문장의 텍스트에의 포인터는 그 문장이 실행되거나 그 문장으로부터 데이터가 패치 되는 사이에는 사용 가능하다라고 하는 것이 필요합니다.

 

stmt_len (IN)

: 문장의 길이입니다. 인코딩에 의해 문자 수 또는 바이트수의 단위가 됩니다.  0(제로) 이외로 할 필요가 있습니다.

 

language (IN)

: V7 구문 또는 네이티브 구문을 지정합니다. 가능한 값은 다음과 같습니다.

_ OCI_V7_SYNTAX V7 Oracle 해석 구문.

_ OCI_NTV_SYNTAX - 서버의 버젼에 의존하는 구문.

 

mode (IN)

: OCIEnvCreate() 콜의 mode 에 유사하고 있습니다. 다만 이 콜은 필연적으로 계승된 모드 설정을 쓰기 할 수 있기 때문에 우선 순위가 높아집니다.

 

다음의 값이 있습니다.

_ OCI_DEFAULT - 디폴트·모드. 문장 핸들 stmtp , 부모의 환경 핸들에 지정되어 있는 내용을 사용합니다.

_ OCI_NO_SHARING SQL 문의 공유 모드를 사용 금지로 합니다. 2-22 페이지의 「공유 데이터모드」 참조해 주세요.

 

코멘트

이 콜은 OCI 어플리케이션으로 실행하는 SQL 문 또는 PL/SQL 문을 준비하기 위해 사용합니다. OCIStmtPrepare() 콜은 어플리케이션 요구를 정의합니다.

 

mode 파라미터는 문장의 내용이 UTF-16 인코딩 되고 있는지 어떤지를 판단합니다.

문장의 길이는 코드 포인트 수 또는 바이트 수로 인코딩에 따라서 달라 집니다.

문장 핸들은 부모의 환경 핸들로부터 인코딩 설정을 계승합니다만 이 콜의 mode 에 의해 문장 핸들 자체의 인코딩 설정도 변경할 수 있습니다.

후속의 바인드 콜로 초기화되는 이 문장의 데이터 치는 이 문장 핸들의 설정을 dfault 로서 사용하는 바인드 핸들 내에 격납됩니다.

이 콜은 이 문장 핸들과 특정의 서버간의 대응 부는 작성하지 않습니다.

 

관련 함수

OCIAttrGet(), OCIStmtExecute()

 

관련 항목: 이 콜의 사용 방법의 자세한 것은,4-4 페이지의 「문장의 준비」 참조해 주세요.

 

 

 

 

 

 

 

 

OCIAttrGet()

 

용도

이 콜은 핸들의 특정의 속성을 취득할 경우에 사용합니다.

 

구문

sword OCIAttrGet ( CONST dvoid *trgthndlp,

ub4 trghndltyp,

dvoid *attributep,

ub4 *sizep,

ub4 attrtype,

OCIError *errhp );

 

파라미터

trgthndlp (IN)

: 핸들 타입의 포인터입니다. 실제의 핸들은 문장 핸들이나 세션 핸들등의 경우가 있습니다. 이 콜에 의해 인코딩을 취득하면 유저는 환

경계 핸들 또는 문장 핸들과 조합해 체크할 수 있습니다.

 

trghndltyp (IN)

: 핸들 타입입니다. 다음의 형태가 유효합니다.

_ OCI_DTYPE_PARAM, 파라미터 기술자(記述子)

_ OCI_HTYPE_STMT, 문장 핸들용

_ 2-1OCI 핸들·타입」에 나타나는 모든 핸들·타입

 

attributep (OUT)

: 속성 값의 격납 장소에의 포인터입니다. OCI_UTF16 환경 모드에서는 캐릭터 라인 속성의 값은 UTF-16 캐릭터 라인으로서 되돌려집니다.

 

sizep (OUT)

: 속성 값의 사이즈는 항상 바이트 단위입니다. 이것은 attributep   dvoid 포인터로 있기 때문입니다.

비 문자열 속성 사이즈는 OCI 라이브러리에서 벌써 인식되고 있기 때문에 대부분의 속성의 값은 NULL 로서 건네줄 수가 있습니다. text* 파라미터에서는 문자열의 길이를 취득하기 위해서 ub4 의 포인터를 건네줄 필요가 있습니다.

 

attrtype (IN)

: 꺼내지는 속성의 타입입니다. 속성 타입은 이 메뉴얼의 다음의 장에 리스트 되어 있습니다.

관련 항목: 핸들·타입과 그 읽기 가능한 속성에 대해서는 부록 A 「핸들 및 기술자의 속성」의 리스트를 참조해 주세요.

 

errhp (IN/OUT)

: 에러 발생시의 진단 정보를 위해서 OCIErrorGet()에 건네주는 에러·핸들입니다.

 

코멘트

이 콜은 핸들의 특정의 속성을 취득할 경우에 사용합니다. OCI_DTYPE_PARAM은 암묵적으로 및 명시적으로 기술하는 경우에 사용합니다. 파라미터 기술자는 다이렉트 패스 로드에서도 사용합니다. 암묵적인 기술의 경우 파라미터 기술자에게는 선택 리스트 마다 열 기술이 있습니다. 명시적인 기술의 경우 파라미터 기술자에게는 기술하는 각 스키마 오브젝트에 대한 기술 정보가 포함되어 있습니다. 톱 레벨 파라미터 기술자에 그 자체가 기술자가 되는 속성이 있는 경우 OCIAttrGet()에의 후속 콜로 속성의 형으로서 OCI_ATTR_PARAM 사용합니다.

이 콜을 사용해 환경 핸들 또는 문장 핸들의 Unicode 정보를 취득합니다.

OCIAttrGet()와 밀접하게 관련하고 있는 함수는 OCIDescribeAny()입니다. 이것은 표, , 동의어, 프로시저, 펑션, 패키지, 순서, 형태등의 기존의 스키마 오브젝트를 기술하는 범용적인 기술 콜입니다. 이 콜의 결과 기술 핸들에는 OCIAttrGet() 콜을 개입시켜 취득할 수 있는 오브젝트 고유의 속성이 이입됩니다.

다음에 이 기술 핸들에 대한 OCIParamGet()에 의해 지정 위치의 파라미터 기술자가 되돌려집니다. 파라미터 위치는 1 로부터 개시합니다. 파라미터 기술자에 대해서 OCIAttrGet()를 콜 하면 스토어드 프로시저나 스토어드 펑션의 파라미터의 특정의 속성 경우에 따라서는 표의 열기술자가 되돌려집니다.

 

OCIDescribeAny()에 의해 schema·오브젝트 기술 전체가 클라이언트 측에 캐쉬 되고 있기 때문에 이러한 후속 콜은 서버에의 라운드 트립을 따로 실시하는 필요가 없습니다. 기술 핸들에 대한 OCIAttrGet() 콜에 의해 위치의 총수도 반환하는 것이 가능합니다.

 

특히 UTF-16 모드로 루프를 실행하는 경우는 속성에 대응하고 있는 같은 포인터 변수를 재 이용해 OCIAttrGet()의 콜 후에 그 내용을 로컬 변수에 카피해 주세요. 복수의 포인터를 같은 속성에 사용하면 메모리 리크가 발생할 가능성이 있습니다.

 

관련 함수

OCIAttrSet()

 

관련 항목: 코드·fragment의 예에 대해서는,6-23 페이지의 「OCIDescribeAny()의 사용 예」 및 4-12 페이지의 「선택 리스트 항목의 기술」을 참조해 주세요.

 

 

 

 

 

 

 

 

 

 

OCIStmtExecute()

 

용도

이 콜은 어플리케이션 요구를 서버에 대응 합니다.

 

구문

sword OCIStmtExecute ( OCISvcCtx *svchp,

OCIStmt *stmtp,

OCIError *errhp,

ub4 iters,

ub4 rowoff,

CONST OCISnapshot *snap_in,

OCISnapshot *snap_out,

ub4 mode );

 

파라미터

svchp (IN/OUT)

: 서비스 문맥 핸들입니다.

 

stmtp (IN/OUT)

: 문장 핸들입니다. 서버로 실행되는 문장 및 대응에 관련된 데이터를 정의합니다.

svchp Oracle7 Server를 지시하고 있을 때 릴리스 8. x 이상에서만 서포트 된다

데이터형의 바인드를 가지는 문장 핸들을 건네주어도 무효가 됩니다.

 

errhp (IN/OUT)

: 에러 발생시의 진단 정보를 위해서 OCIErrorGet()에 건네주는 에러 핸들입니다.

 

iters (IN)

: SELECT 문 이외의 경우 이 문장이 실행되는 회수는  iters - rowoff 의 경우와 같게 됩니다.

SELECT 문에서는 iters 0(제로) 이외의 경우는 문장 핸들에 대한 정의를 실시할 필요가 있습니다. 실행하면 iters 가 사전 정의 버퍼에 패치 되어 프리패치 행 카운트에 따라 한층 더 행이 프리패치 됩니다.  SELECT 문에 의해 꺼내지는 행수가 불명의 경우는 iters 0(제로)으로 설정합니다.

이 함수는 SELECT 문 이외에 대해 iters=0 의 경우는 에러를 되돌립니다.

주의: 배열 DML 조작의 경우는 iters <= 32767 설정하는 것으로 보다 높은 퍼포먼스를 얻을 수 있습니다.

rowoff (IN)

: 이 복수 행 실행에 관련하는 배열 바인드의 데이터가 시작되는 개시 색인(開始索引)입니다.

 

snap_in (IN)

: 파라미터는 옵션입니다. 지정할 경우는 OCI_DTYPE_SNAP 형의 스냅 쇼트 기술자를 지시할 필요가 있습니다. 이 기술자의 내용은 직전의 콜의 snap_out 파라미터로부터 취득할 필요가 있습니다. 이 기술자는 SQL SELECT 가 아닐 경우는 무시됩니다.  이 기능을 사용하면 Oracle 의 복수 서비스 문맥에 따라서 데이타베이스의 커밋이 끝난 데이터에 관해서 같은 일관성이 있는 snapshot를 참조할 수 있습니다.  다만 어느 문맥으로 커밋 되어 있지 않은 데이터는 같은 스냅 쇼트를 사용해도 다른 문맥으로 참조할 수 없습니다.

 

snap_out (OUT)

: 파라미터는 옵션입니다. 지정하는 경우는 OCI_DTYPE_SNAP 형의 기술자를 지시 할 필요가 있습니다. 이 기술자에게는 현행의 Oracle 의 시스템 변경 번호가 암호화되어 격납되고 있어 후속의 OCIStmtExecute() 콜의 snap_in 에의 입력치로서 사용으로 가능합니다. 기술자는 필요 이상으로 길게 사용하지 말아 주세요. snapshot이 너무 낡았음」이라고 하는 에러가 발생합니다.

 

mode (IN)

: 다음의 모드가 유효합니다.

_ OCI_BATCH_ERRORS - 이 모드의 자세한 것은 4-9 페이지의 「OCIStmtExecute() 용의 배치 에러 모드」 참조해 주세요.

_ OCI_COMMIT_ON_SUCCESS - 이 모드로 문장을 실행했을 경우 실행이 정상적으로 종료와 실행 후에 경향 트랜잭션(transaction)커밋 됩니다.

_ OCI_DEFAULT - 이 모드로 OCIStmtExecute()를 콜 한다고 문장이 실행됩니다.  또 선택 리스트에 관한 기술 정보가 암묵적으로 되돌려집니다.

_ OCI_DESCRIBE_ONLY - 이 모드는 실행 전에 질의를 기술하는 유저용입니다. OCIStmtExecute()를 이 모드로 콜 하면 문장은 실행됩니다만 선택 리스트 기술은 되돌려집니다. 퍼포먼스를 최대로 하기 위해서 어플리케이션에서는 dfault 모드로 문장을 실행해 실행에 수반하는 암묵적인 기술을 사용하는 것을 추천 합니다.

_ OCI_EXACT_FETCH - 어플리케이션으로 패치 되는 행수가 미리 정확하게 알고 있을 때 사용합니다. 이 모드에 의해 Oracle 릴리스 8. x 이상의 모드의 프리패치가 오프가 됩니다. 또 실행 콜의 전에 정의되어 있을 필요가 있습니다.  이 모드를 사용한다고 요구한 행이 패치 된 후 커서를 취소 없애기 때문에 서버 측의 자원 사용량을 삭감할 수 있습니다.

_ OCI_PARSE_ONLY - 이 모드를 사용하면 유저는 실행 전에 질의를 해석 할 수 있습니다.  이 모드로 실행하면 질의가 해석되어 SQL 내에 해석 에러가 있는 경우는 그 에러가 되돌려집니다.  이 모드에서는 서버에의 추가 라운드 트립이 발생 하는 것에 주의할 필요가 있습니다. 퍼포먼스를 향상 시키려면 번들 조작의 일부로서 문장을 해석하는 디폴트 모드로 문장을 실행하는 것을 추천 합니다.

_ OCI_STMT_SCROLLABLE_READONLY - 결과 세트를 스크롤 가능하게 설정하는 경우는 필수입니다.  결과 세트는 갱신할 수 없습니다.  4-16 페이지의 「결과의 패치」 참조 해 주세요. 다른 모드와의 병용은 할 수 없습니다. 이러한 모드는 상호 배타적이지 않고 배합해 사용할 수 있습니다. 다만 OCI_STMT_SCROLLABLE_READONLY를 제외 합니다.

 

코멘트

이 함수는 프리 컴파일 된 SQL 문을 실행하기 위해서 사용합니다. 어플리케이션은 실행 콜을 사용해 요구를 서버에 대응 합니다. SELECT 문이 실행되면 선택 리스트의 기술이 응답으로서 암묵적으로 사용 가능하게 됩니다. 이 기술은 기술, 패치 및 형태 변환 정의용으로 클라이언트 측에 버퍼 처리 됩니다.  따라서 선택 리스트의 기술은 실행 후에만 실시하는 것이 최선의 방법입니다.

SELECT 문의 경우는 일부의 결과도 암묵적으로 사용 가능해집니다. 실행 종료의 시점에서 행이 받아 들여져 버퍼 처리됩니다. 행수가 적은 질의 에서는 프리패치 하는 것으로 패치의 마지막에 달했을 때에 서버내의 메모리가 해방되어 이것에 의해 메모리의 사용량이 삭감되도록 최적화할 수 있습니다. 프리패치 하는 행수를 결과 세트 마다 설정하는 속성 설정 콜이 정의되고 있습니다.

SELECT 문에서는 문장 핸들은 그것이 실행된 서비스·문맥에 대한 참조를 실행 종료 시에 암묵적으로 보관 유지하고 있습니다. 서비스 문맥의 완전성은 유저에게 보수의 의무가 있습니다. 암묵적인 참조는 문장 핸들이 해방되던가 또는 패치가 취소,  패치 조건의 마지막에 달할 때까지 보관 유지됩니다.

 

관련 함수

OCIStmtPrepare()

관련 항목: 4-12 페이지 「선택 리스트 항목의 기술」

 

주의: OCIStmtExecute()의 콜 전에 SELECT 문에 대해서 출력 변수를 정의하면  iters 에 의해 지정된 행수가 정의가 끝난 출력 버퍼에 직접 패치 되어 프리패치 건수와 같은 수의 추가 행이 프리패치 됩니다. 추가행이 없는 경우는 패치는 OCIStmtFetch()를 콜 하지 않고 완료합니다.

 

 

 

OCIStmtExecute() 용의 배치·에러·모드

 

OCI 에서는 배열 DML 조작을 실행할 수 있습니다. 예를 들어 어플리케이션 에서는  INSERT ,  UPDATE 문 또는 DELETE 문의 배열을 1 회의 문장 실행으로 처리할 수 있습니다. 일의성 제약 위반 등의 서버로부터의 에러를 때문에 조작중 한쪽이 실패하면 배열 조작은 중지되어 OCI는 에러를 되돌립니다. 그 경우 배열내의 나머지의 행은 모두 무시됩니다. 이 때문에 어플리케이션 에서는 나머지의 배열을 재 실행 할 필요가 있어 한층 더 에러가 발생했을 경우는 이 처리 전체를 재차 반복할 필요가 있습니다. 이것에 의해 추가의 라운드 트립이 발생 합니다.  배열 DML 조작을 용이하게 처리하기 위해서 OCI 에서는 배치 에러 모드(확장 DML 배열 기능 이라고도 불립니다)가 준비되어 있습니다. 이 모드는 OCIStmtExecute() 콜에 지정해서 ,  1 개 이상의 에러가 발생하는 경우의 DML 배열 처리를 단순화 합니다. 이 모드에서는 OCI 는 모든 행의 INSERT , UPDATE 문 또는 DELETE 문을 시행해 발생한 에러에 관한 정보를 수집(배치처리)합니다. 다음에 어플리케이션으로 이 에러 정보를 꺼내 최초의 콜로 실패한 임의의 DML 조작을 재실행할 수 있습니다.

이 방법에서는 배열내의 모든 DML 조작이 최초의 콜로 시행되어 실패한 조작을  2번째의 콜로 재 발행 할 수 있습니다.

 

이 모드는 다음과 같이 사용합니다.

1.  OCIStmtExecute() 콜의 mode 파라미터로서 OCI_BATCH_ERRORS 지정 합니다.

2.  OCIStmtExecute()로 배열 DML 조작을 실행한 후 어플리케이션에서는 문장 핸들로 OCIAttrGet()를 콜 해 OCI_ATTR_NUM_DML_ERRORS 속성을 꺼내는 것에 따라 조작 중에 발생한 에러의 번호를 꺼낼 수가 있습니다. 다음에 예를 표시합니다.

ub4 num_errs;

OCIAttrGet(stmtp, OCI_HTYPE_STMT, &num_err, 0, OCI_ATTR_NUM_DML_ERRORS, errhp);

 

3.  에러의 리스트가 꺼내지면 에러 핸들이 해방됩니다.

어플리케이션에서는  OCIParamGet()을 사용해  OCIStmtExecute() 콜에 건네 받은 에러 핸들로부터 각 에러를 행 정보와 함께 추출합니다. 이 정보를 취할려면 어플리케이션으로 OCIParamGet() 콜 용의 추가의 새로운 에러 핸들을 할당 할 필요가 있습니다. 이 새로운 에러 핸들에는 배치로서 기록 된 에러 정보가 포함되어 있습니다. 어플리케이션에서는  OCIErrorGet()로 각 에러의 구문을 취득해 새로운 에러 핸들로 OCIAttrGet()를 콜 하는 것에 의해 에러가 발생한 행의 오프셋(offset)(DML 배열내에) 취득합니다.

예를 들어 num_errs 의 결과가 꺼내진 다음에 어플리케이션으로부터 다음의 콜을 발행 할 가능성이 있습니다.

 

...

 

OCIError errhndl;

 

for (i=0; i<num_errs; i++)

 

{

 

OCIParamGet(errhp, OCI_HTYPE_ERROR, errhp, &errhndl, i);

 

OCIAttrGet(errhndl, OCI_HTYPE_ERROR, &row_offset, 0,

 

OCI_ATTR_DML_ROW_OFFSET, errhp);

 

OCIErrorGet(..., errhndl, ...);

 

...

 

다음에 어플리케이션에서는 배치로서 기록된 에러로부터 꺼내진 진단 정보를 사용해 배열 내의 해당하는 엔트리의 바인드 정보를 수정할 수 있습니다. 해당하는 바인드 버퍼가 수정 또는 갱신되면 어플리케이션으로 거기에 대응하는 DML 문장을 재 실행 할 수 있습니다. 어플리케이션에서는 최초의 실행으로 에러의 원인이 되는 행을 컴파일 시에 검출 할 수 없기 때문에 후속의 DML 바인드는 실행 시에 해당하는 버퍼를 건네주는 것으로 동적으로 실행할 필요가 있습니다. 유저는 최초의 DML 조작에서의 배열 바인드로 사용 된 바인드 버퍼를 재이용할 수 있습니다.

 

배치 에러 모드의 예

다음의 코드는 이 실행 모드의 사용 방법의 예를 나타내고 있습니다. 이 예에서는 표에 5개의 행을 (NUMBER CHAR 형태의2 개의 열과 함께) 삽입하는 어플리케이션이 있는 것으로 합니다. 게다가 2개의 행(1 3)만이 최초의 DML 조작으로 정상적으로 삽입되는 것으로 합니다. 유저는 다음에 데이터(최초의 조작으로 삽입된 잘못한 데이터)를 수정해 수정한 데이터의 UPDATE를 발행 합니다. 유저는 문장 핸들 stmtp1 stmtp2를 사용 해 INSERT UPDATE를 각각 발행 합니다.

 

OCIBind *bindp1[2], *bindp2[2];

 

ub4 num_errs, row_off[MAXROWS], number[MAXROWS] = {1,2,3,4,5};

 

char grade[MAXROWS] = {'A','B','C','D','E'};

 

...

 

/* Array bind all the positions */

 

OCIBindByPos (stmtp1,&bindp1[0],errhp,1,(dvoid *)&number[0],

 

sizeof(number[0]),SQLT_NUM,(dvoid *)0, (ub2 *)0,(ub2 *)0,

 

0,(ub4 *)0,OCI_DEFAULT);

 

OCIBindByPos (stmtp1,&bindp1[1],errhp,2,(dvoid *)&grade[0],

 

sizeof(grade[0],SQLT_CHR,(dvoid *)0, (ub2 *)0,(ub2 *)0,0,

 

(ub4 *)0,OCI_DEFAULT);

 

/* execute the array INSERT */

 

OCIStmtExecute (svchp,stmtp1,errhp,5,0,0,0,OCI_BATCH_ERRORS);

 

/* get the number of errors */

 

OCIAttrGet (stmtp1, OCI_HTYPE_STMT, &num_errs, 0,

 

OCI_ATTR_NUM_DML_ERRORS, errhp);

 

if (num_errs) {

 

/* The user can do one of two things: 1) Allocate as many */

 

/* error handles as number of errors and free all handles */

 

/* at a later time; or 2) Allocate one err handle and reuse */

 

/* the same handle for all the errors */

 

OCIError *errhndl[num_errs];

 

for (i = 0; i < num_errs; i++) {

 

OCIParamGet(errhp, OCI_HTYPE_ERROR, errhp, &errhndl[i], i);

 

OCIAttrGet (errhndl[i], OCI_HTYPE_ERROR, &row_off[i], 0,

 

OCI_ATTR_DML_ROW_OFFSET, errhp);

 

/* get server diagnostics */

 

OCIErrorGet (..., errhndl[i], ...);

 

}

 

}

 

/* make corrections to bind data */

 

OCIBindByPos (stmtp2,&bindp2[0],errhp,1,(dvoid *)0,0,SQLT_NUM,

 

(dvoid *)0, (ub2 *)0,(ub2 *)0,0,(ub4 *)0,OCI_DATA_AT_EXEC);

 

OCIBindByPos (stmtp2,&bindp2[1],errhp,2,(dvoid *)0,0,SQLT_DAT,

 

(dvoid *)0, (ub2 *)0,(ub2 *)0,0,(ub4 *)0,OCI_DATA_AT_EXEC);

 

/* register the callback for each bind handle */

 

OCIBindDynamic (bindp2[0],errhp,row_off,my_callback,0,0);

 

OCIBindDynamic (bindp2[1],errhp,row_off,my_callback,0,0);

 

/* execute the UPDATE statement */

 

OCIStmtExecute (svchp,stmtp2,errhp,2,0,0,0,OCI_BATCH_ERRORS);

 

...

 

이 예에서는 어느 행이 에러와 함께 되돌려 지는지는 컴파일 시에는 모르기 때문에 OCIBindDynamic() 콜백과 함께 사용하고 있습니다. 콜백 에서는 row_off 격납 된 에러를 포함한 행의 번호를 콜백 문맥을 통해서 건네주어 갱신 또는 수정의 필요가 있는 행만을 송신할 수 있습니다.  INSERT의 실행과 UPDATE의 실행으로는 같은 바인드 버퍼를 공유할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

OCIParamGet()

 

용도

기술 핸들 또는 문장 핸들내의 지정 위치에 있는 파라미터의 기술자를 되돌립니다.

 

구문

sword OCIParamGet ( CONST dvoid *hndlp,

ub4 htype,

OCIError *errhp,

dvoid **parmdpp,

ub4 pos );

 

파라미터

hndlp(IN)

: 문장 핸들 또는 기술 핸들입니다.  OCIParamGet() 함수는 이 핸들 용의 파라메타 기술자를 되돌립니다.

 

htype (IN)

: hndlp 파라미터에게 건네지는 핸들의 형태입니다. 다음의 형태가 유효합니다.

- OCI_DTYPE_PARAM             파라미터 기술자용

- OCI_HTYPE_COMPLEXOBJECT  복합 오브젝트 검색 핸들용

- OCI_HTYPE_STMT              문장 핸들용

 

errhp (IN/OUT)

: 에러 발생시의 진단 정보를 위해서 OCIErrorGet()에 건네주는 에러 핸들입니다.

 

parmdpp (OUT)

: 핸들 타입 OCI_DTYPE_PARAM pos 파라미터로 지정된 위치에 있어서의 파라미터의 기술자입니다.

 

pos (IN)

: 문장 핸들 또는 기술 핸들에 있어서의 위치 번호입니다. 이 정도 값에 있는 파라미터 기술자가 돌아옵니다.

 

주의: 지정 위치에 파라미터 기술자가 없는 경우는 OCI_ERROR 반홥됩니다.

 

코멘트

이 콜은 기술 핸들 또는 문장 핸들내의 지정 위치에 있는 파라미터의 기술자를 반환합니다.  파라미터 기술자는 항상 OCI 라이브러리에 의해 내부적으로 할당할 수 있습니다. OCIDescriptorFree()를 사용해 해방할 수 있습니다.  예를 들어 문장을 실행할 때마다 같은 열의 메타 데이타를 패치 하는 경우는 OCIParamGet()의 각 콜간에 파라미터 기술자를 명시적으로 해방하지 않는 한 프로그램에서는 메모리 합니다.

 

관련 함수

OCIAttrGet(), OCIAttrSet(), OCIParamSet(), OCIDescriptorFree()

 

 

 

 

 

 

 

 

OCIDefineByPos()

 

용도

선택 리스트 내의 항목을 형태와 출력 데이터 버퍼에 관련 짓습니다.

 

구문

sword OCIDefineByPos ( OCIStmt *stmtp,

OCIDefine **defnpp,

OCIError *errhp,

ub4 position,

dvoid *valuep,

sb4 value_sz,

ub2 dty,

dvoid *indp,

ub2 *rlenp,

ub2 *rcodep,

ub4 mode );

 

파라미터

stmtp (IN/OUT)

: 요구된 SQL 문의 조작에의 핸들입니다.

 

defnpp (IN/OUT)

: 정의 핸들의 포인터에의 포인터입니다. 파라미터를 NULL로 건네주면 정의 핸들을 암묵적으로 할당 할 수 있습니다. 재 정의의 경우는 비 NULL 핸들을 이 파라미터에 건네는 것이 가능합니다. 이 핸들은 이 열용의 정의 정보를 격납 하기 위해서 사용됩니다.

 

errhp (IN/OUT)

: 에러 발생시의 진단 정보를 위해서 OCIErrorGet()에 건네주는 에러 핸들입니다.

 

position (IN)

: 선택 리스트에서의 이 값의 위치입니다. 위치는 1로부터 시작되어 왼쪽에서 오른쪽에 번호가 차입니다.

예를 들면 다음의 SELECT 문장이 있다고 합니다.

SELECT empno, ssn, mgrno FROM employees;

empno 는 위치 1 ssn는 위치 2 mgrno는 위치 3이 됩니다.

 

valuep (IN/OUT)

: dty 파라미터로 지정되고 있는 타입의 버퍼 또는 버퍼의 배열의 포인터입니다. 단독의 패치 콜로 복수의 행을 패치 하는 경우는 복수의 버퍼를 지정 할 수 있습니다.

 

value_sz (IN)

: valuep 버퍼의 바이트 사이즈입니다. 데이터가 VARCHAR2 형식에서 내부적으로 격납 되어 있는 경우 필요한 문자수가 바이트 단위의 버퍼 사이즈와 다를 때는 OCIAttrSet()를 사용해 추가 지정할 수 있습니다.

멀티 바이트 변환 환경에서는 지정한 바이트수가 처리하는 문자 수에 대해서 불충분한 경우 잘라 버림 에러가 발생합니다.

OCI_ATTR_CHARSET_ID 속성이 OCI_UTF16ID(하위 호환성을 위해서 보관 유지되고 있는 사용 할 수 없는 OCI_UCS2ID 대신 지정)으로 설정되어 있는 경우는 대응하는 정의 콜과의 사이에 주고 받음을 실시하는 데이터는 모두 UTF-16 인코딩으로 간주해집니다.

 

dty (IN)

: 데이터 형입니다. 이름 첨부 데이터형(SQLT_NTY) REF(SQLT_REF)는 환경이 오브젝트 모드로 초기화되고 있는 경우만 유효합니다.

SQLT_CHAR SQLT_LNG CLOB 열에 SQLT_BIN 라고 SQLT_LBI BLOB 열로 지정 할 수 있습니다.

 

indp (IN)

: 인디케이터(indicator) 변수 또는 배열에의 포인터입니다. 스칼라 데이터형의 경우는 sb2 또는 sb2 의 배열에의 포인터입니다. SQLT_NTY 정의의 경우는 무시됩니다. SQLT_NTY 정의로는 이름 첨부 데이터형의 인디케이터(indicator) 구조체 또는 이름 첨부 데이터형의 인디케이터(indicator) 구조체 배열의 포인터는 후속의 OCIDefineObject() 콜에 의해 관련 지을 수 있습니다.

 

rlenp (IN/OUT)

: 패치 된 데이터의 길이의 배열의 포인터입니다.  rlenp 안의 각 요소는 패치 후의 행에 있는 대응하는 요소의 데이터 길이입니다( 코드 포인트의 경우는 valuep 의 데이터가 Unicode 가 아닌 한 바이트 단위입니다).

 

rcodep (OUT)

: 열 레벨의 리턴 코드의 배열의 포인터입니다.

 

mode (IN)

: 다음의 모드가 유효합니다.

_ OCI_DEFAULT - 이것은 디폴트의 모드입니다.

_ OCI_DYNAMIC_FETCH - 패치 할 경우에 데이터를 동적으로 할당할 필요가 있다. 어플리케이션에서는 이 모드를 사용할 필요가 있습니다. 유저는 OCIDefineDynamic() 을 추가로 콜 해 동적으로 할당할 수 있었던 버퍼를 받아 들이기 위해 호출 되는 콜백 함수를 설정할 수 있습니다. 이 모드에서는 valuep value_sz 파라미터는 무시됩니다.

 

코멘트

이 콜은 Oracle부터 꺼내진 데이터를 받는 출력 버퍼를 정의합니다. 이 정의는 SELECT 문장이 OCI  어플리케이션에 데이터를 되돌릴 때 필요한 로컬 스택 입니다.

이 콜은 선택 리스트 항목 용의 정의 핸들의 암묵적인 할당도 실시합니다. NULL 포인터가 *defnpp에게 건네지면 OCI 에서는 OCIHandleAlloc() 또는 OCIDefineByPos()의 콜로 이전에 할당할 수 있던 유효한 핸들을 지시합니다. 다른 주소에 대해서 핸들을 재정의하고 있는 어플리케이션의 경우는 이것이 들어맞기 때문에 복수의 패치에 같은 정의 핸들을 재이용할 수 있습니다. 열을 패치 하기 위한 속성의 정의는 1개 이상의 콜로 실행됩니다. 최초의 콜은 패치를 지정하기 위해서 필요한 최소한의 속성을 정의하는 OCIDefineByPos() 입니다. 어떤 종류의 데이터 형 또는 패치 모드에서는 OCIDefineByPos()의 콜의 뒤에 다음의 추가 정의 콜이 필요합니다.

 

_ 수열을 배열 패치하기 위한 스킵 파라미터를 설정하려면 ,

  CIDefineArrayOfStruct() 의 콜이 필요합니다.

 

_ 이름 첨부 데이터형(즉 오브젝트나 콜렉션) 또는 REF 의 패치에 적절한 속성을 설정하려면 OCIDefineObject() 의 콜이 필요합니다. 이 경우

   OCIDefineByPos() 안의 데이터 버퍼 포인터는 무시됩니다.

 

_ 이름 첨부 데이터형의 열을 가지는 복수 행을 패치 하려면 OCIDefineByPos()의 후에

   OCIDefineArrayOfStruct() OCIDefineObject() 의 양쪽 모두를 콜 할 필요가 있습니다.

 

LOB 정의에서는 버퍼 포인터는 OCIDescriptorAlloc() 콜에 의해 할당되는 OCILobLocator 형의 LOB locator의 포인터로 해 주세요.  LOB 열에는 LOB 의 값은 아니고 항상 LOB locator가 돌아옵니다.  LOB 값은 패치   locator 대해 OCI LOB 콜을 사용하여 패치 할 수 있습니다. 이것과 같은 방식이 모든 기술자 데이터 형으로 사용됩니다.

NCHAR(고정장가변장)에서는 버퍼 포인터는 필요한 NCHAR 문자를 보관 유지하는데 충분한 바이트 배열을 지시하고 있을 필요가 있습니다.

NESTED TABLE 의 열은 다른 모든 이름 첨부 데이터 형과 같이 정의 및 패치 됩니다.

기술자 또는 locator의 배열을 정의할 경우에 기술자 또는 locator의 포인터 배열을 건넬 필요가 있습니다.

캐릭터열의 배열을 정의할 경우에 문자 버퍼 배열을 건네줄 필요가 있습니다.

이 콜의 mode 파라미터에 OCI_DYNAMIC_FETCH 가 설정되었을 경우는 클라이언트 어플리케이션으로부터 실행 시에 데이터를 동적으로 패치 할 수 있습니다.  런타임 데이타는 다음의 2개의 방법으로 준비할 수 있습니다.

 

_ OCIDefineDynamic() 의 후속 콜에 의해 등록할 필요가 있는 유저 정의 함수를 사용하는 콜백 / 클라이언트 라이브러리가 패치 한 데이터를 되돌리기 위해서 버퍼가 필요하게 되면이 콜백이 불려 져 준비된 런타임 버퍼가 데이터의 일부 또는 전부를 되돌립니다.

 

_ OCI 에서 제공되는 콜을 사용하는 폴링 메카니즘. 콜백이 정의되어 있지 않는 경우는 이 모드가 됩니다. 이 경우 페치 콜에 의해 OCI_NEED_DATA 에러 코드가 되돌려져 데이터는 부분 단위의 폴링 메소드로 준비됩니다.

 

관련 함수

OCIDefineArrayOfStruct(), OCIDefineDynamic(), OCIDefineObject()

 

관련 항목:

_ OCI_DYNAMIC_FETCH 모드의 사용 방법의 자세한 것은 5-44 페이지의 「런타임·데이터 할당과 부분 단위 조작」을 참조해 주세요.

_ 정의의 자세한 것은 5-18 페이지의 「정의」 참조해 주세요.

 

 

 

 

 

 

 

OCILogoff()

 

용도

이 함수는 OCILogon2() 또는 OCILogon() 을 사용해 취득한 세션을 해방하기 위해서 사용합니다.

 

구문

sword OCILogoff ( OCISvcCtx *svchp

OCIError *errhp );

 

파라미터

svchp (IN)

: OCILogon() 또는OCILogon2() 의 콜에 사용된 서비스 문맥 핸들 입니다.

 

errhp (IN/OUT)

: 에러 발생시의 진단 정보를 위해서 CIErrorGet()에 건네주는 에러 핸들입니다.

 

코멘트

이 함수는 OCILogon2() 또는 OCILogon()을 사용해 취득한 세션을 해방 하기 위해 사용합니다.  OCILogon() 을 사용했을 경우 이 함수는 그 접속 및 세션을 종료합니다.  OCILogon2() 사용했을 경우 이 콜의 동작은 대응하는 OCILogon2() 함수가 콜 되었을 때의 mode 에 의해 정해집니다.  디폴트로는 세션/ 접속을 클로우즈 합니다.  접속 풀링의 경우 이 함수는 세션을 클로즈 해 접속을 풀에 되돌립니다.  세션 풀링의 경우 이 함수는 세션과 접속의 페어를 풀에 되돌립니다.

 

관련 함수

OCILogon(), OCILogon2()

 

관련 항목 : 어플리케이션에서의 로그 온 및 로그 오프의 자세한 것은 2-26 페이지의 「어플리케이션의 초기화, 접속 및 세션 작성」을 참조해 주세요.

 

 

 

 

 

 

 

OCIHandleFree()

 

용도

이 콜은 핸들의 할당을 명시적으로 해제합니다.

 

구문

sword OCIHandleFree ( dvoid *hndlp,

ub4 type );

 

파라미터

hndlp (IN)

: OCIHandleAlloc() 에 의해 할당할 수 있는 핸들입니다.

 

type (IN)

: 해방하는 기억 역의 형태를 지정합니다. 지정하는 형태를 다음에 나타냅니다.

_ OCI_HTYPE_CPOOL - 접속 풀 핸들

_ OCI_HTYPE_ENV - 환경 핸들

_ OCI_HTYPE_ERROR - 에러 리포트 핸들

_ OCI_HTYPE_SVCCTX - 서비스 문맥 핸들

_ OCI_HTYPE_STMT - 문장(어플리케이션 요구) 핸들

_ OCI_HTYPE_DESCRIBE - 선택 리스트 기술 핸들

_ OCI_HTYPE_SERVER - 서버 핸들

_ OCI_HTYPE_SESSION - 유저 세션 핸들

_ OCI_HTYPE_TRANS - 트랜잭션(transaction) 핸들

_ OCI_HTYPE_COMPLEXOBJECT - 복합 오브젝트 검색 핸들

_ OCI_HTYPE_SECURITY 시큐러티 핸들

_ OCI_HTYPE_SUBSCR - 예약 구독 핸들

_ OCI_HTYPE_DIRPATH_CTX 다이렉트 패스 문맥 핸들

_ OCI_HTYPE_DIRPATH_COLUMN_ARRAY 다이렉트 패스 열 배열 핸들

_ OCI_HTYPE_DIRPATH_STREAM 다이렉트 패스 스트림 핸들

_ OCI_HTYPE_PROCESS - 프로세스 핸들

 

코멘트

이 콜은 핸들에 대응 되어 있는 기억 역으로 type 파라미터로 지정된 형태에 해당하는 것을 해방합니다.

이 콜은 OCI_SUCCESS 또는 OCI_INVALID_HANDLE 을 되돌립니다.

핸들은 모두 명시적으로 할당 해제할 수 있습니다.  OCI 에서는 부모 핸들의 할당을 해제하면 자식 핸들의 할당이 자동적으로 해제됩니다.

 

관련 함수

OCIHandleAlloc(), OCIEnvInit()

[출처] 오라클 OCI|작성자 푸른바다

 

반응형
반응형

원본 글 : http://blog.daum.net/hdongle/79096

저번 회사 재직중에는 오라클 접속프로그램 제작시에는 오라클 클라이언트 깔고 어쩌고 하는게 귀찮아서

jdbc thin driver로 접속을 했었죵

하지만 며칠전 MFC로 mssql 접속하는 프로그램을 만들 일이 있었는데 DB가 오라클이란다...젠장...

하여 어케 접속할까 하다가 OCI방식으로 접속하는 방법을 검색해서 한번 적용해 봤음...

1. 다운로드
1-1) 오라클 사이트 접속(http://www.oracle.com/index.html)
1-2) 다운로드 -> Instant Client
1-3) 개발하고자 하는 환경을 받는다
나는 Instant Client for Microsoft Windows (32-bit)
1-4) Accept License Agreement 라디오버튼 체크해주시고
1-5) 나는 오라클 10g 클라이언트 프로그램을 해야 하므로
1-5-1) instantclient-basic-win32-10.2.0.5.zip <= dll파일등
1-5-2) instantclient-sdk-win32-10.2.0.5.zip <= 라이브러리와 헤더파일

물론 다운로드 받을려면 계정은 있어야 한다. 물론 공짜다..ㅋㅋㅋ

2. 프로젝트 생성 및 라이브러리 설정
2-1) 프로젝트를 하나 만든다. 프로젝트 이름은 E:\Work\Test\폴더 아래에 "OciTest" 콘솔로 만들어보자


2-2) 프로젝트 내에 oci라는 폴더를 하나 만들자(여기서는 E:\Work\Test\OciTest\OciTest\oci)
2-2) (1-5-2)에서 다운로드 받았던 파일들 중에 압축을 해제하면 instantclient_10_2\sdk 폴더 아래에 include, lib 폴더를
방금 만들었던 oci 폴더에 복사하자


2-4) 1-5-1에서 다운로드 받았던 파일들중에 dll파일들을 E:\Work\Test\OciTest\OciTest폴더에 복사하자


2-5) 프로젝트 속성페이지에서
2-5-1) 구성속성 -> C/C++ -> General의 Additional Directory : "./oci/include"


2-5-2) 구성속성 -> Linker -> General의 Additional Library Directory : "./oci/lib/msvc"


2-5-3) 구성속성 -> Linger -> Input의 Additional Dependencies : "oci.lib oraocci10.lib"


3. 아래와 같이 코드를 작성한다. 웹에서 어디선가 갖다 배낀것임당..-_- 태클사절

#include "stdafx.h"
#include <occi.h>

using namespace oracle::occi;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
Environment *env = 0;
Connection *conn = 0;
Statement *stmt = 0;
ResultSet *rs = 0;

try
{
env = Environment::createEnvironment(Environment::DEFAULT);
conn = env->createConnection("system", "xxxxxx", "orcl");

stmt = conn->createStatement("select * from tab");

rs = stmt->executeQuery();

while ( rs->next() )
{
std::string name2 = rs->getString(2);
printf("%s\n", name2.c_str());
}
stmt->closeResultSet(rs);

conn->terminateStatement(stmt);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
}
catch (oracle::occi::SQLException ex)
{
printf("exception code (%d), %s\n", ex.getErrorCode(), ex.what());
if (rs)
stmt->closeResultSet(rs);
if (stmt)
conn->terminateStatement(stmt);
if (conn)
env->terminateConnection(conn);
if (env)
Environment::terminateEnvironment(env);
}

return 0;
}

4. createConnection 문에서 id, password, 그리고 sid가 들어가는데
sid는 배포시에 오라클 클라이언트 없이 동작하려면 tnsnames.ora파일을 필요로 한다.
현재 폴더에 생성해서 아래의 내용을 입력한다(host에 127.0.0.1대신에 실제 ip주소를 넣어준다)

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)

다음은 프로젝트 파일이고....

OciTest.zip

oraociei.dll은 사이즈가 큰 관계로 제외되었음.. 빌드하기 위해서는 이 파일을 추가시켜줘야 함

반응형
반응형

원본 글 : http://blog.naver.com/poiq1?Redirect=Log&logNo=80141874162


이번 OCCI를 사용하다가... 큰 문제점에 봉착...ㅇㅂㅇ

쿼리문을 돌리고 나서 전체 row값을 가져온 후 데이터를 처리해야 하는데....

아무리 뒤져봐도 OCCI에서 그런 펑션을 찾기란..... 어려웟다...

꼼수로 쿼리문 두번 돌려서 한번은 총 row가져오고 두번째 쿼리때 데이터 처리했다가... 아무리 생각해봐도 이건 아니다 싶어 변경.

(ps. 혹시 OCCI에서 쓸수 있는법을 아시는분은 쪽지좀....)

아무튼 OCI에선 해당 기능을 가진 OCI_GetRowCount(rs); 함수가 있기 때문에 전면 OCCI -> OCI로 교체!!!

이거 또 처음 써봐서.... 고생고생....

OCI 라이브러리 다운로드

http://orclib.sourceforge.net/download/

여기 들어가보면 OCI 윈도우용과 리눅스 용을 받을 수 있다..!!!

뿐만 아니라 설치방법까지...우후후후...

간단하게 최신버전 3.9.2 버전을 받은 후

아무대나 압축 풀어보고(잘 몰라서 ORACLE_HOME경로에 풀엇음)

그 후 설명대로 폴더에 들어가서

./configure

make

문제는 여기서 발생....

make도중 오류가 발생해 버렷다.......

........

글을 유심히 보니 LD_LIBRARY_PATH 가 안맞아서 나는 오류

현재 나의 LD_LIBRARY_PATH=$ORACLE/lib 로 되여 있지만

make 오류난 곳을 보니 $ORACLE/lib32로 되어 있엇음.

따라서 export LD_LIBRARY_PATH 설정을 다시 해봐도 동일한 오류....

쿨럭;; 그래서 lib에 필요한 파일을 lib32에 넣어줌으로서 해결;;;

그 후 make install로 설치 완료

OCI관련 문구는 해당 사이트의 문서를 받아서 봐도 되고

http://orclib.sourceforge.net/doc/html/index.html

해당 사이트를 참조해도 된다.

[출처] OCI 설정|작성자 소류

반응형
반응형

원본 글 : http://fotog.tistory.com/387
===========================================================================================================================

Oracle 10g Client를 설치할 일이 생겨서, 오라클 7 시절부터 수도 없이 설치했던 Oracle Client 라서
별 부담감 없이 그냥 CD를 구해서 설치를 시작했다.

처음 Oracle 10g client CD에 있는 setup.exe를 실행하면,
아래의 기존 9i client 설치할때와 비슷한 화면을 만난다.

사용자 삽입 이미지

But!! 다음 화면에서 못보던 설치 유형이 추가되었다....

InstantClient!! 이전 9i에서 런타임 모듈 설치가 200MB 가 넘지 않았는데, 10g에서는 런타임이 460MB다.
그저 오라클접속만 하면 되는 Client를 설치하는데, 500MB 가까운 하드를 차지한다는게 낭비로 느껴진다.
자연스럽게 못보던 Instant Client 쪽으로 눈이 돌아간다..
Instant Client 이면 충분하겠지 생각하고, 다음 버튼을 누르고 설치를 했다..

사용자 삽입 이미지

용량이 작아서 그런지 설치는 순식간에 끝나버린다.
하지만 9i 이전에 나오던 net*client관련 설정이 나오지 않는다.

tnsname.ora 파일은 어디에 넣어야 되지?.....

그 이후의 진행사항은 아래 블로그에서 답을 얻었다...

http://blog.naver.com/oct8/100042831960

글을 올려준 분에게 감사할 따름이다...^^

아래는 블로그 내용을 복사해 온 것이다.

----------------------------------------------------------------------------------------------------

OCI (Oracle Call Interface)를 사용하여 오라클 데이터베이스에 접속하는 응용프로그램은 배포시 Oracle Client (SQL*Net)를 설치해야 하는 단점이 있습니다.

특히, Oracle Client는 용량이 500M에 육박하기 때문에 패키징화 하여 배포한다 해도 여간 부담스러운 일이 아닐수 없습니다.

이러한 문제를 해결하기 위해 오라클에서는 데이터베이스 접속에 필요한 최소한의 파일들을 모아 오라클 인스턴트 클라이언트를 배포하고 있습니다.

오라클 인스턴트 클라이언트는 그 용량이 50M 내외이고 무료로 사용할 수 있기 때문에 개발자 및 사용자에게 배포 및 설치에 대한 부담을 덜어줄 수 있습니다.

오라클 인스턴트 클라이언트 설치방법 (Windows OS 기준)

(1) 오라클 홈페이지에 접속하여 프로그램을 다운로드 받습니다.

http://www.oracle.com/technology/software/tech/oci/instantclient/index.html

(2) 다운로드 받은 파일의 압축을 해제합니다.

(이하 압축 해제경로를 C:\instantclient_10_2 이라 가정함)

(3) 시스템 환경변수에 다음의 변수들을 추가합니다.

PATH = %PATH%;C:\instantclient_10_2
ORACLE_HOME = C:\instantclient_10_2
TNS_ADMIN = C:\instantclient_10_2
NLS_LANG = KOREAN_KOREA.KO16MSWIN949

(4) C:\instantclient_10_2 경로에 tnsnames.ora 파일을 생성합니다.

반응형

'DB > Oracle' 카테고리의 다른 글

오라클 OCI 함수 사용법  (0) 2013.04.16
OCI를 이용한 오라클 접속  (0) 2011.11.04
OCI 설정.  (0) 2011.11.03
Toad를 사용하여 Oracle XE 접속하기  (0) 2011.09.05
오라클 인스턴스 클라이언트 설치를 해보자  (0) 2011.08.21
반응형



Oracle Tip

먼저 오라클 서버쪽 상태를 확인해보자.
-----------------------------------------------------------------------------------------------
1. 먼저 리스너의 상태를 확인해야 한다.

lsnrctl status  리스너 상태 확인
lsnrctl start     리스너 시작
lsnrctl stop     리스너 정지

listener.ora 에 해당 서버의 아이피와 뚫어줄 포트를 설정해 놓으면 해당 포트로 리스닝을 하게 된다.
listener.ora 파일을 수정하면 저장한 뒤 반드시 오라클 리스너를 재시작할 것..
-------------------------------------------------------------------------------------------------
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
      (ADDRESS = (PROTOCOL = TCP)(HOST = (현재 IP 기입))(PORT = 1521))   -- 추가해 놓을 것.
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)
-------------------------------------------------------------------------------------------------

tnsping 아이피 포트 또는
telnet 아이피 포트
를 이용해서 현재 서버의 리스너가 정상적으로 동작하고 있는지 확인해보자.




반응형
반응형

오라클 인스턴스 클라이언트 설치를 해보자

----------------------------------------------
출처 : http://yang2s.tistory.com/137

오라클 ... 이놈.. 설치 하기 너무 어렵네요...

클라이언트만 설치 하려고 해도 ... 어렵 ㅠㅠ

그런데 instance client 이건 그나마 설치? 설정?

간단 하고 사용하기도 편리 하네요 ^^

우선 오라클 홈페이지 가서 다운로드 합니다.

다운로드 항목 들어 가시면 아래 항목 보일겁니다.


필히 필요한것이
BASICSQL*PLUS입니다


버전 마춰서 다운 로드 받고 압축만 풀면 끝이네요

그리고 환경변수 잡아 줍니다.

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

export PATH
SQL_PLUS=/압축푼 경로; export SQL_PLUS
PATH=$SQL_PLUS:$PATH; export PATH
LD_LIBRARY_PATH=$SQL_PLUS; export LD_LIBRARY_PATH
TNS_ADMIN=/압축푼 경로; export TNS_ADMIN;
NLS_LANG=American_America.KO16KSC5601; export NLS_LANG



tnsnames.ora 파일을 압축푼 경로에 만들어 줍니다.

접속할 SID명 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 접속할 주소 아이피 )(PORT = 포트 1521 <- 기본 포트))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = 접속할SID)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

sqlplus id/password@SID

이렇게 접속 하거나
sqlplus scott/tiger@211.111.111.111:1521/testdb 이렇게 접속 하면 됩니다 ㅎㅎ
반응형

+ Recent posts