Solaris 10下 Oracle 11G proc 的C程序示例(转)

本文提供了一个在Solaris环境下利用Pro*C/C++预编译器访问Oracle数据库的C程序示例。包括单条记录单字段查询、单条记录多字段查询、多条记录多字段查询三种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Solaris 10下 Oracle 11G proc 的C程序示例

www.diybl.com    时间 : 2010-09-15  作者:网络   编辑:huyang629 点击:   [ 评论 ]

 

要做一个Solaris 下的C程序,要求访问Oracle 数据库。试着写了个Sample。
这个Sample均是Select语句,
第一个是查询单条 记录,单个 字段;
第二个是查询单条 记录,多个 字段,不同数据类型;
第三个是查询多条 记录,多个 字段,不同数据类型;

参考:
Oracle 9i Database List of Books
http://download.oracle .com/docs/cd/B10501_01/nav/docindex.htm
    -> << Proc*C/C++ Precompiler Programmer's Guide >>

嵌入式SQL(E-SQL)简介3
http://bbs.chinaunix.net/thread-164775-1-1.html


环境
Solaris 10 (SunOS JAL001 5.10 Generic_141445-09 i86pc i386 i86pc)
SunStudio12u1-SunOS-x86-tar-ML.tar.bz2
Oracle 11g
basic-11.2.0.1.0-solaris -x86.zip (Oracle 11g 32bit 客户端类库,解压至 ${ORACLE _HOME}/ lib32 下,并 ln -s libclntsh.so.11.1 libclntsh.so)

环境变量
/etc/profile

export PS1= "\u@\h \W\$ "

export JAVA_HOME= / export/ home/ data/ jdk1. 6. 0_21

export SUNSTUDIO_HOME= / export/ home/ data/ sunstudio12. 1

export TMP= / tmp
export TMPDIR= $ TMP

export ORACLE _BASE= / export/ home/ oracle / oracle 11g
export ORACLE _HOME= $ { ORACLE _BASE} / db_1
export ORACLE _SID= JAL

export CPATH= $ { ORACLE _HOME} / precomp/ public
export LD_LIBRARY_PATH= $ { ORACLE _HOME} / lib32 : / lib/ 32: / usr/ lib: $ { ORACLE _HOME} / odg/ lib
export SHLIB_PATH= $ { LD_LIBRARY_PATH}

export PATH= $ { JAVA_HOME} / bin: $ { SUNSTUDIO_HOME} / bin: $ { ORACLE _HOME} / bin: / usr/ ucb: / usr/ local / bin: / usr/ openwin/ bin: / usr/ ccs/ bin: / usr/ sfw/ bin: / usr/ X11/ bin: $ { PATH}

export DISPLAY= 172. 16. 200. 11: 0. 0
xhost 172. 16. 200. 11


输出结果
proc.out.txt
ps:这个是NetBeans整个的Make和运行的记录,全部给出是为了方便以后查找各种命令及参数。

/ export / home / zhangll / NetBeansProjects / CDS - JAL で "/export/home/data/sunstudio12.1/bin/dmake -f Makefile CONF=Debug" を実行中

dmake : 并列モードをデフォルトとして使用します。
. dmakerc ファイルの设定については、dmake ( 1 ) のマニュアルページを参照してください。
gmake - C ./ sample . build - pre
gmake [ 1 ]: Entering directory ` / export / home / zhangll / NetBeansProjects / CDS - JAL / sample '
#proc INCLUDE=./inc LTYPE=NONE HEADER=hdr INAME=inc/jal_types.h
proc INCLUDE=./inc LTYPE=NONE CHAR_MAP=STRING INAME=src/DBSelect1.sc

Pro*C/C++: Release 11.2.0.1.0 - Production on Wed Jul 14 17:06:09 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

System default option values taken from: /export/home/oracle /oracle 11g/db_1/precomp/admin/pcscfg.cfg

proc INCLUDE=./inc LTYPE=NONE CHAR_MAP=STRING INAME=src/DBSelect2.sc

Pro*C/C++: Release 11.2.0.1.0 - Production on Wed Jul 14 17:06:09 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

System default option values taken from: /export/home/oracle /oracle 11g/db_1/precomp/admin/pcscfg.cfg

proc INCLUDE=./inc LTYPE=NONE CHAR_MAP=STRING INAME=src/DBSelect3.sc

Pro*C/C++: Release 11.2.0.1.0 - Production on Wed Jul 14 17:06:09 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

System default option values taken from: /export/home/oracle /oracle 11g/db_1/precomp/admin/pcscfg.cfg

gmake[1]: Leaving directory `/export/home/zhangll/NetBeansProjects/CDS-JAL/sample'

