반응형

원본 : 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|작성자 푸른바다

 

반응형

+ Recent posts