實(shí)際開發(fā)中的教程_第1頁(yè)
實(shí)際開發(fā)中的教程_第2頁(yè)
實(shí)際開發(fā)中的教程_第3頁(yè)
實(shí)際開發(fā)中的教程_第4頁(yè)
實(shí)際開發(fā)中的教程_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)際開發(fā)中的教程第一頁(yè),共七十四頁(yè),2022年,8月28日Points3.宿主變量與指示變量4.嵌入SQL語(yǔ)句5.連接數(shù)據(jù)庫(kù)6.錯(cuò)誤處理1.PROC簡(jiǎn)介7.數(shù)據(jù)的存取更新操作8.動(dòng)態(tài)sql2.PROC程序的編寫步驟第二頁(yè),共七十四頁(yè),2022年,8月28日Pro程序通過在過程化編程語(yǔ)言中嵌入SQL語(yǔ)句而開發(fā)出的應(yīng)用程序稱為Pro程序。在通用編程語(yǔ)言中使用的SQL稱為嵌入式SQL在SQL標(biāo)準(zhǔn)中定義了多種語(yǔ)言的嵌入式SQL各個(gè)廠商對(duì)嵌入式SQL的具體實(shí)現(xiàn)不同宿主語(yǔ)言 Pro程序C/C++ Pro*C/C++FORTRANPro*FORTRANPASCALPro*PASCALCOBOLPro*COBOLPL/I Pro*PL/IAda Pro*Ada第三頁(yè),共七十四頁(yè),2022年,8月28日Pro*C/C++程序在C/C++語(yǔ)言中嵌入SQL語(yǔ)句而開發(fā)出的應(yīng)用程序稱為Pro*C/C++程序。目的:使c/c++這種高效率語(yǔ)言成為訪問數(shù)據(jù)庫(kù)的工具。第四頁(yè),共七十四頁(yè),2022年,8月28日Pro*C程序?qū)嵗?include<stdio.h>EXECSQLBEGINDECLARESECTION;charusername[20];charpassword[20];charlast_name[25];EXECSQLENDDECLARESECTION;EXECSQLINCLUDEsqlca;voidsqlerror();main(){EXECSQLWHENEVERSQLERRORDOsqlerror();strcpy(username,"tarena");strcpy(password,"tarena");EXECSQLCONNECT:usernameIDENTIFIEDBY:password;

EXECSQLselectLAST_NAMEinto:last_namefromS_EMPwhereid=2;printf("\nID=2,last_name=%s\n",last_name);}voidsqlerror(){EXECSQLWHENEVERSQLERRORCONTINUE;printf("\n----oracleerrordetected:\n");printf("%.70s\n",sqlca.sqlerrm.sqlerrmc);EXECSQLROLLBACKWORKRELEASE;exit(1);}第五頁(yè),共七十四頁(yè),2022年,8月28日Include頭文件(c/c++andpro*c/c++)定義變量定義函數(shù)main

連結(jié)數(shù)據(jù)庫(kù):connect