JAL001 --> 1 个のジョブ
JAL001 --> 2 个のジョブ
gmake - f nbproject / Makefile - Debug . mk SUBPROJECTS = . build - conf
gmake [ 1 ]: Entering directory ` / export / home / zhangll / NetBeansProjects / CDS - JAL '
gmake -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Solaris -x86/cds-jal
gmake[2]: Entering directory `/export/home/zhangll/NetBeansProjects/CDS-JAL'

mkdir - p build / Debug / GNU - Solaris - x86 / sample / src
rm - f build / Debug / GNU - Solaris - x86 / sample / src / DBSelect3 . o . d
gcc - m32 - I ./ sample / inc - L / export / home / oracle / oracle 11g / db_1 / lib32 - lclntsh - c - g - MMD - MP - MF build / Debug / GNU - Solaris - x86 / sample / src / DBSelect3 . o . d - o build / Debug / GNU - Solaris - x86 / sample / src / DBSelect3 . o sample / src / DBSelect3 . c
gcc : - lclntsh : リンクが完了しなかったのでリンカの入力ファイルは使われませんでした
mkdir - p build / Debug / GNU - Solaris - x86 / sample / src
rm - f build / Debug / GNU - Solaris - x86 / sample / src / DBSelect2 . o . d
gcc - m32 - I ./ sample / inc - L / export / home / oracle / oracle 11g / db_1 / lib32 - lclntsh - c - g - MMD - MP - MF build / Debug / GNU - Solaris - x86 / sample / src / DBSelect2 . o . d - o build / Debug / GNU - Solaris - x86 / sample / src / DBSelect2 . o sample / src / DBSelect2 . c
gcc : - lclntsh : リンクが完了しなかったのでリンカの入力ファイルは使われませんでした
mkdir - p build / Debug / GNU - Solaris - x86 / sample / src
rm - f build / Debug / GNU - Solaris - x86 / sample / src / DBSelect1 . o . d
gcc - m32 - I ./ sample / inc - L / export / home / oracle / oracle 11g / db_1 / lib32 - lclntsh - c - g - MMD - MP - MF build / Debug / GNU - Solaris - x86 / sample / src / DBSelect1 . o . d - o build / Debug / GNU - Solaris - x86 / sample / src / DBSelect1 . o sample / src / DBSelect1 . c
gcc : - lclntsh : リンクが完了しなかったのでリンカの入力ファイルは使われませんでした
mkdir - p dist / Debug / GNU - Solaris - x86
gcc - m32 - I ./ sample / inc - L / export / home / oracle / oracle 11g / db_1 / lib32 - lclntsh - o dist / Debug / GNU - Solaris - x86 / cds - jal build / Debug / GNU - Solaris - x86 / sample / src / main . o build / Debug / GNU - Solaris - x86 / sample / src / DBSelect3 . o build / Debug / GNU - Solaris - x86 / sample / src / DBSelect2 . o build / Debug / GNU - Solaris - x86 / sample / src / DBSelect1 . o build / Debug / GNU - Solaris - x86 / sample / src / FileIO . o
gmake [ 2 ]: Leaving directory ` / export / home / zhangll / NetBeansProjects / CDS - JAL '
gmake[1]: Leaving directory `/export/home/zhangll/NetBeansProjects/CDS-JAL'


