在C语言程序代码中直接嵌入SQL语句,使数据库编程变得非常简单明了,而且嵌入式SQL是一种标准,代码不需要很多的修改就能移植到支持嵌入式SQL的数据库系统上去,但这同时也是一个缺点,许多数据库系统不提供嵌入式SQL的预编译器。
1.1 编译
编译过程分为两步,第一步,对带有嵌入式SQL的C代码程序(通常此程序以.pc结尾,简称PC代码)使用proc做一次预编译,将里面的嵌入式SQL转化为代表数据库功能调用的C代码。第二步,使用C编译器将C代码编译连接成可执行文件。
配置文件
proc首先读取$ORACLE_HOME/precomp/pcscfg.cfg,里面的选项与命令行选项作用完全相同,这样可以让proc使用变得简洁。但从减少系统配置步骤、保持应用迁移的灵活性的角度出发,建议对此文件不作修改,将各种选项写在程序的编译文件中。
命令行选项:
sys_include: 系统头文件目录,如/usr/include,/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include, /usr/lib/gcc-lib/i386-redhat-linux/2.96/include ,$ORACLE_HOME/precomp/public,$(ORACLE_HOME)/rdbms/public -I$(ORACLE_HOME)/rdbms/demo,前3个通常在配置文件中已经写入
include:自定义的应用头文件目录
sqlcheck:SQL语句检查方式,语法(SYNTAX)和语义(SEMANTICS)。
语法:仅检查SQL语句的语法结构
语义:除语法检查外,还检验数据库对象和宿主变量的有效性
userid:访问数据库途径,在sqlcheck为语义检查时必须指定,如dbuser/oracle@oradb
iname:输入pc文件名
oname:输出c文件名
如果省略iname、oname,只需输入pc文件名,缺省转化成同名后缀为.c的C文件。
threads:线程支持,yes或no
例子
proc sqlcheck=semantic userid=dbuser/oracle threads=yes sys_include=$(ORACLE_HOME)/precomp/public sys_include=$(ORACLE_HOME)/rdbms/public sys_include=$(ORACLE_HOME)/rdbms/demo include=$IN threads=yes iname=emp.pc oname=emp.c //$IN是自定义的应用文件目录
gcc -I$(ORACLE_HOME)/precomp/public -I$(ORACLE_HOME)/rdbms/public -I$(ORACLE_HOME)/rdbms/demo –g –c –o emp.o emp.c
参见proc/single/Makefile。
1.2 SQL语句
建议设立一个与表结构一一对应的结构定义,作为宿主结构,下面的所有例子几乎都会用到关于表emp的宿主结构(emp_t emp)。
参见proc/single/db.h中emp_t和emp建表脚本proc/single/emp.sql。
1.2.1 内部类型与宿主类型对应
下面是最常用的内部数据类型和宿主变量类型的对应关系:
内部数据类型 |
宿主变量类型 |
char(n) |
char[n+1] |
varchar2(n) |
char[n+1] |
number(n<=6) |
int |
number(n>6) |
double |
number(m,n) |
double |
date |
char[15] |