SQL操作語(yǔ)句:EXECSQL…….; exceptionhandler 斷開連結(jié):EXECSQLCOMMIT/ROLLBACKWORKreleasePROC程序結(jié)構(gòu)第六頁(yè),共七十四頁(yè),2022年,8月28日一般應(yīng)用程序(C)開發(fā)運(yùn)行標(biāo)準(zhǔn)流程CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.c文件.o文件可執(zhí)行文件第七頁(yè),共七十四頁(yè),2022年,8月28日%via_1.ca_2.c%gcc–ca_1.ca_2.c%gcc-oaa_1.oa_2.o一般應(yīng)用程序(C)開發(fā)運(yùn)行標(biāo)準(zhǔn)流程第八頁(yè),共七十四頁(yè),2022年,8月28日Pro*C程序開發(fā)運(yùn)行流程.o文件可執(zhí)行文件CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.pc文件PrecompileModifiedSourceProgram.c文件第九頁(yè),共七十四頁(yè),2022年,8月28日完成Pro*C源程序到純C源程序的轉(zhuǎn)換基本命令格式PROCINAME=filename[OptionName1=value1]…[OptionNameN=valueN]Pro*C預(yù)編譯程序第十頁(yè),共七十四頁(yè),2022年,8月28日PROC常用預(yù)編譯選項(xiàng)INAME=pathandfilename(nameoftheinputfile)ONAME=pathandfilename(nameoftheoutputfile)INCLUDE=path(頭文件所在路徑)--INCLUDE=路徑名或INCLUDE=(路徑名1,路徑名2)PARSE=FULL|PARTIA|NONE(defaultFULLforC,OthersforC++)CODE=ANSI_C|CPP(defaultansi_c)USERID=username/password第十一頁(yè),共七十四頁(yè),2022年,8月28日Pro*C程序開發(fā)運(yùn)行流程Pro*C程序開發(fā)運(yùn)行流程%via.pc%proca.pc%gcc-oaa.c-lclntsh--ComparePro*Candit’sCcode第十二頁(yè),共七十四頁(yè),2022年,8月28日Pro*C++預(yù)編譯程序Pre-compile:procmyf.pconame=myf.cppparse=nonecode=cpp2.Compile:g++-omyfilemyfile.cpp–lclntsh3.Execute: myfile#include<iostream>Usingnamespacestd;EXECSQLBEGINDECLARESECTION;charuser_passwd[20];EXECSQLENDDECLARESECTION;EXECSQlincludesqlca;main(){EXECSQLWHENEVERSQLERRORstop;strcpy(user_passwd,"tarena/tarena");EXECSQLCONNECT:user_passwd;cout<<"ConnectedtoORACLEasuser“<<,user_passwd;}第十三頁(yè),共七十四頁(yè),2022年,8月28日宿主變量宿主變量是一種pro*c語(yǔ)言變量,用于在應(yīng)用程序中和oracle數(shù)據(jù)庫(kù)之間傳遞數(shù)據(jù)。Pro*C程序中,既可在SQL語(yǔ)句中引用,也可在C語(yǔ)句中引用的變量稱為SQL變量。C語(yǔ)言語(yǔ)句群SQL語(yǔ)言語(yǔ)句群宿主變量第十四頁(yè),共七十四頁(yè),2022年,8月28日宿主變量的數(shù)據(jù)類型數(shù)據(jù)類型 描述char 單字符char[n] N個(gè)定長(zhǎng)字符數(shù)組int 整數(shù)short 短整數(shù)long 長(zhǎng)整數(shù)float 單精度浮點(diǎn)數(shù)double 雙精度浮點(diǎn)數(shù)VARCHAR[n] 變長(zhǎng)字符串第十五頁(yè),共七十四頁(yè),2022年,8月28日宿主變量的使用輸入---將應(yīng)用程序的數(shù)據(jù)傳遞到數(shù)據(jù)庫(kù)中。

intsalary,emp_number;cin>>salary;cin>>emp_number; EXECSQLupdateempsetsal=:salarywhereempno=:emp_number;輸出---將數(shù)據(jù)庫(kù)的數(shù)據(jù)傳遞到應(yīng)用程序中。

floatv_salary; charv_job;EXECSQLselectsal,jobINTO:v_salary,:v_jobfromempwhereempno=7788; cout<<v_salary<<v_job;第十六頁(yè),共七十四頁(yè),2022年,8月28日處理字符數(shù)據(jù)

預(yù)編譯選項(xiàng)CHAR_MAP CHAR_MAP=CHARZ(默認(rèn)設(shè)置):'\0'結(jié)尾,定長(zhǎng),空格補(bǔ)齊。 CHAR_MAP=CHARF|VARCHAR2:定長(zhǎng),空格補(bǔ)齊。 CHAR_MAP=STRING: '\0'結(jié)尾,變長(zhǎng)。當(dāng)'\0'結(jié)尾,宿主變量長(zhǎng)度要大于實(shí)際數(shù)據(jù)長(zhǎng)度。VARCHAR 1.變長(zhǎng),不是'\0'結(jié)尾。 2.Struct{ unsignedshortlen; unsignedchararr[] }variable_name;第十七頁(yè),共七十四頁(yè),2022年,8月28日使用宿主變量的注意事項(xiàng)其申明語(yǔ)法與普通C變量一致,但在CODE=CPP或MODE=ANSI

時(shí)變量必須放在申明區(qū).可使用pointer作為宿主變量,使用前分配空間。

在DDL語(yǔ)句中不能用宿主變量。錯(cuò)誤例子:

chartable_name[30]; cin>>table_name; EXECSQLDROPTABLE:table_name;第十八頁(yè),共七十四頁(yè),2022年,8月28日指示變量指示變量(indicatorvariable)短整型變量,用于處理數(shù)據(jù)庫(kù)的NULL值,監(jiān)督和管理與其相關(guān)聯(lián)的宿主變量。引用語(yǔ)法:

:host_variableINDICATOR:indicator_variable OR :host_variable:indicator_variable第十九頁(yè),共七十四頁(yè),2022年,8月28日指示變量的作用主要用在輸出,即當(dāng)宿主變量用于接收數(shù)據(jù)庫(kù)的返回?cái)?shù)據(jù)時(shí)。通過在宿主變量后用指示變量,檢測(cè)是否返回了NULL。-1:數(shù)據(jù)庫(kù)表列的值為NULL,指示變量相關(guān)聯(lián)的輸出宿主變量值不確定=0:Oracle將數(shù)據(jù)庫(kù)表列值原封不動(dòng)的賦給指示器變量相關(guān)聯(lián)的輸出宿主變量0:Oracle將數(shù)據(jù)庫(kù)表列值截?cái)嗪筚x給指示器變量相關(guān)聯(lián)的輸出宿主變量,指示器變量值為該列值的原始長(zhǎng)度第二十頁(yè),共七十四頁(yè),2022年,8月28日指示變量例子EXECSQLBEGINDECLARESECTION; intm_id;shortind_m_id;EXECSQLENDDECLARESECTION;…EXECSQLSELECTmanager_idINTO:m_id:ind_m_idFROMs_empWHEREid=1;If(ind_m_id==-1)cout<<“emp_descisNULL”<<endl;elsecout<<m_id<<endl;第二十一頁(yè),共七十四頁(yè),2022年,8月28日數(shù)組變量Pro*C只支持一維數(shù)組Pro*C不支持?jǐn)?shù)組指針Pro*C所支持?jǐn)?shù)組最大維數(shù)是32767,超出此限制將報(bào)錯(cuò)示例 EXECSQLBEGINDECLARESECTION; intA[100]; charB[100]; charC[100][15]; EXECSQLENDDECLARESECTION;第二十二頁(yè),共七十四頁(yè),2022年,8月28日數(shù)組變量在SQL語(yǔ)句中使用數(shù)組變量,只需給出:和變量名稱,不要給下標(biāo)。示例 EXECSQLBEGINDECLARESECTION; intemp_number[100]; charemp_name[100][15]; EXECSQLENDDECLARESECTION;

EXECSQLSELECTnumber,nameINTO:emp_number,:emp_nameFROMemp;第二十三頁(yè),共七十四頁(yè),2022年,8月28日數(shù)組變量錯(cuò)誤的例子:

for(inti=0;i<100;i++){ EXECSQLSELECTnumber,nameINTO:emp_number[i],:emp_name[i];}指示器數(shù)組例子:

EXECSQLBEGINDECLARESECTION; intemp_number[100]; charemp_name[100][15]; shortind_emp_number[100]; EXECSQLENDDECLARESECTION; … EXECSQLSELECTnumber,nameINTO:emp_number:ind_emp_number,:emp_name;第二十四頁(yè),共七十四頁(yè),2022年,8月28日通信區(qū)說明(SQLCA)SQLCA是ORACLE提供的兩個(gè)通信區(qū)之一。SQLCA實(shí)際上是一個(gè)結(jié)構(gòu)變量,其目的是為了診斷錯(cuò)誤和事件處理結(jié)果。SQLCA的結(jié)構(gòu) structsqlca{ /*ub1*/charsqlcaid[8]; /*b4*/intsqlabc; /*b4*/intsqlcode; struct{ /*ub2*/unsignedshortsqlerrml; /*ub1*/charsqlerrmc[70];}sqlerrm; /*ub1*/charsqlerrp[8]; /*b4*/intsqlerrd[6]; /*ub1*/charsqlwarn[8]; /*ub1*/charsqlext[8];};第二十五頁(yè),共七十四頁(yè),2022年,8月28日通信區(qū)說明(SQLCA)sqlcaid[8]用于標(biāo)識(shí)一個(gè)SQLCAsqlabc用于保存SQLCA的長(zhǎng)度sqlcode用于保存最近一次運(yùn)行SQL指令的狀態(tài)

0 - 正常

>0 - 有一個(gè)異常發(fā)生

<0 - 系統(tǒng)錯(cuò)誤,可能來(lái)自網(wǎng)絡(luò),或數(shù)據(jù)庫(kù)本身sqlerrm.sqlerrml保存錯(cuò)誤文本信息的長(zhǎng)度sqlerrm.sqlerrmc保存錯(cuò)誤文本信息,最長(zhǎng)為70個(gè)字符sqlerrp系統(tǒng)保留sqlerrd[6] 0,1 ,3,5-系統(tǒng)保留