构筑 成功。 终了値 0。

/ export / home / zhangll / NetBeansProjects / CDS - JAL で "/export/home/zhangll/NetBeansProjects/CDS-JAL/dist/Debug/GNU-Solaris -x86/cds-jal" を実行中

---------------------------- select01 ()
ename = [ FORD ]
---------------------------- select02 ()
empno ename job mgr hirdate sal comm deptno
7902 FORD ANALYST 7566 1981 / 12 / 03 00 : 00 : 00 3000 . 00 - 99999 . 99 20
---------------------------- select03 ()
empno ename job mgr hirdate sal comm deptno
7369 SMITH CLERK 7902 1980 / 12 / 17 00 : 00 : 00 800 . 00 - 99999 . 99 20
7499 ALLEN SALESMAN 7698 1981 / 02 / 20 00 : 00 : 00 1600 . 00 300 . 00 30
7521 WARD SALESMAN 7698 1981 / 02 / 22 00 : 00 : 00 1250 . 00 500 . 00 30
7566 JONES MANAGER 7839 1981 / 04 / 02 00 : 00 : 00 2975 . 00 - 99999 . 99 20
7654 MARTIN SALESMAN 7698 1981 / 09 / 28 00 : 00 : 00 1250 . 00 1400 . 00 30
7698 BLAKE MANAGER 7839 1981 / 05 / 01 00 : 00 : 00 2850 . 00 - 99999 . 99 30
7782 CLARK MANAGER 7839 1981 / 06 / 09 00 : 00 : 00 2450 . 00 - 99999 . 99 10
7788 SCOTT ANALYST 7566 1987 / 04 / 19 00 : 00 : 00 3000 . 00 - 99999 . 99 20
7839 KING PRESIDENT - 9999 1981 / 11 / 17 00 : 00 : 00 5000 . 00 - 99999 . 99 10
7844 TURNER SALESMAN 7698 1981 / 09 / 08 00 : 00 : 00 1500 . 00 0 . 00 30
7876 ADAMS CLERK 7788 1987 / 05 / 23 00 : 00 : 00 1100 . 00 - 99999 . 99 20
7900 JAMES CLERK 7698 1981 / 12 / 03 00 : 00 : 00 950 . 00 - 99999 . 99 30
7902 FORD ANALYST 7566 1981 / 12 / 03 00 : 00 : 00 3000 . 00 - 99999 . 99 20
7934 MILLER CLERK 7782 1982 / 01 / 23 00 : 00 : 00 1300 . 00 - 99999 . 99 10

実行 成功。 终了値 0。



源文件
DBSelect1.c
文件:proc.zip
大小:65KB
下载:下载

# include < sqlca. h>
# include < stdio. h>
# include < string . h>

/* 1. get an instance of struct SQLCA */
EXEC SQL INCLUDE SQLCA;

int perr01( const char * msg) {
    printf ( "Error occured when %s\n" , msg) ;
    printf ( "{\n" ) ;
    printf ( " sqlcaid = %s\n" , sqlca. sqlcaid) ;
    printf ( " sqlabc = %d\n" , sqlca. sqlabc) ;
    printf ( " sqlcode = %d\n" , sqlca. sqlcode) ;
    printf ( " sqlerrm.sqlerrml = %d\n" , sqlca. sqlerrm. sqlerrml) ;
    printf ( " sqlerrm.sqlerrmc = %s\n" , sqlca. sqlerrm. sqlerrmc) ;
    printf ( " sqlerrp = %s\n" , sqlca. sqlerrp) ;
    printf ( " sqlerrd = %d\n" , sqlca. sqlerrd) ;
    printf ( " sqlwarn = %s\n" , sqlca. sqlwarn) ;
    printf ( " sqlext = %s\n" , sqlca. sqlext) ;
    printf ( "}\n" ) ;
    return 1;
}
int notfound01( ) {
    return 2;
}

