ProCC编程Word下载.docx

上传人:b****3 文档编号:6437115 上传时间:2023-05-06 格式:DOCX 页数:16 大小:44.99KB
下载 相关 举报
ProCC编程Word下载.docx_第1页
第1页 / 共16页
ProCC编程Word下载.docx_第2页
第2页 / 共16页
ProCC编程Word下载.docx_第3页
第3页 / 共16页
ProCC编程Word下载.docx_第4页
第4页 / 共16页
ProCC编程Word下载.docx_第5页
第5页 / 共16页
ProCC编程Word下载.docx_第6页
第6页 / 共16页
ProCC编程Word下载.docx_第7页
第7页 / 共16页
ProCC编程Word下载.docx_第8页
第8页 / 共16页
ProCC编程Word下载.docx_第9页
第9页 / 共16页
ProCC编程Word下载.docx_第10页
第10页 / 共16页
ProCC编程Word下载.docx_第11页
第11页 / 共16页
ProCC编程Word下载.docx_第12页
第12页 / 共16页
ProCC编程Word下载.docx_第13页
第13页 / 共16页
ProCC编程Word下载.docx_第14页
第14页 / 共16页
ProCC编程Word下载.docx_第15页
第15页 / 共16页
ProCC编程Word下载.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ProCC编程Word下载.docx

《ProCC编程Word下载.docx》由会员分享,可在线阅读,更多相关《ProCC编程Word下载.docx(16页珍藏版)》请在冰点文库上搜索。

ProCC编程Word下载.docx

通过正常的C/C++编译器编译连接应用程序=?

运行应用程序

二、Pro*C/C++GCC环境配置

、Pro*C/C++预编译环境

当您安装Oracle数据库产品的时候,Pro*C/C++的预编译环境缺省就为我们安装好了,我们这里以安装Oracle10G版本为例.在Oracle_Home的Bin目录下,您可以找到预编译程序,这个就是用来预编译您有在C/C++代码中嵌入SQL的文件的.该编译程序用到了Oracle_Home下的precomp\public目录中的.h头文件,在正真编译生成可执行文件时又会用到precomp\lib的一个.lib库文件.

我们进入command窗口,看看proc编译命名的参数:

Pro*C/C++编译命令参数(10G)

C:

\oracle\product\10.2.0\db_2\BIN>

proc

Pro*C/C++:

Release10.2.0.-ProductiononMonFeb2316:

22:

292009

Copyright(c)1982,2005,Oracle.Allrightsreserved.

Systemdefaultoptionvaluestakenfrom:

C:

\oracle\product\10.2.0\db_2\precomp\admin\

OptionNameCurrentValueDescription

-------------------------------------------------------------------------------

auto_connectnoAllowautomaticconnectiontoops$account

char_mapcharzMappingofcharacterarraysandstrings

close_on_commitnoCloseallcursorsonCOMMIT

cmax100CMAXValueforconnectionpool

cmin2CMINValueforconnectionpool

cincr1CINCRValueforconnectionpool

ctimeout0CTIMEOUTValueforconnectionpool

cnowait0CNOWAITValueforconnectionpool

codecppThetypeofcodetobegenerated

comp_charsetmulti_byteThecharactersettypetheCcompilersupports

configdefaultOverridesystemconfigurationfilewithanother

cpoolnoSupportconnectionpooling

cpp_suffixccOverridethedefaultC++filenamesuffix

dbmsnativev6/v7/v8compatibilitymode

def_sqlcodenoGenerate'

#defineSQLCODE'

macro

define*none*Defineapreprocessorsymbol

durationtransactionSetpindurationforobjectsinthecache

dynamicoracleSpecifyOracleorANSIDynamicSQLSemantics

errorsyesWhethererrormessagesaresenttotheterminal

errtype*none*Nameofthelistfileforintypefileerrors

eventsnoSupportpublish-subscribeeventnotifications

fipsnoneFIPSflaggingofANSInoncompliantusage

header*none*SpecifyfileextensionforPrecompiledHeaders

hold_cursornoControlholdingofcursorsinthecursorcache

iname*none*Thenameoftheinputfile

include*none*Directorypathsforincludedfiles

intype*none*Thenameoftheinputfilefortypeinformation

linesnoAdd#linedirectivestothegeneratedcode

lname*none*Overridedefaultlistfilename

ltypeshortTheamountofdatageneratedinthelistfile

maxliteral1024Maximumlengthofageneratedstringliteral

maxopencursors10Maximumnumberofcachedopencursors

modeoracleCodeconformancetoOracleorANSIrules

native_typesnoSupportfornativefloat/double

nls_char*none*SpecifyNationalLanguagecharactervariables

nls_localnoControlhowNLScharactersemanticsaredone

objectsyesSupportobjecttypes

oname*none*Thenameoftheoutputfile

oracanoControltheuseoftheORACA

pagelen80Thepagelengthofthelistfile

parsenoneControlwhichnon-SQLcodeisparsed