2 -當(dāng)前SQL指令處理的行數(shù)

4 -保存相對(duì)位移,指出在什么地方出現(xiàn)語(yǔ)法錯(cuò)誤第二十六頁(yè),共七十四頁(yè),2022年,8月28日通信區(qū)說明(SQLCA)sqlwarn[8] 0-指示是否設(shè)置了警告標(biāo)志

1-指示是否將字符結(jié)果返回給宿主變量時(shí),數(shù)據(jù)截短了

3-如果查詢時(shí),返回的列數(shù)和指定的宿主數(shù)組變量的維數(shù)不等時(shí)設(shè)置該位

4-UPDATE和DELETE時(shí)沒有行被處理,設(shè)置改標(biāo)志位

5-當(dāng)EXECSQLCREATE{PROCEDURE|FUNCTION|PACKAGE|PACKAGEBODY}失敗時(shí),設(shè)置該位

2,6,7-系統(tǒng)保留sqlext[8]系統(tǒng)保留第二十七頁(yè),共七十四頁(yè),2022年,8月28日intmain(){ … EXECSQLINCLUDEsqlca; … EXECSQLWHENEVERSQLERRORDoerr_report(sqlca); … }voiderr_report(structsqlcasqlca){ if(sqlca.sqlcode<0) ,sqlca.sqlerrm.sqlerrmc); exit(1); }SQLCA應(yīng)用實(shí)例第二十八頁(yè),共七十四頁(yè),2022年,8月28日通信區(qū)說明(ORACA)當(dāng)需要更進(jìn)一步的信息時(shí),ORACA將幫助我們達(dá)成愿望,所以O(shè)RACA也可以看作時(shí)SQLCA的補(bǔ)充和輔助。第二十九頁(yè),共七十四頁(yè),2022年,8月28日通信區(qū)說明(ORACA)structoraca{ /*text*/charoracaid[8];/*Reserved*/ /*ub4*/intoracabc;/*Reserved*/ /*ub4*/intoracchf;/*<>0if"checkcurcacheconsistncy"*/ /*ub4*/intoradbgf;/*<>0if"doDEBUGmodechecking"*/ /*ub4*/intorahchf;/*<>0if"doHeapconsistencycheck"*/ /*ub4*/intorastxtf;/*SQLstmttextflag*/ struct{ /*ub2*/unsignedshortorastxtl; /*text*/charorastxtc[70]; }orastxt;/*textoflastSQLstmt*/ struct{ /*ub2*/unsignedshortorasfnml; /*text*/charorasfnmc[70]; }orasfnm;/*nameoffilecontainingSQLstmt*/ /*ub4*/intoraslnr;/*linenr-within-fileofSQLstmt*/ /*ub4*/intorahoc;/*highestmaxopenOraCursrequested*/ /*ub4*/intoramoc;/*maxopenOraCursorsrequired*/ /*ub4*/intoracoc;/*currentOraCursorsopen*/ /*ub4*/intoranor;/*nrofOraCursorre-assignments*/ /*ub4*/intoranpr;/*nrofparses*/ /*ub4*/intoranex;/*nrofexecutes*/ };第三十頁(yè),共七十四頁(yè),2022年,8月28日通信區(qū)說明(ORACA)oracaid[8]標(biāo)識(shí)一個(gè)ORACA通信區(qū)oracabc用于保存ORACA通信區(qū)的長(zhǎng)度oradbgf調(diào)試標(biāo)志,0-關(guān)閉,1-開啟oracchf如果oradbgf=1,那oracchf遵循下列規(guī)則:

0-禁止光標(biāo)緩沖一致性檢查

1-進(jìn)行光標(biāo)緩沖一致性檢查orahchf如果oradbgf=1,那oracchf遵循下列規(guī)則:

0-禁止堆緩沖一致性檢查

1-進(jìn)行堆緩沖一致性檢查orastxtf可以是以下各值:

0-不保存SQL文本

1-僅對(duì)SQLERROR保存SQL文本

2-僅對(duì)SQLERROR和SQLWARNING保存SQL文本

3-總是保存SQL文本第三十一頁(yè),共七十四頁(yè),2022年,8月28日通信區(qū)說明(ORACA)要使用ORACA,那么就要顯式的加載ORACA結(jié)構(gòu)到Pro*C程序中??赏ㄟ^語(yǔ)句

EXECSQLINCLUDEoraca; EXECORACLEOPTION(ORACA=YES);

