OCI 공부중인데요...

peccavi의 이미지

안녕하세요.

OCI(Oracle Call Interface)를 공부하고 있는데요..

개념이 아직 잘 서지 않네요..

olog() 함수와
OCILogon() 함수의 차이점이 뭔가요?
(제발 olog()를 단순히 랩핑한 함수가 OCILogon()이길 바랍니다.)

그리고.. olog()를 써서 코딩하면, OCI를 썼다고 할 수 있는건가요?

자세한 레퍼런스 메뉴얼은 많은데, 초보자들이 볼만한 문서 찾기가

여간 쉬운일이 아니네요..

답변좀 부탁드립니다.

vinus의 이미지

질문의 내용과 상관 없는 글이 될지도 모르겠습니다만...
OCI로 프리픽스가 붙은 쪽이 OCI라이버러리 소속이고, 안붙은 쪽이 누군가 만든 레퍼 일겁니다.

제가 이전에 만든 OCI용의 로그인 함수가 있어 올려 봅니다. 잘못된 점이 있다면, 바로 잡아 주십시오.
전에 OCI프로그래머 레퍼런스인가 뭔가 보면서 작성 했었는데... 당시 기억으로는 동작 했었던 기억이 있습니다. 물론 레퍼런스에 좀더 자세한 사항이 나와 있으며, 어쩌면, 예제 프로그램이 있을수도 있습니다.

/*
int odb_login()
tns: 오라클 TNS 명
username: 오라클 사용자 이름
passwd  : 사용자 암호
mode    : OCIEnv 핸들타입.
renvhp  : 리턴 되어 지는 OCIEnv  : Env 핸틀 포인터.
rusrhp  : 리턴되어 지는 OCISession : 세션 핸들 포인터.
rsrvhp  : 피턴되어 지는 OCIServer : 서버 핸들 포인터.
rsvchp  : 리턴되어 지는 OCISvcCtx : 리턴되어 지는 서비스 컨텍스트 핸들 포인트
rerrhp  : 리턴되어 지는 OCIError  : 리턴되어 지는 에러 핸들 포인터.

리턴: 성공시 : 0
실패시 : 에러 번호.
         errhp를 통해서 에러의 구체적인 값이 전달된다.

descript: 이 함수는 오라클데이타 베이스에 로그인하고 몇가지 핸들을 되돌린다.
우선 어느 핸들들이 실제 적으로 필요한지 모르기 때문에 사용, 혹은 필요한 모든
핸들들을 되돌리지만 차후 필요한 핸들이 정의가 되면 몇가지가 삭제 될 수 도 있다.
*/

int odb_login(tns, username, passwd, mode ,renvhp, rusrhp, rsrvhp, rsvchp, rerrhp)
text * tns ;
text * username;
text *passwd;
sb4 mode;
OCIEnv **renvhp;
OCISession ** rusrhp;
OCIServer ** rsrvhp;
OCISvcCtx ** rsvchp;
OCIError ** rerrhp;