prefetch1Numberofrowspre-fetchedatcursorOPENtime

release_cursornoControlreleaseofcursorsfromcursorcache

select_erroryesControlflaggingofselecterrors

sqlcheckSEMANTICSAmountofcompile-timeSQLchecking

sys_include*none*Directorywheresystemheaderfilesarefound

threadsnoIndicatesamulti-threadedapplication

type_codeoracleUseOracleorANSItypecodesforDynamicSQL

unsafe_nullnoAllowaNULLfetchwithoutindicatorvariable

userid*none*Ausername/password[@dbname]connectstring

utf16_charsetnchar_charsetThecharactersetformusedbyUTF16variables

varcharnoAllowtheuseofimplicitvarcharstructures

versionrecentWhichversionofanobjectistobereturned

win32_threadsnoSupportwindowsdefaultlocalthreading

PCC-F-02135,CMD-LINE:

Useraskedforhelp

这些命令参数选项,除了直接在命令行参数中指定外,您也可以通过precomp\admin\文件中进行指定,下面是一个样例:

ltype=short

code=cpp

cpp_suffix=cc

parse=none

SQLCHECK=SEMANTICS

这里我们介绍其中的三个参数:

code=cpp这个参数表明我们通过proc预编译命令产生的代码文件是符合C++规范的,如果您是在标准C环境中使用,那么您可以指定code=ansi_c

cpp_suffix=cc这个参数让proc命令产生的文件以.cc作为文件扩展名

SQLCHECK=SEMANTICS这个参数用于指示在预编译的时候是否要检查嵌入的SQL的语法,您可以设置NONE表示不检查(10G中中已经不再支持这个值了,至少设置为SYNTAX),SEMANTICS表示检查语义(也就是检查数据库表名,列名是否存在等)

、GCC编译器

在Windows环境中,您可以选择使用微软的VC编译器,或者Bland公司的BC编译器.我们这里使用GCC1)编译器,GCC编译器的安装可以直接从这里下载,最新提供一个在Windows下快速安装的工具程序.这里我们采用了Dev-CPP的开发环境,这个开发环境中包含了GCC,下载地址见

三、开始编写第一个Pro*C++代码

、第一个Pro*C++代码

本文中涉及到的C++知识不做过多介绍,已经超出了本文范围.

编写一个Oracle登陆程序(我们这里使用C++代码,当然您也可以使用标准C代码):

1:

usingnamespacestd;

2:

#include<

>

3:

#include"

"

10g<

<

endl;

16:

EXECSQLCOMMITWORKRELEASE;

17:

}

第5,7行代码表示要定义SQL宿主变量,这里边的变量的定义方式依照C++中的方式定义.这些变量除了能够在正常的C++代码中使用外,也能使用在嵌入的SQL语句中,因此被成为宿主变量

第6行就申明了一个SQL宿主变量

第11行为连接数据库的指令.

第12行判断SQL通讯区变量sqlca中的信息,以检查sql语句执行是否成功,这里检查是否连接成功,成功执行值为0,当有错误发生时,这个子结构保存了相应的错误讯息.

第16行为提交工作并释放资源(也即断开连接).

我们把这个文件保存在C:

\proc目录下,命名为(通常我们编写的Pro*C程序以.pc结尾)

、Pro*C++代码预编译

首先设置预编译命令的路径,然后再行编译

\>

setORACLE_HOME=C:

\oracle\product\10.2.0\db_2

setpath=%ORACLE_HOME%\bin

cdproc

\proc>

dir/b

proc

Release10.2.0.-ProductiononWedFeb2513:

58:

522009

 

以上已经与编译成功,我们可以看到新产生了文件,这个文件就是将嵌入的SQL指令预编译成为标准的ORACLE库函数调用后的文件.您可以查看该文件内容.

、GCC编译

在进行预编译产生正常的C++代码文件后,接下来,我们只需要用C++编译器编译这个.cc文件即可得到我们的可执行文件.我们首先需要设置一下Path,以便找到我们的编译器,我的gcc编译器在c:

\Dev-Cpp\bin目录下,由于这里使用的是C++的编程,所以我使用g++编译命令

setpath=C:

\Dev-Cpp\bin;

%path%

g++

:

145:

19:

:

Nosuchfileordirectory

Infunction`intmain()'

167:

error:

`sqlca'

undeclared(firstusethisfunction)

(Eachundeclaredidentifierisreportedonlyonceforeachfunctionitappearsin.)

这里出错了,因为sqlca这个结构变量没有找到,实际上是没有找到这个头文件,这个头文件在%ORACLE_HOME%\precomp\public目录下,因此我们通过命令行指定这个位置:

g++-I%ORACLE_HOME%\precomp\public

\DOCUME~1\nyfor\LOCALS~1\Temp/(.text+0x2b9):