實(shí)現(xiàn)。第三十二頁(yè),共七十四頁(yè),2022年,8月28日嵌入SQL語(yǔ)句EXECSQLINSERTdept(1,‘人事部’,‘中鼎大廈7層’);EXECSQLsql-statement;形式:示例:?jiǎn)蝹€(gè)SQL語(yǔ)句的嵌入語(yǔ)法第三十三頁(yè),共七十四頁(yè),2022年,8月28日嵌入事務(wù)控制語(yǔ)句事務(wù)控制語(yǔ)句Commit,rollbackandsavepoint.EXECSQLcommit;EXECSQLcommitworkrelease;EXECSQLrollbackworkrelease;第三十四頁(yè),共七十四頁(yè),2022年,8月28日嵌入事務(wù)控制語(yǔ)句…EXECSQLSAVEPOINTsavepoint_insert;for(i=1;i<100;i++){getInput1(empName,&salary);EXECSQLWHENEVERSQLERRORGOTOinsert_error;EXECSQLINSERTINTOemp(ename,sal)VALUES(:empName,:salary);}…EXECSQLSAVEPOINTsavepoint_delete;for(i=1;i<100;i++){getInput2(&deptNo);EXECSQLWHENEVERSQLERRORGOTOdelete_error;EXECSQLDELETEFROMempWHEREdeptno=:deptNo;}…delete_error:EXECSQLWHENEVERSQLERRORCONTINUE;EXECSQLROLLBACKTOSAVEPOINTsavepoint_delete;…insert_error:EXECSQLWHENEVERSQLERRORCONTINUE;EXECSQLROLLBACKTOSAVEPOINTsavepoint_insert;…第三十五頁(yè),共七十四頁(yè),2022年,8月28日數(shù)據(jù)操作語(yǔ)句(DML)語(yǔ)句列表EXECSQLSelect…….;EXECSQLInsert…….;EXECSQLupdate…….;EXECSQLDelete…….;嵌入DML語(yǔ)句第三十六頁(yè),共七十四頁(yè),2022年,8月28日數(shù)據(jù)定義語(yǔ)句(DDL):create,alter,dropExample:EXECSQLCREATTABLEt1(colaint);EXECSQLDROPTABLEt1;EXECSQLALTERTABLEt1add(faxnonumber);對(duì)象名,列名不能用宿主變量.自動(dòng)提交事務(wù)嵌入DDL語(yǔ)句第三十七頁(yè),共七十四頁(yè),2022年,8月28日嵌入PL/SQL語(yǔ)句PL/SQL的嵌入語(yǔ)法/********************************/EXECSQLEXECUTEBEGIN /*PL/SQLBLOCK*/END;END-EXEC;/*******************************/形式:第三十八頁(yè),共七十四頁(yè),2022年,8月28日嵌入PL/SQL的語(yǔ)法PL/SQL的嵌入—匿名塊(anonymousblocks)/*--------------beginPL/SQLblock-----------------*/EXECSQLEXECUTEBEGIN SELECTjob,hiredate,salINTO:job_title,:hire_date,:salaryFROMemp WHEREempno=:emp_number;

DELETEfromemp whereempno=:emp_number; ……END;END-EXEC;/*--------------endPL/SQLblock-----------------*/第三十九頁(yè),共七十四頁(yè),2022年,8月28日調(diào)用PL/SQL語(yǔ)句PL/SQL的嵌入—package,procedure,functionEXECSQLEXECUTEBEGIN emp_action.raise_salary(:empNo,:increase);END;END-EXEC;Createorreplacepackageemp_actionisprocedureraise_salary(empNOnumber,increasenumber); …Endemp_action;PL/SQL程序:Pro*C程序:第四十頁(yè),共七十四頁(yè),2022年,8月28日先有連結(jié),后才能訪問數(shù)據(jù)庫(kù).連結(jié)的方法:

連結(jié)本地或遠(yuǎn)程數(shù)據(jù)庫(kù) 連結(jié)一個(gè)或多個(gè)數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)第四十一頁(yè),共七十四頁(yè),2022年,8月28日EXECSQLCONNECT{:userIDENTIFIEDBY:pswd|:usr_psw}[[AT{dbname|:host_variable}]USING:connect_string][ALTERAUTHORIZATION:newpswd];Connect語(yǔ)法形式第四十二頁(yè),共七十四頁(yè),2022年,8月28日連接本地?cái)?shù)據(jù)庫(kù)本地:客戶應(yīng)用程序與oracleserver在同一臺(tái)機(jī)器上.方式一:用戶名口令由兩個(gè)獨(dú)立變量存儲(chǔ)CharuserName[20]=“scott”;CharuserPwd[20]=“tiger”;EXECSQLCONNECT:userNameIDENTIFIEDBY:userPwd;Charuname_pwd[40]=“scott/tiger”;EXECSQLCONNECT:uname_pwd;方式二:用戶名口令由單個(gè)變量存儲(chǔ)第四十三頁(yè),共七十四頁(yè),2022年,8月28日連接遠(yuǎn)端數(shù)據(jù)庫(kù)遠(yuǎn)端:客戶應(yīng)用程序與oracleserver不在同一臺(tái)機(jī)器上.charuserPwd[20]=“scott/tiger”;chardbString[20]=“remoteDB”;EXECSQLCONNECT:userPwdUsing:dbString;remoteDB是網(wǎng)絡(luò)服務(wù)名,在$ORACLE_HOME/network/admin/tnsnames.ora文件中定義.連接方式:第四十四頁(yè),共七十四頁(yè),2022年,8月28日使用數(shù)據(jù)庫(kù)鏈訪問遠(yuǎn)端數(shù)據(jù)庫(kù)Charname[25]=“scottsmith”;/***修改本地?cái)?shù)據(jù)庫(kù)區(qū)**/EXECSQLupdateempsetsal=:salarywhereename=:name;/***修改遠(yuǎn)端數(shù)據(jù)庫(kù)區(qū)**/EXECSQLupdateemp@myLinksetsal=:salarywhereename=:name;EXECSQLcommitworkrelease;CREATEDATABASELINKmyLinkCONNECTTOtarenaIDENTIFIEDBYtarenaUsing‘tlab1’;用SQLPLUS創(chuàng)建數(shù)據(jù)庫(kù)鏈接:第四十五頁(yè),共七十四頁(yè),2022年,8月28日連接多個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序遠(yuǎn)端數(shù)據(jù)庫(kù)ORA1遠(yuǎn)端數(shù)據(jù)庫(kù)ORA2遠(yuǎn)端數(shù)據(jù)庫(kù)ORA3本地?cái)?shù)據(jù)庫(kù)ORA0Net8一個(gè)程序同時(shí)連接多個(gè)數(shù)據(jù)庫(kù)或者建立多個(gè)連接到同一個(gè)數(shù)據(jù)庫(kù)第四十六頁(yè),共七十四頁(yè),2022年,8月28日連接多個(gè)數(shù)據(jù)庫(kù)charuser1[10]="scott/tiger",db1[10]="ora1“,dbString1[20]=“oracle1”;charuser2[10]="scott/tiger“,db2[10]="ora2“,dbString2[20]=“oracle2”;/*********************************/EXECSQLCONNECT:user1AT:db1Using:dbString1;EXECSQLCONNECT:user2AT:db2Using:dbString2;Charname[25]=“scottsmith”;/***修改db1數(shù)據(jù)庫(kù)區(qū)**/EXECSQLAT:db1updateempsetsal=:salarywhereename=:name;/***修改db2數(shù)據(jù)庫(kù)區(qū)**/EXECSQLAT:db2updateempsetsal=:salarywhereename=:name;EXECSQLAT:db1commitworkrelease;EXECSQLAT:db2commitworkrelease;第四十七頁(yè),共七十四頁(yè),2022年,8月28日使用數(shù)據(jù)庫(kù)鏈訪問遠(yuǎn)端數(shù)據(jù)庫(kù)應(yīng)用程序Net8遠(yuǎn)端數(shù)據(jù)庫(kù)ORA2遠(yuǎn)端數(shù)據(jù)庫(kù)ORA1數(shù)據(jù)庫(kù)鏈?zhǔn)窃诒镜財(cái)?shù)據(jù)庫(kù)和遠(yuǎn)端數(shù)據(jù)庫(kù)之間的一種指針.使用它可以在不同數(shù)據(jù)庫(kù)的SQL語(yǔ)句和事務(wù)之間建立關(guān)聯(lián)關(guān)系。第四十八頁(yè),共七十四頁(yè),2022年,8月28日SQLCA與錯(cuò)誤處理為了給用戶和開發(fā)人員提供oracleerrormessage,Oracle建議使用SQL通訊區(qū)(SQLCA).

SQLCAisaCstruct,紀(jì)錄每個(gè)當(dāng)前SQL語(yǔ)句的執(zhí)行狀態(tài),以便進(jìn)行錯(cuò)誤診斷和事件處理。#include<sqlca.h> OR EXECSQLINCLUDESQLCA;

