Archive for the ‘Oracle Database’ Category

  1. Hello, SQLJ World!

    Posted on 4月 7th, 2012 by cx20

    SQLJ

    SQLJ は Oracle Database に対応した Java 用の埋め込み SQL(Embedded SQL)である。類似の製品としては、Pro*C/C++、Pro*COBOL、Pro*FORTRAN、Pro*Pascal 等がある。
    なお、埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。

    ソースコード(SQLJ)

    import java.sql.*;
    import oracle.sqlj.runtime.Oracle;
     
    #sql iterator MessageIter ( String MESSAGE );
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Oracle.connect("jdbc:oracle:oci:@", "scott", "tiger");
            MessageIter iter;
            #sql iter = { SELECT 'Hello, SQLJ World!' AS Message FROM DUAL };
            while ( iter.next() ) {
                System.out.println( iter.MESSAGE() );
            }
        }
    }

    上記コードは、SQLJ トランスレータ により、以下の Java のコードが生成される。

    ソースコード(Java)

    /*@lineinfo:filename=Hello*//*@lineinfo:user-code*//*@lineinfo:1^1*/import java.sql.*;
    import oracle.sqlj.runtime.Oracle;
     
    /*@lineinfo:generated-code*//*@lineinfo:4^1*/
     
    //  ************************************************************
    //  SQLJ iterator declaration:
    //  ************************************************************
     
    class MessageIter
    extends sqlj.runtime.ref.ResultSetIterImpl
    implements sqlj.runtime.NamedIterator
    {
      public MessageIter(sqlj.runtime.profile.RTResultSet resultSet)
        throws java.sql.SQLException
      {
        super(resultSet);
        MESSAGENdx = findColumn("MESSAGE");
        m_rs = (oracle.jdbc.OracleResultSet) resultSet.getJDBCResultSet();
      }
      private oracle.jdbc.OracleResultSet m_rs;
      public String MESSAGE()
        throws java.sql.SQLException
      {
        return (String)m_rs.getString(MESSAGENdx);
      }
      private int MESSAGENdx;
    }
     
     
    //  ************************************************************
     
    /*@lineinfo:user-code*//*@lineinfo:4^44*/
     
    class Hello {
        public static void main( String[] args ) throws Exception {
            Oracle.connect("jdbc:oracle:oci:@", "scott", "tiger");
            MessageIter iter;
            /*@lineinfo:generated-code*//*@lineinfo:10^9*/
     
    //  ************************************************************
    //  #sql iter = { SELECT 'Hello, SQLJ World!' AS Message FROM DUAL  };
    //  ************************************************************
     
    {
      // declare temps
      oracle.jdbc.OraclePreparedStatement __sJT_st = null;
      sqlj.runtime.ref.DefaultContext __sJT_cc = sqlj.runtime.ref.DefaultContext.getDefaultContext(); if (__sJT_cc==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
      sqlj.runtime.ExecutionContext.OracleContext __sJT_ec = ((__sJT_cc.getExecutionContext()==null) ? sqlj.runtime.ExecutionContext.raiseNullExecCtx() : __sJT_cc.getExecutionContext().getOracleContext());
      try {
       String theSqlTS = "SELECT 'Hello, SQLJ World!' AS Message FROM DUAL";
       __sJT_st = __sJT_ec.prepareOracleStatement(__sJT_cc,"0MessageIter",theSqlTS);
       // execute query
       iter = new MessageIter(new sqlj.runtime.ref.OraRTResultSet(__sJT_ec.oracleExecuteQuery(),__sJT_st,"0MessageIter",null));
      } finally { __sJT_ec.oracleCloseQuery(); }
    }
     
     
    //  ************************************************************
     
    /*@lineinfo:user-code*//*@lineinfo:10^72*/
            while ( iter.next() ) {
                System.out.println( iter.MESSAGE() );
            }
        }
    }/*@lineinfo:generated-code*/

    コンパイル&実行方法

    C:¥> SET PATH=ORACLE_BASEORACLE_HOMEbin;%PATH%
    C:¥> SET CLASSPATH=ORACLE_BASEORACLE_HOMEsqljlibruntime12.jar;
         ORACLE_BASEORACLE_HOMEsqljlibtranslator.jar;
         ORACLE_BASEORACLE_HOMEjdbclibojdbc6.jar;%CLASSPATH%
    C:¥> sqlj Hello.sqlj
    C:¥> java Hello

    実行結果

    Hello, SQLJ World!
  2. Hello, ODP.NET World!

    Posted on 4月 3rd, 2012 by cx20

    ODP.NET

    ODP.NET(Oracle Data Provider for .NET)は、.NET ベースの Oracle Database 接続用 API である。ODAC(Oracle Data Access Component)と呼ばれるパッケージに含まれる。
    .NET 環境での Oracle Database 用データプロバイダとしては、マイクロソフト社が提供する「Microsoft Oracle Client」とオラクル社が提供する「ODP.NET」があるが、現在、「Microsoft Oracle Client」はマイクロソフト社自身が非推奨としており、今後は ODP.NET の使用が推奨されている。

    データプロバイダ 説明
    System.Data.OracleClient .NET Framework Data Provider for Oracle
    Oracle.DataAccess.Client Oracle Data Provider for .NET

    ソースコード(C# + ODP.NET + Oracle)

    using System;
    using Oracle.DataAccess.Client;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Data Source=ORCL;"
                + "User Id=scott;"
                + "Password=tiger";
     
            string sqlStr = "SELECT 'Hello, ODP.NET World!' AS Message FROM DUAL";
     
            OracleConnection con = new OracleConnection(conStr);
            OracleCommand cmd = new OracleCommand(sqlStr, con);
            con.Open();
            OracleDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    コンパイル方法(C#)

    C:¥> csc /r:Oracle.DataAccess.dll Hello.cs

    実行結果

    MESSAGE
    ---------------------
    Hello, ODP.NET World!
  3. Hello, oo4o World!

    Posted on 4月 2nd, 2012 by cx20

    oo4o

    oo4o(Oracle Objects for OLE)は、COM ベースの Oracle Database 接続用 API である。
    Windows 環境で VB による開発に用いられることが多い。

    ソースコード(VBScript + oo4o + Oracle)

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim ses
        Dim db
        Dim rs
        Set ses = CreateObject("OracleInProcServer.XOraSession")
        Set db = ses.OpenDatabase( "ORCL", "scott/tiger", 0 )
        Set rs = db.CreateDynaset( "SELECT 'Hello, oo4o World!' AS Message FROM DUAL", 4)
        While NOT rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
       Wend
    End Sub

    実行方法(Windows)

    C:¥> CScript //Nologo Hello.vbs

    実行結果

    MESSAGE
    ------------------
    Hello, oo4o World!
  4. Hello, Pro*C/C++ World!

    Posted on 4月 1st, 2012 by cx20

    Pro*C/C++

    Pro*C/C++ は Oracle Database に対応した C/C++ 用の埋め込み SQL(Embedded SQL)である。類似の製品としては、Pro*COBOL、Pro*FORTRAN、Pro*Pascal 等がある。Pro*C/C++ は、UNIX 環境で C/C++ を用いた開発に使用されることが多い。
    なお、埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。

    ソースコード

    #include <stdio.h>
     
    EXEC SQL INCLUDE SQLCA;
     
    int main( int argc, char* argv[] )
    {
        EXEC SQL BEGIN DECLARE SECTION;
        char username[] = "scott";
        char password[] = "tiger";
        char message[32];
        EXEC SQL END DECLARE SECTION;
        EXEC SQL CONNECT :username IDENTIFIED BY :password;
        EXEC SQL DECLARE C1 CURSOR FOR
            SELECT 'Hello, Pro*C/C++ World!' AS Message FROM DUAL;
        EXEC SQL OPEN C1;
        EXEC SQL WHENEVER NOT FOUND DO BREAK;
        for (;;)
        {
            EXEC SQL FETCH C1 INTO :message;
            printf("Messagen");
            printf("-----------------------n");
            printf("%sn", message);
        }
        EXEC SQL CLOSE C1;
        EXEC SQL COMMIT RELEASE;
        return 0;
    }

    上記コードは、proc プリプロセッサにより、以下の C言語のコードが生成される。

    ソースコード

    /* Result Sets Interface */
    #ifndef SQL_CRSR
    #  define SQL_CRSR
      struct sql_cursor
      {
        unsigned int curocn;
        void *ptr1;
        void *ptr2;
        unsigned int magic;
      };
      typedef struct sql_cursor sql_cursor;
      typedef struct sql_cursor SQL_CURSOR;
    #endif /* SQL_CRSR */
    /* Thread Safety */
    typedef void * sql_context;
    typedef void * SQL_CONTEXT;
    /* Object support */
    struct sqltvn
    {
      unsigned char *tvnvsn; 
      unsigned short tvnvsnl; 
      unsigned char *tvnnm;
      unsigned short tvnnml; 
      unsigned char *tvnsnm;
      unsigned short tvnsnml;
    };
    typedef struct sqltvn sqltvn;
    struct sqladts
    {
      unsigned int adtvsn; 
      unsigned short adtmode; 
      unsigned short adtnum;  
      sqltvn adttvn[1];       
    };
    typedef struct sqladts sqladts;
    static struct sqladts sqladt = {
      1,1,0,
    };
    /* Binding to PL/SQL Records */
    struct sqltdss
    {
      unsigned int tdsvsn; 
      unsigned short tdsnum; 
      unsigned char *tdsval[1]; 
    };
    typedef struct sqltdss sqltdss;
    static struct sqltdss sqltds =
    {
      1,
      0,
    };
    /* File name & Package Name */
    struct sqlcxp
    {
      unsigned short fillen;
               char  filnam[9];
    };
    static const struct sqlcxp sqlfpn =
    {
        8,
        "hello.pc"
    };
    static unsigned int sqlctx = 18323;
    static struct sqlexd {
       unsigned int   sqlvsn;
       unsigned int   arrsiz;
       unsigned int   iters;
       unsigned int   offset;
       unsigned short selerr;
       unsigned short sqlety;
       unsigned int   occurs;
          const short *cud;
       unsigned char  *sqlest;
          const char  *stmt;
       sqladts *sqladtp;
       sqltdss *sqltdsp;
                void  **sqphsv;
       unsigned int   *sqphsl;
                int   *sqphss;
                void  **sqpind;
                int   *sqpins;
       unsigned int   *sqparm;
       unsigned int   **sqparc;
       unsigned short  *sqpadto;
       unsigned short  *sqptdso;
       unsigned int   sqlcmax;
       unsigned int   sqlcmin;
       unsigned int   sqlcincr;
       unsigned int   sqlctimeout;
       unsigned int   sqlcnowait;
                  int   sqfoff;
       unsigned int   sqcmod;
       unsigned int   sqfmod;
                void  *sqhstv[4];
       unsigned int   sqhstl[4];
                int   sqhsts[4];
                void  *sqindv[4];
                int   sqinds[4];
       unsigned int   sqharm[4];
       unsigned int   *sqharc[4];
       unsigned short  sqadto[4];
       unsigned short  sqtdso[4];
    } sqlstm = {12,4};
    /* SQLLIB Prototypes */
    extern void sqlcxt (void **, unsigned int *,
                        struct sqlexd *, const struct sqlcxp *);
    extern void sqlcx2t(void **, unsigned int *,
                        struct sqlexd *, const struct sqlcxp *);
    extern void sqlbuft(void **, char *);
    extern void sqlgs2t(void **, char *);
    extern void sqlorat(void **, unsigned int *, void *);
    /* Forms Interface */
    static const int IAPSUCC = 0;
    static const int IAPFAIL = 1403;
    static const int IAPFTL  = 535;
    extern void sqliem(unsigned char *, signed int *);
     static const char *sq0002 = 
    "select 'Hello, Pro*C World!' Message  from DUAL            ";
    typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
    typedef struct { unsigned short len; unsigned char arr[1]; } varchar;
    /* cud (compilation unit data) array */
    static const short sqlcud0[] =
    {12,4130,838,0,0,
    5,0,0,0,0,0,27,12,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,10,0,0,1,10,0,0,
    36,0,0,2,59,0,9,15,0,0,0,0,0,1,0,
    51,0,0,2,0,0,13,19,0,0,1,0,0,1,0,2,97,0,0,
    70,0,0,2,0,0,15,24,0,0,0,0,0,1,0,
    85,0,0,3,0,0,30,25,0,0,0,0,0,1,0,
    };
    #include <stdio.h>
    /* EXEC SQL INCLUDE SQLCA;
     */ 
     
    #ifndef SQLCA
    #define SQLCA 1
     
    struct   sqlca
             {
             /* ub1 */ char    sqlcaid[8];
             /* b4  */ int     sqlabc;
             /* b4  */ int     sqlcode;
             struct
               {
               /* ub2 */ unsigned short sqlerrml;
               /* ub1 */ char           sqlerrmc[70];
               } sqlerrm;
             /* ub1 */ char    sqlerrp[8];
             /* b4  */ int     sqlerrd[6];
             /* ub1 */ char    sqlwarn[8];
             /* ub1 */ char    sqlext[8];
             };
    #ifndef SQLCA_NONE 
    #ifdef   SQLCA_STORAGE_CLASS
    SQLCA_STORAGE_CLASS struct sqlca sqlca
    #else
             struct sqlca sqlca
    #endif
     
    #ifdef  SQLCA_INIT
             = {
             {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '},
             sizeof(struct sqlca),
             0,
             { 0, {0}},
             {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '},
             {0, 0, 0, 0, 0, 0},
             {0, 0, 0, 0, 0, 0, 0, 0},
             {0, 0, 0, 0, 0, 0, 0, 0}
             }
    #endif
             ;
    #endif
     
    #endif
     
    /* end SQLCA */
    int main( int argc, char* argv[] )
    {
        /* EXEC SQL BEGIN DECLARE SECTION; */ 
        char username[] = "scott";
        char password[] = "tiger";
        char message[32];
        /* EXEC SQL END DECLARE SECTION; */ 
        /* EXEC SQL CONNECT :username IDENTIFIED BY :password; */ 
    {
        struct sqlexd sqlstm;
        sqlstm.sqlvsn = 12;
        sqlstm.arrsiz = 4;
        sqlstm.sqladtp = &sqladt;
        sqlstm.sqltdsp = &sqltds;
        sqlstm.iters = (unsigned int  )10;
        sqlstm.offset = (unsigned int  )5;
        sqlstm.cud = sqlcud0;
        sqlstm.sqlest = (unsigned char  *)&sqlca;
        sqlstm.sqlety = (unsigned short)4352;
        sqlstm.occurs = (unsigned int  )0;
        sqlstm.sqhstv[0] = (         void  *)username;
        sqlstm.sqhstl[0] = (unsigned int  )0;
        sqlstm.sqhsts[0] = (         int  )0;
        sqlstm.sqindv[0] = (         void  *)0;
        sqlstm.sqinds[0] = (         int  )0;
        sqlstm.sqharm[0] = (unsigned int  )0;
        sqlstm.sqadto[0] = (unsigned short )0;
        sqlstm.sqtdso[0] = (unsigned short )0;
        sqlstm.sqhstv[1] = (         void  *)password;
        sqlstm.sqhstl[1] = (unsigned int  )0;
        sqlstm.sqhsts[1] = (         int  )0;
        sqlstm.sqindv[1] = (         void  *)0;
        sqlstm.sqinds[1] = (         int  )0;
        sqlstm.sqharm[1] = (unsigned int  )0;
        sqlstm.sqadto[1] = (unsigned short )0;
        sqlstm.sqtdso[1] = (unsigned short )0;
        sqlstm.sqphsv = sqlstm.sqhstv;
        sqlstm.sqphsl = sqlstm.sqhstl;
        sqlstm.sqphss = sqlstm.sqhsts;
        sqlstm.sqpind = sqlstm.sqindv;
        sqlstm.sqpins = sqlstm.sqinds;
        sqlstm.sqparm = sqlstm.sqharm;
        sqlstm.sqparc = sqlstm.sqharc;
        sqlstm.sqpadto = sqlstm.sqadto;
        sqlstm.sqptdso = sqlstm.sqtdso;
        sqlstm.sqlcmax = (unsigned int )100;
        sqlstm.sqlcmin = (unsigned int )2;
        sqlstm.sqlcincr = (unsigned int )1;
        sqlstm.sqlctimeout = (unsigned int )0;
        sqlstm.sqlcnowait = (unsigned int )0;
        sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
        /* EXEC SQL DECLARE C1 CURSOR FOR
            SELECT 'Hello, Pro*C/C++ World!' AS Message FROM DUAL; */ 
        /* EXEC SQL OPEN C1; */ 
    {
        struct sqlexd sqlstm;
        sqlstm.sqlvsn = 12;
        sqlstm.arrsiz = 4;
        sqlstm.sqladtp = &sqladt;
        sqlstm.sqltdsp = &sqltds;
        sqlstm.stmt = sq0002;
        sqlstm.iters = (unsigned int  )1;
        sqlstm.offset = (unsigned int  )36;
        sqlstm.selerr = (unsigned short)1;
        sqlstm.cud = sqlcud0;
        sqlstm.sqlest = (unsigned char  *)&sqlca;
        sqlstm.sqlety = (unsigned short)4352;
        sqlstm.occurs = (unsigned int  )0;
        sqlstm.sqcmod = (unsigned int )0;
        sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
        /* EXEC SQL WHENEVER NOT FOUND DO BREAK; */ 
        for (;;)
        {
            /* EXEC SQL FETCH C1 INTO :message; */ 
    {
            struct sqlexd sqlstm;
            sqlstm.sqlvsn = 12;
            sqlstm.arrsiz = 4;
            sqlstm.sqladtp = &sqladt;
            sqlstm.sqltdsp = &sqltds;
            sqlstm.iters = (unsigned int  )1;
            sqlstm.offset = (unsigned int  )51;
            sqlstm.selerr = (unsigned short)1;
            sqlstm.cud = sqlcud0;
            sqlstm.sqlest = (unsigned char  *)&sqlca;
            sqlstm.sqlety = (unsigned short)4352;
            sqlstm.occurs = (unsigned int  )0;
            sqlstm.sqfoff = (           int )0;
            sqlstm.sqfmod = (unsigned int )2;
            sqlstm.sqhstv[0] = (         void  *)message;
            sqlstm.sqhstl[0] = (unsigned int  )32;
            sqlstm.sqhsts[0] = (         int  )0;
            sqlstm.sqindv[0] = (         void  *)0;
            sqlstm.sqinds[0] = (         int  )0;
            sqlstm.sqharm[0] = (unsigned int  )0;
            sqlstm.sqadto[0] = (unsigned short )0;
            sqlstm.sqtdso[0] = (unsigned short )0;
            sqlstm.sqphsv = sqlstm.sqhstv;
            sqlstm.sqphsl = sqlstm.sqhstl;
            sqlstm.sqphss = sqlstm.sqhsts;
            sqlstm.sqpind = sqlstm.sqindv;
            sqlstm.sqpins = sqlstm.sqinds;
            sqlstm.sqparm = sqlstm.sqharm;
            sqlstm.sqparc = sqlstm.sqharc;
            sqlstm.sqpadto = sqlstm.sqadto;
            sqlstm.sqptdso = sqlstm.sqtdso;
            sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
            if (sqlca.sqlcode == 1403) break;
    }
            printf("Messagen");
            printf("-----------------------n");
            printf("%sn", message);
        }
        /* EXEC SQL CLOSE C1; */ 
    {
        struct sqlexd sqlstm;
        sqlstm.sqlvsn = 12;
        sqlstm.arrsiz = 4;
        sqlstm.sqladtp = &sqladt;
        sqlstm.sqltdsp = &sqltds;
        sqlstm.iters = (unsigned int  )1;
        sqlstm.offset = (unsigned int  )70;
        sqlstm.cud = sqlcud0;
        sqlstm.sqlest = (unsigned char  *)&sqlca;
        sqlstm.sqlety = (unsigned short)4352;
        sqlstm.occurs = (unsigned int  )0;
        sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
        /* EXEC SQL COMMIT RELEASE; */ 
    {
        struct sqlexd sqlstm;
        sqlstm.sqlvsn = 12;
        sqlstm.arrsiz = 4;
        sqlstm.sqladtp = &sqladt;
        sqlstm.sqltdsp = &sqltds;
        sqlstm.iters = (unsigned int  )1;
        sqlstm.offset = (unsigned int  )85;
        sqlstm.cud = sqlcud0;
        sqlstm.sqlest = (unsigned char  *)&sqlca;
        sqlstm.sqlety = (unsigned short)4352;
        sqlstm.occurs = (unsigned int  )0;
        sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
    }
        return 0;
    }

    コンパイル&リンク方法(Visual C++)

    C:¥> SET PATH=ORACLE_BASEORACLE_HOMEbin;%PATH%
    C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEprecomppublic;%INCLUDE%
    C:¥> SET LIB=ORACLE_BASEORACLE_HOMEprecomplib;%LIB%
    C:¥> proc hello.pc
    C:¥> cl hello.c /link orasql11.lib

    実行結果

    Message
    -----------------------
    Hello, Pro*C/C++ World!
    
  5. Hello, OCCI World!

    Posted on 3月 31st, 2012 by cx20

    OCCI

    OCCI(Oracle C++ Call Interface)は Oracle Database 用の C++ API である。

    ソースコード

    #include <iostream>
    #include <occi.h>
     
    using namespace std;
    using namespace oracle::occi;
     
    int main( int argc, char* argv[] )
    {
        Environment* env = Environment::createEnvironment();
        Connection* con = env->createConnection("scott", "tiger", "orcl");
     
        Statement* stmt = con->createStatement("SELECT 'Hello, OCCI World!' AS Message FROM DUAL");
        ResultSet* rs = stmt->executeQuery();
        while( rs->next() )
        {
            cout << rs->getString(1) << endl;
        }
        stmt->closeResultSet(rs);
        con->terminateStatement(stmt);
        env->terminateConnection(con);
        Environment::terminateEnvironment(env);
     
        return 0;
    }

    コンパイル&リンク方法(Visua C++)

    C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEociinclude;%INCLUDE%
    C:¥> SET LIB=ORACLE_BASEORACLE_HOMEocilibmsvc;%LIB%
    C:¥> cl hello.cpp /link oraocci11.lib

    実行結果

    Hello, OCCI World!
  6. Hello, OCI World!

    Posted on 3月 30th, 2012 by cx20

    OCI

    OCI(Oracle Call Interface)は Oracle Database 用の C API である。
    OCI 7.x とそれ以降では、関数セットが大きく異なっており、現在は、新しい関数セットを用いることが推奨されている。

    旧(7.x) 新(7.x以降) 説明
    opinit() OCIEnvCreate() 環境の作成
    olon() OCILogon() ログイン
    ologof() OCILogoff() ログオフ
    oparse() OCIStmtPrepare() SQL文の準備
    odefin() OCIDefineByPos() 項目と変数の関連付け
    oexec() OCIStmtExecute() SQL実行
    ofetch() OCIStmtFetch2() 結果セットより行を取得
    ocom() OCITransCommit() コミット
    orol() OCITransRollback() ロールバック

    なお、Windows に標準で導入されている Oracle 用のデータベースドライバとして以下のものがあるが、これらは、Oracle クライアントのバージョンとは無関係にOCI 7 API を呼び出す仕様の為、新しい機能を使う場合は、Oracle 社より提供されているドライバを使用する必要がある。

    ファイル 種類 説明
    MSORCL32.DLL ODBC ドライバ Microsoft ODBC for Oracle
    MSDAORA.DLL OLE DB プロバイダ Microsoft OLE DB Provider for Oracle

    ソースコード

    #include <stdio.h>
    #include <string.h>
    #include <oci.h>
     
    int main( int argc, char* argv[] )
    {
        sword status = OCI_SUCCESS;
        OCIEnv* envhp;
        OCIError* errhp;
        OCISvcCtx* svchp;
        OCIStmt* stmtp;
        OCIBind* bindp;
        OCIDefine* dfnp;
        char* username = "scott";
        char* password = "tiger";
        char* dbname = "orcl";
        char* stmt = "SELECT 'Hello, OCI World!' AS Message FROM DUAL";
        char message[64];
     
        OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
        OCIHandleAlloc(envhp, &errhp, OCI_HTYPE_ERROR, 0, 0);
        OCILogon(envhp, errhp, &svchp, username, strlen(username),
            password, strlen(password), dbname, strlen(dbname));
        OCIHandleAlloc(envhp, &stmtp, OCI_HTYPE_STMT, 0, 0);
        OCIStmtPrepare(stmtp, errhp, stmt, strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);
        OCIDefineByPos(stmtp, &dfnp, errhp, 1, message, sizeof(message), SQLT_STR, 0, 0, 0, OCI_DEFAULT);
        OCIStmtExecute(svchp, stmtp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
     
        while ( status == OCI_SUCCESS )
        {
            printf("%sn", message);
            status = OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
        }
     
        OCIHandleFree(stmtp, OCI_HTYPE_STMT);
        OCILogoff(svchp, errhp);
        OCIHandleFree(errhp, OCI_HTYPE_ERROR);
     
        return 0;
    }

    コンパイル&リンク方法(Visua C++)

    C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEociinclude;%INCLUDE%
    C:¥> SET LIB=ORACLE_BASEORACLE_HOMEocilibmsvc;%LIB%
    C:¥> cl hello.c /link oci.lib

    実行結果

    Hello, OCI World!
  7. Hello, Oracle Database World!

    Posted on 3月 11th, 2012 by cx20

    Oracle Database

    Oracle Database は Oracle の RDBMS である。名前の由来は「神の言葉(神託)」から。9i の「i」は「internet」、10g の「g」は「grid」の略とされている。言語として SQL を拡張した PL/SQL が用いられる。PL は手続型言語(Procedural Language)を意味する。
    サンプルに見かけるユーザー/パスワード「scott/tiger」は開発者の名前と飼い猫に由来する。

    バージョン リリース 製品名
    7 1992年 Oracle7
    8 1997年 Oracle8 Database
    8.1 1999年 Oracle8i Database
    9 2001年 Oracle9i Database Release 1
    9.2 2002年 Oracle9i Database Release 2
    10.1 2003年 Oracle Database 10g Release 1
    10.2 2005年 Oracle Database 10g Release 2
    11.1 2007年 Oracle Database 11g Release 1
    11.2 2009年 Oracle Database 11g Release 2

    ソースコード

    SELECT 'Hello, Oracle World!' AS MESSAGE FROM DUAL;
    QUIT

    実行方法(入力ファイルをリダイレクト指定した場合)

    C:¥> sqlplus scott/tiger@orcl < hello.sql

    実行方法(ファイル名をオプション指定した場合)

    C:¥> sqlplus scott/tiger@orcl @hello.sql

    実行結果

    MESSAGE
    ----------------------------------------
    Hello, Oracle World!