void select01( ) {
    printf ( "----------------------------select01()\n" ) ;
    char buf[ 1024] ;
    int errorFlag = 0;
    int notFoundFlag = 0;

    /* 2. declare host variables */
    EXEC SQL BEGIN DECLARE SECTION;
    char user[ 20] = "scott" ;
    char passwd[ 20] = "123456" ;
    char dbStr[ 20] = "JAL" ;
    int empno= 7902;
    VARCHAR ename[ 11] ;
    EXEC SQL END DECLARE SECTION;
    
    /* 3. connect DB server */
    char * msg = "connect db" ;
    EXEC SQL WHENEVER SQLERROR DO errorFlag= perr01( msg) ; /* connection error*/
    EXEC SQL CONNECT : user IDENTIFIED BY : passwd USING : dbStr ;
    if ( errorFlag) {
        exit ( errorFlag) ;
    }
    
    /* 4. query DB */
    EXEC SQL WHENEVER SQLERROR DO errorFlag = perr01( "query DB" ) ; /* query error*/
    EXEC SQL WHENEVER NOT FOUND DO notFoundFlag = notfound01( ) ;
    memset ( ename. arr, NULL , 11) ;
    EXEC SQL SELECT ENAME INTO : ename FROM EMP WHERE EMPNO = : empno;
    if ( errorFlag) {
        exit ( errorFlag) ;
    }

    /* 5. handle data */
    if ( notFoundFlag) {
        printf ( "Not found employee[EMPNO=%d]\n" , empno) ;
    } else {
        memset ( buf, NULL , 11) ;
        memcpy ( buf, ename. arr, ename. len) ;
        printf ( "ename = [%s]\n" , buf) ;
    }

    /* 6. disconnect DB */
    EXEC SQL ROLLBACK WORK RELEASE ;
}


DBSelect2.sc

# include < sqlca. h>
# include < stdio. h>
# include < string . h>

/* 1. get an instance of struct SQLCA */
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
    typedef struct {
        int empno; /* NUMBER(4) */
        char ename[ 10 + 1] ; /* VARCHAR2(10) */
        char job[ 9 + 1] ; /* VARCHAR2(9) */
        int mgr; /* NUMBER(4) */
        char hiredate[ 30] ; /* DATE */
        double sal; /* NUMBER(7,2) */
        double comm; /* NUMBER(7,2) */
        int deptno; /* NUMBER(4) */
    } Emp02;

    typedef struct {
        short empno;
        short ename;
        short job;
        short mgr;
        short hiredate;
        short sal;
        short comm;
        short deptno;
    } IdcEmp02;
EXEC SQL END DECLARE SECTION;

int perr02( const char * msg) {
    printf ( "Error occured when %s\n" , msg) ;
    printf ( "{\n" ) ;
    printf ( " sqlcaid = %s\n" , sqlca. sqlcaid) ;
    printf ( " sqlabc = %d\n" , sqlca. sqlabc) ;
    printf ( " sqlcode = %d\n" , sqlca. sqlcode) ;
    printf ( " sqlerrm.sqlerrml = %d\n" , sqlca. sqlerrm. sqlerrml) ;
    printf ( " sqlerrm.sqlerrmc = %s\n" , sqlca. sqlerrm. sqlerrmc) ;
    printf ( " sqlerrp = %s\n" , sqlca. sqlerrp) ;
    printf ( " sqlerrd = %d\n" , sqlca. sqlerrd) ;
    printf ( " sqlwarn = %s\n" , sqlca. sqlwarn) ;
    printf ( " sqlext = %s\n" , sqlca. sqlext) ;
    printf ( "}\n" ) ;
    return 1;
}
int notfound02( ) {
    return 2;
}