第四十九頁(yè),共七十四頁(yè),2022年,8月28日SQLCA通訊區(qū)SQLCA的信息結(jié)構(gòu)structsqlca{charsqlcaid[8];longsqlcabc;longsqlcode;struct{ unsignedshortsqlerrml; char sqlerrmc[70];}sqlerrm;charsqlerrp[8];longsqlerrd[6];charsqlwarn[8];charsqlext[8];};第五十頁(yè),共七十四頁(yè),2022年,8月28日WHENEVER語(yǔ)句檢測(cè)并處理sql語(yǔ)句錯(cuò)誤。語(yǔ)法: EXECSQLWHENEVER<condition><action> condition:SQLWARNING,SQLERROR,NOTFOUND. action:CONTINUE,DO,GOTO,STOP,BREAKExample: EXECSQLWHENEVERSQLWARNINGCONTINUE; EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLWHENEVERNOTFOUNDDOnotfound();

第五十一頁(yè),共七十四頁(yè),2022年,8月28日WHENEVER語(yǔ)句的管轄范圍自動(dòng)檢查所有后面的SQLstatements.一般放在BeforefirstSQLstatement.IfusingmorethanoneWHENEVER,只有最近的WHENEVER

起作用。

第五十二頁(yè),共七十四頁(yè),2022年,8月28日一般的錯(cuò)誤處理方法用WHENEVER檢查sql語(yǔ)句錯(cuò)誤用SQLCA描述錯(cuò)誤Rollback所有的操作,release資源.第五十三頁(yè),共七十四頁(yè),2022年,8月28日錯(cuò)誤處理實(shí)例...voidsqlerror();Main(){ EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLCONNECT:usernameIDENTIFIEDBY:password; EXECSQLupdateempsetcomission=200whereemp_no=2;…..}voidsqlerror(){EXECSQLWHENEVERSQLERRORCONTINUE;cout<<"\n----oracleerrordetected:"<<sqlca.sqlerrm.sqlerrmc;EXECSQLROLLBACKWORKRELEASE;exit(1);}第五十四頁(yè),共七十四頁(yè),2022年,8月28日用單個(gè)變量操作單行單列用多個(gè)變量或結(jié)構(gòu)(struct)操作單行多列用數(shù)組(array)或游標(biāo)(cursor)操作多行多列數(shù)據(jù)的存取更新操作第五十五頁(yè),共七十四頁(yè),2022年,8月28日用單個(gè)變量操作單行單列

charename[35]; intempno=20; EXECSQLselectemp_nameINTO:enamefromemp whereemp_no=:empno; cout<<“thenameis“<<ename;注意事項(xiàng):字符串長(zhǎng)度定義指示變量的運(yùn)用

第五十六頁(yè),共七十四頁(yè),2022年,8月28日charv_name[31],charv_job[21];floatv_salary;intempno=20; EXECSQLselectemp_name,job,salary INTO:v_name,:v_job,:v_salary FROMemp WHEREemp_no=:empno; cout<<v_name<<v_job<<v_salary;注意事項(xiàng):變量順序與字段名一至用多個(gè)變量操作單行多列第五十七頁(yè),共七十四頁(yè),2022年,8月28日宿主結(jié)構(gòu)是指包含多個(gè)宿主變量的C語(yǔ)言結(jié)構(gòu),以此可簡(jiǎn)化單行多列操作。Struct{ int no; char name[10]; int salary; }emp_record;輸入:EXECSQLINSERTINTOemp(empno,ename,sal) VALUES(:emp_record);輸出:EXECSQLSELECTempno,ename,salINTO:emp_record WHERErownum=1;用結(jié)構(gòu)(struct)操作單行多列第五十八頁(yè),共七十四頁(yè),2022年,8月28日注意事項(xiàng):可用結(jié)構(gòu)pointer,但要分配空間。結(jié)構(gòu)成員的數(shù)據(jù)類型,順序必須與SQL語(yǔ)句一至。不能用嵌套的結(jié)構(gòu)。不能用C聯(lián)合(UNION)用結(jié)構(gòu)(struct)操作單行多列第五十九頁(yè),共七十四頁(yè),2022年,8月28日目的:降低網(wǎng)絡(luò)開銷,提高程序性能。數(shù)組和INSERT語(yǔ)句:intnum[100];floatsalary[100];charname[100][25];/**在此為ARRAY賦值**/EXECSQLINSERTINTOemp(empno,ename,sal)VALUES(:num,:name,:salary);用數(shù)組(array)操作多行多列第六十頁(yè),共七十四頁(yè),2022年,8月28日用數(shù)組(array)操作多行多列數(shù)組和UPDATE/DELETE語(yǔ)句Charname[100];floatsalary[100];……../**在此為ARRAY賦值**/EXECSQLUPDATEEMPSETsal=:salaryWHEREename=:name;Charname[100];……../**在此為ARRAY賦值**/EXECSQLDELETEFROMempWHEREename=:name;第六十一頁(yè),共七十四頁(yè),2022年,8月28日用數(shù)組(array)操作多行多列數(shù)組和SELECT語(yǔ)句Charname[100][25];EXECSQLSELECTenameINTO:nameFROMemp WHEREdept_num=2;For(intj=0;j<sqlca.sqlerrd[2];j++) cout<<“Emp_name”<<name[j]<<endl;第六十二頁(yè),共七十四頁(yè),2022年,8月28日用數(shù)組(array)操作多行多列注意事項(xiàng):只有CHAR和VARCHAR可為二維數(shù)組。如數(shù)組INDEX不同,按最小操作。在SELECT語(yǔ)句的WHERE子句中,不能用數(shù)組。數(shù)組元素最大值:32767第六十三頁(yè),共七十四頁(yè),2022年,8月28日使用非滾動(dòng)游標(biāo)1。定義游標(biāo)

