使用C语言开发Oracle应用程序通常有两种方法。一是利用嵌入式SQL语言,将SQL作为子语言嵌入到C语言中,借助C语言访问Oracle以及实现过程化控制和复杂计算。二是利用Oracle调用接口(Oracle Call Interface简称OCI),通过调用一系列OCI函数即可访问数据库。我在这里介绍的是前一种方法。另外,在本文中,我重点介绍的是利用C语言开发Oracle应用程序的流程和步骤,而对嵌入式SQL的语法不会过多介绍,如果想了解详细语法,我在这里可以推荐一本书,书名是《Oracle 11g Pro*C\C++编程艺术》,此书对Oracle嵌入式SQL有详细详解,非常适合做新手入门教材,电子版在网上有,请需要的读者自行查找,
一、工具
Oracle 11g、vs2017、win10
二、概述
要用C语言开发Oracle应用程序,首先编写包含嵌有SQL语言的C语言的源代码,后缀名为pc,然后将代码通过Oracle自带的预编译工具Proc将SQL语句转为对Oracle运行库函数(SQLLIB)的调用,预编译后的代码即为C语言源代码,再将预编译后的代码拷到vs中,经过vs编译、链接和运行后,相应的Oracle应用程序即开发完成。过程如下图所示。
三、详细步骤
1.编写pc源文件。注意,编码格式应为ANSI编码,如果使用其他编码,可能会报错。例如,我使用UTF-8编码,会报如下图所示错误。
示例源代码test.pc如下所示。此代码的功能是查询表STUDENT中学号为2005的学生的学生姓名。
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sqlca.h>
//我最后用C++编译器编译此文件,不加“extern "C"”会报错
//如报错:无法解析的外部符号
extern "C" unsigned int sqlgls(char *, size_t *, size_t *);
//连接数据库
void connect()
{
EXEC SQL BEGIN DECLARE SECTION;
char username[20], password[20];
EXEC SQL END DECLARE SECTION;
strcpy_s(username, strlen("scott") + 1, "scott");
strcpy_s(password, strlen("tiger") + 1, "tiger");
EXEC SQL CONNECT : username IDENTIFIED BY : password;
}
//断开连接,提交事务
void release()
{
EXEC SQL COMMIT RELEASE;
}
//错误处理函数,当访问数据库出错时,会中止程序执行,打印错误信息
void sql_error()
{
char stm[100];
size_t sqlfc, stmlen = 100;
unsigned int i;
i = sqlgls(stm, &stmlen, &sqlfc);
printf("出错语句为:%.*s\n", stmlen, stm);
printf("%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
system("PAUSE");
exit(1);
}
int main()
{
//主变量说明
EXEC SQL BEGIN DECLARE SECTION;
char name[9];
int sno;
EXEC SQL END DECLARE SECTION;
//错误处理
EXEC SQL WHENEVER NOT FOUND DO sql_error();
EXEC SQL WHENEVER SQLERROR DO sql_error();
EXEC SQL WHENEVER SQLWARNING DO sql_error();
connect();
sno=2005;
EXEC SQL SELECT SNAME INTO :name
FROM STUDENT
WHERE SNO=:sno;
printf("学号为2005的学生是%s\n",name);
release();
system("PAUSE");
return 0;
}
2、预编译pc源程序。在命令行中输入命令proc,再加上一些预编译选项即可。常用预编译选项有INAME,INCLUDE,CODE,PARSE,CHAR_MAP等。INAME指定要预编译的文件名,当该选项是命令行第一个选项时,可省略“INAME=”。INCLUDE选项用于指定#include或EXEC SQL INCLUDE所对应的头文件所在路径。CODE选项用于指定预编译器所生成的C函数原型格式,可为ANSI_C,KR_C或CPP。PARSE指定解析pc源文件的方法,PARSE=FULL时,使用C解析器解析;PARS