1、Pro*C/C++简介
Pro*C/C++是Oracle为应用开发人员所提供的许多预编译工具之一,通过使用Pro*C/C++可以在高级编程语言中内嵌SQL语句和PLSQL块。
2、程序编写,命名文件为demo.pc
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
void main()
{
char sname[10],sbirth[10],sno[10];
char username[10] = "trade", password[10] = "hs0915", server[10] = "trade1";
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
printf("input student number :");
gets(sno);
EXEC SQL SELECT :sname,:sbirth from student where sno =:sno;
printf("sname :%s sbirth :%s \n",sname,sbirth);
EXEC SQL COMMIT RELEASE;
}
3、终端编译生成.c文件:
proc mydocment/demo.pc
此处编译报错如下:
[oracle@MyRhel ~]$ proc mydocment/demo.pc Pro*C/C++: Release 11.2.0.1.0 - Production on Fri Jul 14 09:50:19 2023 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. System default option values taken from: /home/oracle/oracle/product/11020/precomp/admin/pcscfg.cfg
|
原因是,要生成.c文件,但是没有该目录下权限,查看目录结果如下:
修改文件所属用户获得用户权限如下:
sudo chown -R oracle:dba mydocment/
再次编译,成功:
[oracle@MyRhel ~]$ proc mydocment/demo.pc Pro*C/C++: Release 11.2.0.1.0 - Production on Fri Jul 14 11:01:21 2023 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. System default option values taken from: /home/oracle/oracle/product/11020/precomp/admin/pcscfg.cfg |
可以在目录下看到已经生成的.c文件:
4、编译转换后的源程序demo.c
编译报错:
mydocment/demo.c:146:19: error: sqlca.h: No such file or directory mydocment/demo.c: In function 'main': mydocment/demo.c:164: error: 'sqlca' undeclared (first use in this function) mydocment/demo.c:164: error: (Each undeclared identifier is reported only once mydocment/demo.c:164: error: for each function it appears in.) |
解决方法:
报错:发现是把命令写错了-l(为了区分,它的大写为L)应该换成-I(其小写为i),还是在写的时候太过粗心了啊
修改之后的编译命令:
cc -g -o mydocment/demo mydocment/demo.c -I${ORACLE_HOME}/precomp/public -L$ORACLE_HOME/lib/ -lclntsh
编译警告,在主函数的211行,提示使用 gets
函数时传递的参数类型不正确。gets
函数不安全且容易引发缓冲区溢出的问题,因此在许多标准库中已被标记为不推荐使用。
/tmp/ccqronXC.o: In function `main': /home/oracle/mydocment/demo.c:211: warning: the `gets' function is dangerous and should not be used. |
把源代码中的键盘输入函数gets换成fgets:
fgets(sno, 10, stdin);//原来为gets(sno)
重新编译成.c并编译链接成可执行文件成功!
5、进入文件目录运行可执行文件
./demo
成功!
注意:在编译.pc文件前,需要将数据库用户scott解锁。即登录sysdba,输入:
alter user scott indentified by password account unlock;