第一个pro*C demo

来源:互联网 发布:鲲鹏房地产大数据平台 编辑:程序博客网 时间:2024/06/05 04:20

该程序很简单,就是用C从ORACLE,把当前日期显示出来就OK,作为一个简单的DEMO

 

 

(一)写PRO*C

/*===========================================================================
* pro*c编译方法:
* 预编译 proc test.pc
* 编译   gcc -o test test.c $ORACLE_HOME/lib/libclntsh.so

* 作者   foxliu
* 时间   2009-10
*============================================================================*/

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

 

int main(int argc,char **argv)
{
     /*声明SQL变量*/
     EXEC SQL BEGIN DECLARE SECTION;

  /*VARCHAR预编译后为struct { unsigned short len; unsigned char arr[20];}*/
     VARCHAR user[20],pass[20],tnsname[20];
    
  char crruentDate[15];

     EXEC SQL END DECLARE SECTION;
    
     /*声明C变量*/
     int i=0;
     
    
     strcpy(user.arr,"dbrevass");
     user.len=strlen((char *)user.arr);
     strcpy(pass.arr,"dbrevass");
     pass.len=strlen((char *)pass.arr);
     strcpy(tnsname.arr,"wapp");
     tnsname.len=strlen((char *)tnsname.arr);

     /*Connect the DB*/
     EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :tnsname;

     /*printf("%d",sqlca.sqlcode);*/

  /*游标声明*/
     EXEC SQL declare emp_cursor cursor for
                                          select sysdate from dual;
                                  
     EXEC SQL open emp_cursor;

     EXEC SQL WHENEVER NOT FOUND DO break;

     while(1)
     {
           EXEC SQL fetch emp_cursor into :crruentDate;
           printf("Today is %s/n",crruentDate);
           i=i+1;
     }
    
     printf("get %d records/n",i);

     EXEC SQL close emp_cursor;
    
     EXEC SQL commit work release;
}

 

 

 

 

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

(二)写MAKEFILE

#C++ compiler command
CCC=            gcc
PROC=           proc

# Options to be passed to your C++ compiler:
CCOPTIONS=-g
CFLAGS=-I$(ORACLE_HOME)/precomp/public -I$(ORACLE_HOME)/rdbms/public -I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/plsql/public -I$(O
RACLE_HOME)/network/public
LFLAGS=-L$(ORACLE_HOME)/lib/ -lclntsh `cat $(ORACLE_HOME)/lib/ldflags`   `cat $(ORACLE_HOME)/lib/sysliblist`  -lm  -lpthread -lpthre
ad


# Full path to the include:
SYSINCL=-I/usr/include
ORAINCL=-I$(ORACLE_HOME)/precomp/public
APPINCL= -I./include

ORALIB=-L$(ORACLE_HOME)/lib `cat $(ORACLE_HOME)/lib/sysliblist`
SYSLIB= -lclntsh -lm -lpthread

INCLFLAG=$(APPINCL) $(SYSINCL) $(ORAINCL)
PROCFLAG=include=./include include=/usr/include include=/usr/include/linux
LIBFLAG=$(ORALIB) $(SYSLIB)

# Application used记得编译过程前面一定要是tab不能是空格

all:testt publish

testt:./test.o
        $(CCC) $(CCOPTIONS) -o  ./testt  ./test.o  $(LIBFLAG)

./test.o:./test.pc
        $(PROC) parse=none      ./test.pc $(PROCFLAG)
        $(CCC)  $(CCOPTIONS) -c ./test.c -o ./test.o $(INCLFLAG)

publish:
        rm -f ./*.o

 

 

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

(三)执行make后,生成了test.c和目标文件testt

<bnmsbkg@PERFMON3:/ibnmsbkg/exp/test>testt
回显结果:
Today is 30-OCT-09    
get 1 records

 

 

需要注意的是:
1.写makefile
写makefile时一定要注意的问题
testt:./test.o
        $(CCC) $(CCOPTIONS) -o  ./testt  ./test.o  $(LIBFLAG)
等在COMMAND前面即$(CCC) $(CCOPTIONS) -o  ./testt  ./test.o  $(LIBFLAG)一定是
TAB键,不能是空格。

 

2.makefile些好后编译通过生成可执行文件testt(随便取的名字,只要不是关键字就好)

值得重点注意的是:
生成的可执行文件千万别取名叫 test
开始我就犯了这个错,导致执行不出结果
找了半天原因。
后头man了一下test终于发现原因
原因在于test为shell关键字,
每次写SHELL的时候自己都在用竟然忘记了
太该打了 例如if(test $1 ge $2)等等。
每次执行
test相当于执行的系统的test命令
导致当前目录的test可执行文件没被执行
当然不出结果,
怪不得找了半天原因找不到。汗啊

如果非要用关键字也不是不可以
那执行的时候就这样写吧
<bnmsbkg@PERFMON3:/ibnmsbkg/exp/test>. ./test


<bnmsbkg@PERFMON3:/ibnmsbkg/exp/test>test1
回显结果:
Today is 30-OCT-09    
get 1 records

 

 

 

原创粉丝点击