void select02( ) {
    printf ( "----------------------------select02()\n" ) ;
    char buf[ 1024] ;
    int errorFlag = 0;
    int notFoundFlag = 0;

    /* 2. declare host variables */
    EXEC SQL BEGIN DECLARE SECTION;
    /* using for connect DB*/
    char user[ 20] = "scott" ;
    char passwd[ 20] = "123456" ;
    char dbStr[ 20] = "JAL" ;
    int empno= 7902;
    Emp02 emp;
    IdcEmp02 idcEmp;
    EXEC SQL END DECLARE SECTION;

    /* 3. connect DB server */
    char * msg = "connect db" ;
    EXEC SQL WHENEVER SQLERROR DO errorFlag= perr02( msg) ;
    EXEC SQL CONNECT : user IDENTIFIED BY : passwd USING : dbStr ;
    if ( errorFlag) {
        exit ( errorFlag) ;
    }

    /* 4. query DB */
    EXEC SQL WHENEVER SQLERROR DO errorFlag = perr02( "query DB" ) ;
    EXEC SQL WHENEVER NOT FOUND DO notFoundFlag = notfound02( ) ;
    /*EXEC SQL SELECT EMPNO, ENAME, JOB, MGR, TO_CHAR(HIREDATE,'YYYY/MM/DD HH24:MI:SS'), SAL, COMM, DEPTNO
        INTO :emp.empno:idcEmp.empno, :emp.ename:idcEmp.ename,
        :emp.job:idcEmp.job, :emp.mgr:idcEmp.mgr, :emp.hiredate:idcEmp.hiredate,
        :emp.sal:idcEmp.sal, :emp.comm:idcEmp.comm, :emp.deptno:idcEmp.deptno
        FROM EMP WHERE EMPNO = :empno;*/

    EXEC SQL SELECT EMPNO, ENAME, JOB, MGR,
            TO_CHAR( HIREDATE, 'YYYY/MM/DD HH24:MI:SS' ) , SAL, COMM, DEPTNO
        INTO : emp INDICATOR : idcEmp
        FROM EMP
        WHERE EMPNO = : empno;
    if ( errorFlag) {
        exit ( errorFlag) ;
    }

    /* 5. handle data */
    if ( notFoundFlag) {
        printf ( "Not found employee[EMPNO=%d]\n" , empno) ;
    } else {
        printf ( "%-5s %-10s %-10s %-5s %-20s %-10s %-10s %-5s \n" , "empno" ,
                "ename" , "job" , "mgr" , "hirdate" , "sal" , "comm" , "deptno" ) ;
       
        emp. hiredate[ 19] = NULL ;

        printf ( "%-5d %-10s %-10s %-5d %-20s %-10.2f %-10.2f %-5d \n" ,
                emp. empno, emp. ename, emp. job,
                - 1 = = idcEmp. mgr ? - 9999 : emp. mgr,
                - 1 = = idcEmp. hiredate ? "" : emp. hiredate,
                - 1 = = idcEmp. sal ? - 99999. 99 : emp. sal,
                - 1 = = idcEmp. comm ? - 99999. 99 : emp. comm,
                - 1 = = idcEmp. deptno ? - 99 : emp. deptno) ;
    }

    /* 6. disconnect DB */
    EXEC SQL ROLLBACK WORK RELEASE ;
}


DBSelect3.sc

#include < sqlca. h>
#include < stdio. h>
#include < string. h>