undefinedreferenceto`sqlcxt'

collect2:

ldreturned1exitstatus

依然有错误,提示找不到sqlcxt的引用,这个是在链接的时候发生的错误,链接时需要一个Oracle库文件,这个库文件位置在%ORACLE_HOME%\precomp\lib目录中,文件名为:

Oracle9i的文件名为

我们指定库文件路径及库文件后重新编译:

g++-I%ORACLE_HOME%\precomp\public-L%ORACLE_HOME%\precomp\LIB-lorasql10

至此,我们成功生成了一个可执行文件,这个文件可以用来测试登陆.

、最后测试

当我们生成好了可执行文件后,我们开始测试,

a

Success.

当我们把OracleListener停掉后再行测试

ORA-12170:

TNS:

Connecttimeoutoccurred

四、复杂一些的Pro*C/C++代码

、代码部分

这里我们直接在代码中编写注释,以阐释Pro*C/C++中的一些基本指令的用法

usingnamespacestd;

#include<

iostream>

#include"

EXECSQLBEGINDECLARESECTION;

..."

EXECSQLWHENEVERSQLERRORCONTINUE;

{

cout<

TableT_EMPdroped."

EXECSQLWHENEVERSQLERRORDOsql_error();

EXECSQLcreatetablet_empasselectempno,ename,salfromempwhere1=0;

TableT_EMPcreated."

/*

下面在main函数内申明SQL宿主变量,这里的就是局部变量了,只能用在函数main内部以下申明了一些数组变量,供我们用来存储查询语句返回的多行数据,在PL/SQL中我们也曾使用bulkcollectinto子句来批量fetch数据;

当然我们也可以不定义数组,而定义单个变量,这样每次就只能获取一条数据.

*/

intempno[5];

*/

floatsal[5];

/

shortsal_ind[5];

intlast_cnt;

intfetch_cnt;

EXECSQLENDDECLARESECTION;

;

EXECSQLselectempno,ename,salinto:

empno,:

ename,:

sal:

sal_indfromt_emp;

EXECSQLWHENEVERNOTFOUNDcontinue;

注意!

!

为何这里sqlcod值为1403?

那是因为我们定义的数组容量为5,那么程序就会

帮助我们一次性要获取到5条记录,而在获取第5条记录时,已经找不到数据,

因此就会出现NO_DATA_FOUND,而如果你这里修改rownum<

=4为rownum<

=5

那么你会发现sqlcode不再是1403,而是0,再进一步,如果你修改成rownum<

=6

那么这里将会发生TOO_MANY_ROWS例外,这个例外会被WHENEVERSQLERROR捕获到,

因此这里就会转去执行sql_error()函数.

Empno\tEname\tSal\tIndicator?

for(inti=0;

i<

[2];

i++)

empno[i]<

'

\t'

ename[i]<

sal[i]<

sal_ind[i]<

/*上面的数组数据中你会发现指示器有的为-1表明对应的Sal栏位值为NULL,

因为有些comm值为null,将sal直接加上comm后,则结果会出现NULL值

对于NULL值的资料栏位,我们会发现对应栏位的值是乱七八糟的,实际上当数据库资料

为NULL值时,程式根本不会去设置相应变量的值,而只是设置指示器变量的值.栏位变量的值

仍然保留SQL执行之前的值.*/

/*下面申明一个静态游标(Cursor),显式游标的使用依然遵循定义,打开,资料获取,关闭四个动作*/

EXECSQLDECLAREcur_empCURSORFOR

selectempno,ename,rownum*100+commfromempwhererownum<

=8;

EXECSQLOPENcur_emp;

last_cnt=0;

EXECSQLFETCHcur_empinto:

sal_ind;

/*[2]对于insert,update,delete表示影响到的行数,

对于select则表示Fetch到的数据的总行数,尚未Fetch的数据不计入*/

fetch_cnt=[2]-last_cnt;

*/

last_cnt=[2];

Datafetched"

fetch_cnt<

rowsfromEMP."

if==1403)last_cnt=0;

/*批量插入数据行,注意批量插入时必须指定要插入的行数,用for表明.

假定这里我们去掉for:

fetch_cnt,那么我们的Pro*C预编译程序会根据

插入值变量中的数组元素个数作为批量插入的行数,也即会插入数组中全部的元素

除非你确定数组中全部的元素都要插入,请务必指定要插入的行数.

因为我们这里演示的是获取一批数据插入一批数据,在最后一批时可能只有少量几笔,

所以这里我们对插入的行数进行了指定*/

EXECSQLfor:

fetch_cntinsertintot_empvalues(:

sal_ind);

Datainsert"

rowsintoT_EMP."

}while(last_cnt!

=0);

/*注意上面循环末尾不能用while!

=1403)因为到达循环末尾时

sqlca的内容已经不再表示前面fetch的结果了,而是最后的那个insert语句的结果,

我们在代码中做一个记录,在Fetch出现1403时,将last_cnt置为0,用于最后退出循环的判断*/

EXECSQLCLOSEcur_emp;

DatabaseDisconnected....

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2