Pro*c/c++ 欲编译选项
1:iname
作用:该选项使用与制定输入的文件名,并且是必须的。当指定的是pro*c的原程序的时候,文件扩展名.pc可以忽略。
Exp: iname=path_add_filename
2:oname
作用:该选项用于指定输出的文件名,如果该选项没有的话,输出的文件名默认为输入的编译文件名,文件后缀则由选项CPP_SUFFIX确定。编译输出的文件是欲编译之后的c/c++代码文件。
Exp:oname=path_and_filenema
3:include
作用:该选项用于指定#define或者EXCEL SQL INCLUDE 语句的头文件所在的路径。
Exp:include=路径名或include=(路径1,路径2…………)
说明:编译的时候编译器会按照以下的顺序搜索头文件:
1) 当前的目录
2) Sys_include 选项所指定的系统目录
3) Include 选项所指定的路径
4) 标准头文件的内置目录
4:parse
作用:该选项用于指定编译器解析Pro*c/c++源文件的方法,默认值为full
Exp:parse={full | partial | none}
注意:
1) 如果要生成的c/c++代码,则必须将parse设为none或者partial
2) 如果parse设置为none或者partial,那么必须在定义部分内定义宿主变量。
5:sqlcheck
作用:该选项指定用于sql语法和语义的检查方式,默认为syntax。该选项可以内嵌到程序中,也可以写在命令行键入。
Exp:sqlcheck={semantics | full | syntax}
注意:
1) 如果Pro*c/c++源程序内嵌了pl/sql块,那么在于编译时必须将该选项设置为semantics 或者 full。
2) 当将sqlcheck设置为semantics 或者 full
时,在欲编译源程序时需要进行语义检查。因为语义检查需要访问数据字典,所以必须设置useid。
6:useid
作用:该选项用于指定用户名,口令和网络服务名
Exp:useid=用户名/口令@网络服务名
注意:当将sqlcheck设置为semantics 或者 full 时,必须设置useid。
二:在命令行欲编译
使用oracle提供的欲编译工具proc来完成
Exp:proc [ option_name=value ] [option_name=valuse] ………………
注意:option_name制定欲编译的选项,value等于选项的值
三:使用whenever语句
Exp:exec sql whenener
注意:condition为用于检测的条件,action用于指定满足特殊条件之后要执行的操作。
1:condition
1) sqlwarning:用于检测oracle警告。
2) sqlerror:用于检测oracle错误。当检测到该条件时候sql.sqlcode会被设置为负值
3) Not found:用于检测select或者fatch操作未检测到行的情况
a) 当mode=oracle的时候,如果没有满足条件记录,sql.sqlcode=1403
b) 当mode=ansi的时候,如果没有满足条件记录,sql.sqlcode=100
2:action
1) countinue:继续运行下一条语句
2) do:执行错误处理函数
3) goto label_name:转移到标号处执行
4) stop:会退事务停止运行
3:whenever语句范围
Whenever是定义语句,他会自动检测应用程序中所有的sql语句。当编写Pro*c/c++应用程序时。Whenever语句应该放在第一条内嵌sql语句(例如connet)之前。如果程序中有多条的Whenever语句,则在随后的处理中,只有最近的Whenever语句起作用。
四:关于游标
1:使用费滚动游标
1) 定义游标:
Exec sql declare 游标名 cursor for sql语句
2) 打开游标
EXEC SQL open Cur_Skgk;
3)提取游标
EXEC SQL fetch Cur_Skgk into
5) 关闭游标
EXEC SQL close Cur_Skgk;
2:使用滚动游标
1) 定义游标
Exec sql declare 游标名 scroll cursor for
sql语句
2)打开游标
EXEC SQL open Cur_Skgk;
6) 提取游标
打开滚送游标之后,orcale会将数据放到游标结果集中,然后就可以处理其中的任意数据了。
Fetch fires:提取结果集中的第一条记录
Fetch prior:提取当前行的前一条记录
Fetch next:提取当前行的下一条记录
Fetch last:提取记录行的最后以行记录
Fetch current:提取当前行的记录
Fetch relative n:提取相当对于当前行的第n行数据。N可以有正负之分,正后数负往前数
Fetch absolute n:提取结果集中的第n行记录
注意:Fetch next:相当于非滚动游标中的Fetch 语句。
3) 关闭游标
EXEC SQL close Cur_Skgk;
//例子:编译一个proc.pc程序为aa.exe文件
object=proc
houzui=cpp
spc=proc.pc
exec=aa.exe
cc=gcc
all: PROC EXEC
PROC:
ifeq ($(houzui),cpp)
proc iname=$(spc) sqlcheck=semantics userid=res/res@kf code=cpp
oname=$(obj
ect).$(houzui)
else
proc iname=$(spc) sqlcheck=semantics userid=res/res@kf
oname=$(object).$(ho
uzui)
endif
EXEC:
$(cc) $(object).$(houzui) -o $(exec) -L$(ORACLE_HOME)/lib32
-lclntsh
.PHONY: clean
clean:
-rm edit $(object).$(houzui)