/* 1. get an instance of struct SQLCA * /
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
    typedef struct {
        int empno; /* NUMBER( 4) * /
        char ename[ 10 + 1] ; /* VARCHAR2( 10) * /
        char job[ 9 + 1] ; /* VARCHAR2( 9) * /
        int mgr; /* NUMBER( 4) * /
        char hiredate[ 30] ; /* DATE * /
        double sal ; /* NUMBER( 7, 2) * /
        double comm; /* NUMBER( 7, 2) * /
        int deptno; /* NUMBER( 4) * /
    } Emp03;

    typedef struct {
        short empno;
        short ename;
        short job;
        short mgr;
        short hiredate;
        short sal ;
        short comm;
        short deptno;
    } IdcEmp03;
EXEC SQL END DECLARE SECTION;

int perr03( const char * msg) {
    printf( "Error occured when %s\n" , msg) ;
    printf( "{\n" ) ;
    printf( " sqlcaid = %s\n" , sqlca. sqlcaid) ;
    printf( " sqlabc = %d\n" , sqlca. sqlabc) ;
    printf( " sqlcode = %d\n" , sqlca. sqlcode) ;
    printf( " sqlerrm.sqlerrml = %d\n" , sqlca. sqlerrm. sqlerrml) ;
    printf( " sqlerrm.sqlerrmc = %s\n" , sqlca. sqlerrm. sqlerrmc) ;
    printf( " sqlerrp = %s\n" , sqlca. sqlerrp) ;
    printf( " sqlerrd = %d\n" , sqlca. sqlerrd) ;
    printf( " sqlwarn = %s\n" , sqlca. sqlwarn) ;
    printf( " sqlext = %s\n" , sqlca. sqlext) ;
    printf( "}\n" ) ;
    return 1;
}
int notfound03( ) {
    return 2;
}

void select03( ) {
    printf( "----------------------------select03()\n" ) ;
    char buf[ 1024] ;
    int errorFlag = 0;
    int notFoundFlag = 0;

    /* 2. declare host variables * /
    EXEC SQL BEGIN DECLARE SECTION;
    /* using for connect DB* /
    char user[ 20] = "scott" ;
    char passwd[ 20] = "123456" ;
    char dbStr[ 20] = "JAL" ;
    int empno= 7902;
    Emp03 emp;
    IdcEmp03 idcEmp;
    EXEC SQL END DECLARE SECTION;

    /* 3. connect DB server * /
    char * msg = "connect db" ;
    EXEC SQL WHENEVER SQLERROR DO errorFlag= perr03( msg) ;
    EXEC SQL CONNECT : user IDENTIFIED BY : passwd USING : dbStr ;
    if ( errorFlag) {
        exit( errorFlag) ;
    }

    /* 4. query DB * /

    
    EXEC SQL SELECT EMPNO, ENAME, JOB, MGR,
            TO_CHAR( HIREDATE, 'YYYY/MM/DD HH24:MI:SS' ) , SAL , COMM, DEPTNO
        INTO : emp INDICATOR : idcEmp
        FROM EMP
        WHERE EMPNO = : empno;

    EXEC SQL DECLARE C1 CURSOR FOR
        SELECT EMPNO, ENAME, JOB, MGR,
            TO_CHAR( HIREDATE, 'YYYY/MM/DD HH24:MI:SS' ) , SAL , COMM, DEPTNO
        FROM SCOTT. EMP;

    EXEC SQL OPEN C1;

    EXEC SQL WHENEVER SQLERROR DO errorFlag = perr03( "query DB" ) ;
    EXEC SQL WHENEVER NOT FOUND DO notFoundFlag = notfound03( ) ;
    printf( "%-5s %-10s %-10s %-5s %-20s %-10s %-10s %-5s \n" , "empno" ,
                "ename" , "job" , "mgr" , "hirdate" , "sal" , "comm" , "deptno" ) ;
    do{
        EXEC SQL FETCH C1 INTO : emp INDICATOR : idcEmp;
        if ( ! errorFlag && ! notFoundFlag) {
            /* 5. handle data * /
            printf( "%-5d %-10s %-10s %-5d %-20s %-10.2f %-10.2f %-5d \n" ,
                emp. empno, emp. ename, emp. job,
                - 1 = = idcEmp. mgr ? - 9999 : emp. mgr,
                - 1 = = idcEmp. hiredate ? "" : emp. hiredate,
                - 1 = = idcEmp. sal ? - 99999. 99 : emp. sal ,
                - 1 = = idcEmp. comm ? - 99999. 99 : emp. comm,
                - 1 = = idcEmp. deptno ? - 99 : emp. deptno) ;
        }
    }while ( ! errorFlag && ! notFoundFlag) ;

    EXEC SQL CLOSE C1;

    if ( errorFlag) {
        exit( errorFlag) ;
    }

    /* 6. disconnect DB * /
    EXEC SQL ROLLBACK WORK RELEASE ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值