{
        sword ecode;
        OCIEnv *envhp;
        dvoid *tmp;
        OCIServer * srvhp;
        OCIError * errhp;
        OCISvcCtx * svchp;
        OCISession *usrhp;

        /* 핸들을 초기화 한다. */
        if((ecode=OCIEnvCreate(&envhp, mode,
                    (dvoid *)0, (dvoid *)0, (dvoid *)0, (dvoid *)0, 0, (dvoid **)0)))
                return ecode;

        /* 에러 핸들 초기화 */
        if((ecode=OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&errhp,
                       OCI_HTYPE_ERROR, 0, (dvoid **) 0)))
        {

                *rerrhp=errhp;
                return ecode;
        }

        if((ecode =OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, (ub4) OCI_HTYPE_SERVER,
                                     52, (dvoid **) &tmp)))
        {
                *rerrhp=errhp;
                return ecode;
        }

        /*서버 서비스 연결하기 */
        if((ecode=OCIServerAttach (srvhp, errhp, (text *)tns,
                        strlen (tns), OCI_DEFAULT)))
        {
                *rerrhp=errhp;
                return ecode;
        }

        /* 서버 context만들기 */
        if((ecode =OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp, (ub4) OCI_HTYPE_SVCCTX,
                                    52, (dvoid **) &tmp)))
        {
                *rerrhp=errhp;
                return ecode;
        }

        if((ecode= OCIAttrSet ((dvoid *)svchp, OCI_HTYPE_SVCCTX,
                   (dvoid *)srvhp, (ub4) 0, OCI_ATTR_SERVER, errhp)))
        {
                *rerrhp=errhp;
                return ecode;
        }

        /* 사용자 context 핸들 만들기 */
        if((ecode=OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&usrhp,
                       OCI_HTYPE_SESSION, 0, (dvoid **) 0)))
        {
                *rerrhp=errhp;
                return ecode;
        }

        /* 사용자 이름과 암호를 셋팅힌다.. */

        if((ecode=OCIAttrSet ((dvoid *)usrhp, OCI_HTYPE_SESSION, (dvoid *)username,
                   (ub4)strlen(username), OCI_ATTR_USERNAME, errhp)))
        {
                *rerrhp=errhp;
                return ecode;
        }

        if((ecode=OCIAttrSet ((dvoid *)usrhp, OCI_HTYPE_SESSION, (dvoid *)passwd,
                   (ub4)strlen(passwd), OCI_ATTR_PASSWORD, errhp)))
        {

                *rerrhp=errhp;
                return ecode;
        }

        /* 서버에 로그인 한다. */
        if((ecode=OCISessionBegin ((dvoid *) svchp, errhp, usrhp,
                        OCI_CRED_RDBMS, OCI_DEFAULT)))
        {

                *rerrhp=errhp;
                return ecode;
        }

        if((ecode=OCIAttrSet (  (dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)usrhp,
                     (ub4) 0, OCI_ATTR_SESSION, errhp)))
        {

                *rerrhp=errhp;
                return ecode;
        }

        *renvhp=envhp;
        *rusrhp=usrhp;
        *rsrvhp=srvhp;
        *rsvchp=svchp;
        *rerrhp=errhp;
        return OCI_SUCCESS;
}

>>>행복한 웃음<<<

maple의 이미지

olog()는 오라클 버전 7, OCI*()는 버전8입니다.
둘다 OCI지만 혼합해서 써서는 안되겠죠.

그러니까 wrapping한게 아니고 아예 API버전이 다릅니다.

버전 8은 대부분 OCI*()입니다. OCIInitialize(), OCIEnvInit(), OCISessionBegin() 등등...
버전 7은 o*() 이런식이죠. olog(), oparse(), oopen(), ologof(), oclose()등등
그리고 버전 7은 OCI라기보다는 오라클함수라고 부르죠

PHP 빌드시 버전 7은 --with-oracle, 버전8은 --with-oci8입니다.

o*()를 써도 OCI를 썼다고는 할 수 있겠죠. 다만 하위버전을 썼을 뿐이죠.
PHP소스의 ext아래에 oracle과 oci8을 보시면 많은 도움이 되실겁니다.
실제로 OCI가 ProC에 비해서 여러면에서 유리하고 Flexible하다고 하죠.

vinus의 이미지

음..
그런 차이가 있었군요.
잘못된 내용을 올린것 같습니다. 바로 잡아 주셔서 감사 합니다.

>>>행복한 웃음<<<

peccavi의 이미지

두분 답변 감사드립니다.

제가 지금 c로 작업하고 있는데요, 위의 말씀대로라면 버전7 API를 사용하고 있습니다.

두가지 버전의 API들 간에 어떤 차이점이 있는지 답변좀 부탁드릴께요.
그냥 단순히 코딩의 편리성인지, 아니면 상위버전일수록 성능이 개선되었다 라든지..

번거로우시더라도 답변좀 다시 부탁드립니다..(쌩초보라서요^^)

----
jai guru deva om...

maple의 이미지

OCI8이 이해하거나 사용하기에는 좀 더 까다로웠던거 같네요.

그만큼 제대로 이해하고 라이브러리만 잘 만들면 오라클 함수(버전 7)보다 더 유연하게 사용할 수 있다는 말이겠죠.

가끔씩은 데몬형태로 돌리면 메모리가 조금씩 늘기도 해서 골치아팠던 기억이 ^^;;

어느정도 이해하시면 재미는 있습니다.

ProC는 지금도 잘 모르거든요. 처음부터 OCI를 해서리...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.