Pro*c在oracle10g上的第一个入门测试程序
开发运行环境
oracle10g 10.2.0 fedora core 6.0
oracle10g 10.2.0 fedora core 5.0
windows xp sp2
gcc
proc
1 makefile
LIBPATH
=
-
L$(ORACLE_HOME)
/
lib
/
LIBS
=-
lclntsh `cat $(ORACLE_HOME)
/
lib
/
sysliblist`
-
ldl –lm
CC
=
gcc
CFLAGS
=
-
o
test:test.pc
proc parse
=
no iname
=
test.pc include
=
$(ORACLE_HOME)
/
precomp
/
public
$(CC) $(CFLAGS) $@ $@.c
-
I$(ORACLE_HOME)
/
precomp
/
public
-
L$(ORACLE_HOME)
/
lib
-
lclntsh
-
lclient8 $(LIBPATH) $(LIBS)
rm tp
??????
避免
PCC-S-02015
,
unable
to
open
include
file的问题-->parse=no,主要检查$HOME/precomp/admin/pcscfg.cfg 内容如下(多线程问题):
sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc-lib/i386-redh
at-linux/3.2.3/include)
include=用户定义的库头文件目录或者要引用的头文件目录
ltype=short
2 本机程序(应用程序和数据库服务器同一台机)
test.pc
#include
<
stdio.h
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
EXEC SQL INCLUDE SQLCA;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
main(
void
)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR user[20],pass[20],tnsname[20];
char ename[10];
int empno;
EXEC SQL END DECLARE SECTION;
int i=0;
strcpy(user.arr,"scott");
user.len=(unsigned short)strlen((char *)user.arr);
strcpy(pass.arr,"tiger");
pass.len=(unsigned short)strlen((char *)pass.arr);
strcpy(tnsname.arr,"MYDATA");
tnsname.len=(unsigned short)strlen((char *)tnsname.arr);
EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :tnsname;
if( sqlca.sqlcode < 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf(“ connect error ”);
EXEC SQL commit work release;
return -1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
EXEC SQL declare emp_cursor cursor for
select empno,ename from scott.emp;
if( sqlca.sqlcode < 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf(“ declare error ”);
EXEC SQL commit work release;
return -1;
}
EXEC SQL open emp_cursor;
if( sqlca.sqlcode < 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf(“ open error ”);
EXEC SQL commit work release;
return -1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
EXEC SQL WHENEVER NOT FOUND DO break;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
while(1)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
EXEC SQL fetch emp_cursor into :empno,:ename;
if( sqlca.sqlcode < 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf(“ fetch error:[%s] ”, sqlca.sqlerrm.sqlerrmc);;
EXEC SQL commit work release;
return -1;
}
printf("The empno %d's name is %s ",empno,ename);
i=i+1;
}
printf("Yeah!We get %d records ",i);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
EXEC SQL close emp_cursor;
if( sqlca.sqlcode < 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf(“ close error ”);
EXEC SQL commit work release;
return -1;
}
EXEC SQL commit work release;
return 0;
}
tnsnames.ora
# Generated by Oracle configuration tools.
Client(fc5.0)应用程序如上
将
strcpy(tnsname.arr,"MYDATA");
改为strcpy(tnsname.arr, “MYDATA_FERTILAND”)
此时修改客户端的$ORACLE_HOME/network/admin/tnsnames.ora
Makefile沿用上面的
程序参考