EXECSQLDECLAREemp_cursorCURSORFOR selectempno,ename,salfromempwheredeptno=10;2.打開游標(biāo)

EXECSQLOPENemp_cursor;(Opencursor:puttheselectresultsintoamemoryplace,andthecursorpointerpointstothefirstrowdata.)3.提取游標(biāo)

EXECSQLFETCHemp_cursorINTO:empnum,:name:salary; /**在此處理數(shù)據(jù)處理**/ (Afterfetch,cursorpointermovesdownoneline.Useloopformultiplerows)4.EXECSQLCLOSEemp_cursor;第六十四頁(yè),共七十四頁(yè),2022年,8月28日使用非滾動(dòng)游標(biāo)范例…intdept_number,emp_name;floatcommission;…EXECSQLDECLAREemp_cursorCURSORFOR SELECTempname,commFROMEMPWHEREdeptno=:dept_number;EXECSQLOPENemp_cursor;for(;;){ EXECSQLWHENEVERNOTFOUNDDObreak; EXECSQLFETCHemp_cursorINTO:emp_name,:commission; if(commission<1)cout<<emp_name<<“先生,請(qǐng)加油“;

}EXECSQLCLOSEemp_cursor;…第六十五頁(yè),共七十四頁(yè),2022年,8月28日使用滾動(dòng)游標(biāo)1.定義游標(biāo)EXECSQLDECLAREemp_cursorSCROLLCURSORFORselectempno,ename,salfromempwheredeptno=10;2.打開游標(biāo)EXECSQLOPENemp_cursor;3.提取游標(biāo)EXECSQLFETCHFIRSTemp_cursorINTO:empnum,:name:salary;

options:PRIOR(當(dāng)前行的前一行),NEXT(當(dāng)前行的下一行),CURRENT(當(dāng)前行),RELATIVEn(n為付/正,當(dāng)前行的前/后n行),ABSOLUTEn(游標(biāo)中的第n行),LAST。4.EXECSQLCLOSEemp_cursor;第六十六頁(yè),共七十四頁(yè),2022年,8月28日動(dòng)態(tài)SQL動(dòng)態(tài)SQL是指在運(yùn)行pro*c/c++應(yīng)用程序時(shí),動(dòng)態(tài)輸入的SQL語(yǔ)句。目的:加強(qiáng)應(yīng)用程序的功能和靈活性。比較靜態(tài)SQL和動(dòng)態(tài)SQL: 靜態(tài)SQL----在編寫應(yīng)用程序時(shí),使用EXECSQL關(guān)鍵字直接嵌入的SQL語(yǔ)句; 動(dòng)態(tài)SQL----在運(yùn)行應(yīng)用程序時(shí),由用戶動(dòng)態(tài)輸入的SQL語(yǔ)句。什么時(shí)候使用動(dòng)態(tài)SQL語(yǔ)句SQL語(yǔ)句的文本(命令,子句等)不確定宿主變量個(gè)數(shù)不確定宿主變量的數(shù)據(jù)類型不確定引用的數(shù)據(jù)庫(kù)對(duì)象(列,表等)不確

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論