




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
實際開發(fā)中的教程第一頁,共七十四頁,編輯于2023年,星期五Points3.宿主變量與指示變量4.嵌入SQL語句5.連接數(shù)據(jù)庫6.錯誤處理1.PROC簡介7.數(shù)據(jù)的存取更新操作8.動態(tài)sql2.PROC程序的編寫步驟第二頁,共七十四頁,編輯于2023年,星期五Pro程序通過在過程化編程語言中嵌入SQL語句而開發(fā)出的應(yīng)用程序稱為Pro程序。在通用編程語言中使用的SQL稱為嵌入式SQL在SQL標(biāo)準(zhǔn)中定義了多種語言的嵌入式SQL各個廠商對嵌入式SQL的具體實現(xiàn)不同宿主語言 Pro程序C/C++ Pro*C/C++FORTRANPro*FORTRANPASCALPro*PASCALCOBOLPro*COBOLPL/I Pro*PL/IAda Pro*Ada第三頁,共七十四頁,編輯于2023年,星期五Pro*C/C++程序在C/C++語言中嵌入SQL語句而開發(fā)出的應(yīng)用程序稱為Pro*C/C++程序。目的:使c/c++這種高效率語言成為訪問數(shù)據(jù)庫的工具。第四頁,共七十四頁,編輯于2023年,星期五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);}第五頁,共七十四頁,編輯于2023年,星期五Include頭文件(c/c++andpro*c/c++)定義變量定義函數(shù)main
連結(jié)數(shù)據(jù)庫:connect
SQL操作語句:EXECSQL…….; exceptionhandler 斷開連結(jié):EXECSQLCOMMIT/ROLLBACKWORKreleasePROC程序結(jié)構(gòu)第六頁,共七十四頁,編輯于2023年,星期五一般應(yīng)用程序(C)開發(fā)運行標(biāo)準(zhǔn)流程CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.c文件.o文件可執(zhí)行文件第七頁,共七十四頁,編輯于2023年,星期五%via_1.ca_2.c%gcc–ca_1.ca_2.c%gcc-oaa_1.oa_2.o一般應(yīng)用程序(C)開發(fā)運行標(biāo)準(zhǔn)流程第八頁,共七十四頁,編輯于2023年,星期五Pro*C程序開發(fā)運行流程.o文件可執(zhí)行文件CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.pc文件PrecompileModifiedSourceProgram.c文件第九頁,共七十四頁,編輯于2023年,星期五完成Pro*C源程序到純C源程序的轉(zhuǎn)換基本命令格式PROCINAME=filename[OptionName1=value1]…[OptionNameN=valueN]Pro*C預(yù)編譯程序第十頁,共七十四頁,編輯于2023年,星期五PROC常用預(yù)編譯選項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第十一頁,共七十四頁,編輯于2023年,星期五Pro*C程序開發(fā)運行流程Pro*C程序開發(fā)運行流程%via.pc%proca.pc%gcc-oaa.c-lclntsh--ComparePro*Candit’sCcode第十二頁,共七十四頁,編輯于2023年,星期五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;}第十三頁,共七十四頁,編輯于2023年,星期五宿主變量宿主變量是一種pro*c語言變量,用于在應(yīng)用程序中和oracle數(shù)據(jù)庫之間傳遞數(shù)據(jù)。Pro*C程序中,既可在SQL語句中引用,也可在C語句中引用的變量稱為SQL變量。C語言語句群SQL語言語句群宿主變量第十四頁,共七十四頁,編輯于2023年,星期五宿主變量的數(shù)據(jù)類型數(shù)據(jù)類型 描述char 單字符char[n] N個定長字符數(shù)組int 整數(shù)short 短整數(shù)long 長整數(shù)float 單精度浮點數(shù)double 雙精度浮點數(shù)VARCHAR[n] 變長字符串第十五頁,共七十四頁,編輯于2023年,星期五宿主變量的使用輸入---將應(yīng)用程序的數(shù)據(jù)傳遞到數(shù)據(jù)庫中。
intsalary,emp_number;cin>>salary;cin>>emp_number; EXECSQLupdateempsetsal=:salarywhereempno=:emp_number;輸出---將數(shù)據(jù)庫的數(shù)據(jù)傳遞到應(yīng)用程序中。
floatv_salary; charv_job;EXECSQLselectsal,jobINTO:v_salary,:v_jobfromempwhereempno=7788; cout<<v_salary<<v_job;第十六頁,共七十四頁,編輯于2023年,星期五處理字符數(shù)據(jù)
預(yù)編譯選項CHAR_MAP CHAR_MAP=CHARZ(默認(rèn)設(shè)置):'\0'結(jié)尾,定長,空格補齊。 CHAR_MAP=CHARF|VARCHAR2:定長,空格補齊。 CHAR_MAP=STRING: '\0'結(jié)尾,變長。當(dāng)'\0'結(jié)尾,宿主變量長度要大于實際數(shù)據(jù)長度。VARCHAR 1.變長,不是'\0'結(jié)尾。 2.Struct{ unsignedshortlen; unsignedchararr[] }variable_name;第十七頁,共七十四頁,編輯于2023年,星期五使用宿主變量的注意事項其申明語法與普通C變量一致,但在CODE=CPP或MODE=ANSI
時變量必須放在申明區(qū).可使用pointer作為宿主變量,使用前分配空間。
在DDL語句中不能用宿主變量。錯誤例子:
chartable_name[30]; cin>>table_name; EXECSQLDROPTABLE:table_name;第十八頁,共七十四頁,編輯于2023年,星期五指示變量指示變量(indicatorvariable)短整型變量,用于處理數(shù)據(jù)庫的NULL值,監(jiān)督和管理與其相關(guān)聯(lián)的宿主變量。引用語法:
:host_variableINDICATOR:indicator_variable OR :host_variable:indicator_variable第十九頁,共七十四頁,編輯于2023年,星期五指示變量的作用主要用在輸出,即當(dāng)宿主變量用于接收數(shù)據(jù)庫的返回數(shù)據(jù)時。通過在宿主變量后用指示變量,檢測是否返回了NULL。-1:數(shù)據(jù)庫表列的值為NULL,指示變量相關(guān)聯(lián)的輸出宿主變量值不確定=0:Oracle將數(shù)據(jù)庫表列值原封不動的賦給指示器變量相關(guān)聯(lián)的輸出宿主變量0:Oracle將數(shù)據(jù)庫表列值截斷后賦給指示器變量相關(guān)聯(lián)的輸出宿主變量,指示器變量值為該列值的原始長度第二十頁,共七十四頁,編輯于2023年,星期五指示變量例子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;第二十一頁,共七十四頁,編輯于2023年,星期五數(shù)組變量Pro*C只支持一維數(shù)組Pro*C不支持?jǐn)?shù)組指針Pro*C所支持?jǐn)?shù)組最大維數(shù)是32767,超出此限制將報錯示例 EXECSQLBEGINDECLARESECTION; intA[100]; charB[100]; charC[100][15]; EXECSQLENDDECLARESECTION;第二十二頁,共七十四頁,編輯于2023年,星期五數(shù)組變量在SQL語句中使用數(shù)組變量,只需給出:和變量名稱,不要給下標(biāo)。示例 EXECSQLBEGINDECLARESECTION; intemp_number[100]; charemp_name[100][15]; EXECSQLENDDECLARESECTION;
EXECSQLSELECTnumber,nameINTO:emp_number,:emp_nameFROMemp;第二十三頁,共七十四頁,編輯于2023年,星期五數(shù)組變量錯誤的例子:
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;第二十四頁,共七十四頁,編輯于2023年,星期五通信區(qū)說明(SQLCA)SQLCA是ORACLE提供的兩個通信區(qū)之一。SQLCA實際上是一個結(jié)構(gòu)變量,其目的是為了診斷錯誤和事件處理結(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];};第二十五頁,共七十四頁,編輯于2023年,星期五通信區(qū)說明(SQLCA)sqlcaid[8]用于標(biāo)識一個SQLCAsqlabc用于保存SQLCA的長度sqlcode用于保存最近一次運行SQL指令的狀態(tài)
0 - 正常
>0 - 有一個異常發(fā)生
<0 - 系統(tǒng)錯誤,可能來自網(wǎng)絡(luò),或數(shù)據(jù)庫本身sqlerrm.sqlerrml保存錯誤文本信息的長度sqlerrm.sqlerrmc保存錯誤文本信息,最長為70個字符sqlerrp系統(tǒng)保留sqlerrd[6] 0,1 ,3,5-系統(tǒng)保留
2 -當(dāng)前SQL指令處理的行數(shù)
4 -保存相對位移,指出在什么地方出現(xiàn)語法錯誤第二十六頁,共七十四頁,編輯于2023年,星期五通信區(qū)說明(SQLCA)sqlwarn[8] 0-指示是否設(shè)置了警告標(biāo)志
1-指示是否將字符結(jié)果返回給宿主變量時,數(shù)據(jù)截短了
3-如果查詢時,返回的列數(shù)和指定的宿主數(shù)組變量的維數(shù)不等時設(shè)置該位
4-UPDATE和DELETE時沒有行被處理,設(shè)置改標(biāo)志位
5-當(dāng)EXECSQLCREATE{PROCEDURE|FUNCTION|PACKAGE|PACKAGEBODY}失敗時,設(shè)置該位
2,6,7-系統(tǒng)保留sqlext[8]系統(tǒng)保留第二十七頁,共七十四頁,編輯于2023年,星期五intmain(){ … EXECSQLINCLUDEsqlca; … EXECSQLWHENEVERSQLERRORDoerr_report(sqlca); … }voiderr_report(structsqlcasqlca){ if(sqlca.sqlcode<0) printf("\n%d%s\n\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc); exit(1); }SQLCA應(yīng)用實例第二十八頁,共七十四頁,編輯于2023年,星期五通信區(qū)說明(ORACA)當(dāng)需要更進(jìn)一步的信息時,ORACA將幫助我們達(dá)成愿望,所以O(shè)RACA也可以看作時SQLCA的補充和輔助。第二十九頁,共七十四頁,編輯于2023年,星期五通信區(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*/ };第三十頁,共七十四頁,編輯于2023年,星期五通信區(qū)說明(ORACA)oracaid[8]標(biāo)識一個ORACA通信區(qū)oracabc用于保存ORACA通信區(qū)的長度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-僅對SQLERROR保存SQL文本
2-僅對SQLERROR和SQLWARNING保存SQL文本
3-總是保存SQL文本第三十一頁,共七十四頁,編輯于2023年,星期五通信區(qū)說明(ORACA)要使用ORACA,那么就要顯式的加載ORACA結(jié)構(gòu)到Pro*C程序中??赏ㄟ^語句
EXECSQLINCLUDEoraca; EXECORACLEOPTION(ORACA=YES);
實現(xiàn)。第三十二頁,共七十四頁,編輯于2023年,星期五嵌入SQL語句EXECSQLINSERTdept(1,‘人事部’,‘中鼎大廈7層’);EXECSQLsql-statement;形式:示例:單個SQL語句的嵌入語法第三十三頁,共七十四頁,編輯于2023年,星期五嵌入事務(wù)控制語句事務(wù)控制語句Commit,rollbackandsavepoint.EXECSQLcommit;EXECSQLcommitworkrelease;EXECSQLrollbackworkrelease;第三十四頁,共七十四頁,編輯于2023年,星期五嵌入事務(wù)控制語句…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;…第三十五頁,共七十四頁,編輯于2023年,星期五數(shù)據(jù)操作語句(DML)語句列表EXECSQLSelect…….;EXECSQLInsert…….;EXECSQLupdate…….;EXECSQLDelete…….;嵌入DML語句第三十六頁,共七十四頁,編輯于2023年,星期五數(shù)據(jù)定義語句(DDL):create,alter,dropExample:EXECSQLCREATTABLEt1(colaint);EXECSQLDROPTABLEt1;EXECSQLALTERTABLEt1add(faxnonumber);對象名,列名不能用宿主變量.自動提交事務(wù)嵌入DDL語句第三十七頁,共七十四頁,編輯于2023年,星期五嵌入PL/SQL語句PL/SQL的嵌入語法/********************************/EXECSQLEXECUTEBEGIN /*PL/SQLBLOCK*/END;END-EXEC;/*******************************/形式:第三十八頁,共七十四頁,編輯于2023年,星期五嵌入PL/SQL的語法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-----------------*/第三十九頁,共七十四頁,編輯于2023年,星期五調(diào)用PL/SQL語句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程序:第四十頁,共七十四頁,編輯于2023年,星期五先有連結(jié),后才能訪問數(shù)據(jù)庫.連結(jié)的方法:
連結(jié)本地或遠(yuǎn)程數(shù)據(jù)庫 連結(jié)一個或多個數(shù)據(jù)庫連接數(shù)據(jù)庫第四十一頁,共七十四頁,編輯于2023年,星期五EXECSQLCONNECT{:userIDENTIFIEDBY:pswd|:usr_psw}[[AT{dbname|:host_variable}]USING:connect_string][ALTERAUTHORIZATION:newpswd];Connect語法形式第四十二頁,共七十四頁,編輯于2023年,星期五連接本地數(shù)據(jù)庫本地:客戶應(yīng)用程序與oracleserver在同一臺機器上.方式一:用戶名口令由兩個獨立變量存儲CharuserName[20]=“scott”;CharuserPwd[20]=“tiger”;EXECSQLCONNECT:userNameIDENTIFIEDBY:userPwd;Charuname_pwd[40]=“scott/tiger”;EXECSQLCONNECT:uname_pwd;方式二:用戶名口令由單個變量存儲第四十三頁,共七十四頁,編輯于2023年,星期五連接遠(yuǎn)端數(shù)據(jù)庫遠(yuǎn)端:客戶應(yīng)用程序與oracleserver不在同一臺機器上.charuserPwd[20]=“scott/tiger”;chardbString[20]=“remoteDB”;EXECSQLCONNECT:userPwdUsing:dbString;remoteDB是網(wǎng)絡(luò)服務(wù)名,在$ORACLE_HOME/network/admin/tnsnames.ora文件中定義.連接方式:第四十四頁,共七十四頁,編輯于2023年,星期五使用數(shù)據(jù)庫鏈訪問遠(yuǎn)端數(shù)據(jù)庫Charname[25]=“scottsmith”;/***修改本地數(shù)據(jù)庫區(qū)**/EXECSQLupdateempsetsal=:salarywhereename=:name;/***修改遠(yuǎn)端數(shù)據(jù)庫區(qū)**/EXECSQLupdateemp@myLinksetsal=:salarywhereename=:name;EXECSQLcommitworkrelease;CREATEDATABASELINKmyLinkCONNECTTOtarenaIDENTIFIEDBYtarenaUsing‘tlab1’;用SQLPLUS創(chuàng)建數(shù)據(jù)庫鏈接:第四十五頁,共七十四頁,編輯于2023年,星期五連接多個數(shù)據(jù)庫應(yīng)用程序遠(yuǎn)端數(shù)據(jù)庫ORA1遠(yuǎn)端數(shù)據(jù)庫ORA2遠(yuǎn)端數(shù)據(jù)庫ORA3本地數(shù)據(jù)庫ORA0Net8一個程序同時連接多個數(shù)據(jù)庫或者建立多個連接到同一個數(shù)據(jù)庫第四十六頁,共七十四頁,編輯于2023年,星期五連接多個數(shù)據(jù)庫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ù)庫區(qū)**/EXECSQLAT:db1updateempsetsal=:salarywhereename=:name;/***修改db2數(shù)據(jù)庫區(qū)**/EXECSQLAT:db2updateempsetsal=:salarywhereename=:name;EXECSQLAT:db1commitworkrelease;EXECSQLAT:db2commitworkrelease;第四十七頁,共七十四頁,編輯于2023年,星期五使用數(shù)據(jù)庫鏈訪問遠(yuǎn)端數(shù)據(jù)庫應(yīng)用程序Net8遠(yuǎn)端數(shù)據(jù)庫ORA2遠(yuǎn)端數(shù)據(jù)庫ORA1數(shù)據(jù)庫鏈?zhǔn)窃诒镜財?shù)據(jù)庫和遠(yuǎn)端數(shù)據(jù)庫之間的一種指針.使用它可以在不同數(shù)據(jù)庫的SQL語句和事務(wù)之間建立關(guān)聯(lián)關(guān)系。第四十八頁,共七十四頁,編輯于2023年,星期五SQLCA與錯誤處理為了給用戶和開發(fā)人員提供oracleerrormessage,Oracle建議使用SQL通訊區(qū)(SQLCA).
SQLCAisaCstruct,紀(jì)錄每個當(dāng)前SQL語句的執(zhí)行狀態(tài),以便進(jìn)行錯誤診斷和事件處理。#include<sqlca.h> OR EXECSQLINCLUDESQLCA;
第四十九頁,共七十四頁,編輯于2023年,星期五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];};第五十頁,共七十四頁,編輯于2023年,星期五WHENEVER語句檢測并處理sql語句錯誤。語法: EXECSQLWHENEVER<condition><action> condition:SQLWARNING,SQLERROR,NOTFOUND. action:CONTINUE,DO,GOTO,STOP,BREAKExample: EXECSQLWHENEVERSQLWARNINGCONTINUE; EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLWHENEVERNOTFOUNDDOnotfound();
第五十一頁,共七十四頁,編輯于2023年,星期五WHENEVER語句的管轄范圍自動檢查所有后面的SQLstatements.一般放在BeforefirstSQLstatement.IfusingmorethanoneWHENEVER,只有最近的WHENEVER
起作用。
第五十二頁,共七十四頁,編輯于2023年,星期五一般的錯誤處理方法用WHENEVER檢查sql語句錯誤用SQLCA描述錯誤Rollback所有的操作,release資源.第五十三頁,共七十四頁,編輯于2023年,星期五錯誤處理實例...voidsqlerror();Main(){ EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLCONNECT:usernameIDENTIFIEDBY:password; EXECSQLupdateempsetcomission=200whereemp_no=2;…..}voidsqlerror(){EXECSQLWHENEVERSQLERRORCONTINUE;cout<<"\n----oracleerrordetected:"<<sqlca.sqlerrm.sqlerrmc;EXECSQLROLLBACKWORKRELEASE;exit(1);}第五十四頁,共七十四頁,編輯于2023年,星期五用單個變量操作單行單列用多個變量或結(jié)構(gòu)(struct)操作單行多列用數(shù)組(array)或游標(biāo)(cursor)操作多行多列數(shù)據(jù)的存取更新操作第五十五頁,共七十四頁,編輯于2023年,星期五用單個變量操作單行單列
charename[35]; intempno=20; EXECSQLselectemp_nameINTO:enamefromemp whereemp_no=:empno; cout<<“thenameis“<<ename;注意事項:字符串長度定義指示變量的運用
第五十六頁,共七十四頁,編輯于2023年,星期五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;注意事項:變量順序與字段名一至用多個變量操作單行多列第五十七頁,共七十四頁,編輯于2023年,星期五宿主結(jié)構(gòu)是指包含多個宿主變量的C語言結(jié)構(gòu),以此可簡化單行多列操作。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)操作單行多列第五十八頁,共七十四頁,編輯于2023年,星期五注意事項:可用結(jié)構(gòu)pointer,但要分配空間。結(jié)構(gòu)成員的數(shù)據(jù)類型,順序必須與SQL語句一至。不能用嵌套的結(jié)構(gòu)。不能用C聯(lián)合(UNION)用結(jié)構(gòu)(struct)操作單行多列第五十九頁,共七十四頁,編輯于2023年,星期五目的:降低網(wǎng)絡(luò)開銷,提高程序性能。數(shù)組和INSERT語句:intnum[100];floatsalary[100];charname[100][25];/**在此為ARRAY賦值**/EXECSQLINSERTINTOemp(empno,ename,sal)VALUES(:num,:name,:salary);用數(shù)組(array)操作多行多列第六十頁,共七十四頁,編輯于2023年,星期五用數(shù)組(array)操作多行多列數(shù)組和UPDATE/DELETE語句Charname[100];floatsalary[100];……../**在此為ARRAY賦值**/EXECSQLUPDATEEMPSETsal=:salaryWHEREename=:name;Charname[100];……../**在此為ARRAY賦值**/EXECSQLDELETEFROMempWHEREename=:name;第六十一頁,共七十四頁,編輯于2023年,星期五用數(shù)組(array)操作多行多列數(shù)組和SELECT語句Charname[100][25];EXECSQLSELECTenameINTO:nameFROMemp WHEREdept_num=2;For(intj=0;j<sqlca.sqlerrd[2];j++) cout<<“Emp_name”<<name[j]<<endl;第六十二頁,共七十四頁,編輯于2023年,星期五用數(shù)組(array)操作多行多列注意事項:只有CHAR和VARCHAR可為二維數(shù)組。如數(shù)組INDEX不同,按最小操作。在SELECT語句的WHERE子句中,不能用數(shù)組。數(shù)組元素最大值:32767第六十三頁,共七十四頁,編輯于2023年,星期五使用非滾動游標(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;第六十四頁,共七十四頁,編輯于2023年,星期五使用非滾動游標(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<<“先生,請加油“;
}EXECSQLCLOSEemp_cursor;…第六十五頁,共七十四頁,編輯于2023年,星期五使用滾動游標(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;第六十六頁,共七十四頁,編輯于2023年,星期五動態(tài)SQL動態(tài)SQL是指在運行pro*c/c++應(yīng)用程序時,動態(tài)輸入的SQL語句。目的:加強應(yīng)用程序的功能和靈活性。比較靜態(tài)SQL和動態(tài)SQL: 靜態(tài)SQL----在編寫應(yīng)用程序時,使用EXECSQL關(guān)鍵字直接嵌入的SQL語句; 動態(tài)SQL----在運行應(yīng)用程序時,由用戶動態(tài)輸入的SQL語句。什么時候使用動態(tài)SQL語句SQL語句的文本(命令,子句等)不確定宿主變量個數(shù)不確定宿主變量的數(shù)據(jù)類型不確定引用的數(shù)據(jù)庫對象(列,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 清明假期安全生產(chǎn)注意事項
- 2025至2030購物中心建設(shè)行業(yè)發(fā)展分析及有效策略與實施路徑評估報告
- 2025至2030中國汽車排放測試設(shè)備行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國水電裝置行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國止痛貼行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國棕櫚類植物行業(yè)競爭格局及未來前景研究報告
- 2025至2030中國有色金屬鑄件行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 2025至2030中國智能電話機行業(yè)市場占有率及投資前景評估規(guī)劃報告
- 2025至2030中國智慧校園行業(yè)市場發(fā)展現(xiàn)狀及競爭策略與投資前景報告
- 愛國健康領(lǐng)域活動方案
- 【互聯(lián)網(wǎng)消費金融風(fēng)險管控探究:以螞蟻花唄ABS為例(論文)11000字】
- 安全操作規(guī)程匯編(服裝廠)
- 國企集團公司各崗位廉潔風(fēng)險點防控表格(廉政)范本
- 人事專員合同范本
- 山東省德州市禹城市2023-2024學(xué)年五年級下學(xué)期道德與法治期末檢測試題
- 2024年湖北普通高中學(xué)業(yè)水平選擇性考試地理真題解析(參考版)(解析版)
- 2023年湖北省高級人民法院及直屬法院招聘雇員制審判輔助人員考試真題
- 神經(jīng)內(nèi)科??谱o(hù)士進(jìn)修匯報
- 危險化學(xué)品應(yīng)急處置卡
- 金屬材料生物相容性研究
- 幕墻工程施工的重點難點分析及針對措施
評論
0/150
提交評論