




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實際開發中的教程第一頁,共七十四頁,2022年,8月28日Points3.宿主變量與指示變量4.嵌入SQL語句5.連接數據庫6.錯誤處理1.PROC簡介7.數據的存取更新操作8.動態sql2.PROC程序的編寫步驟第二頁,共七十四頁,2022年,8月28日Pro程序通過在過程化編程語言中嵌入SQL語句而開發出的應用程序稱為Pro程序。在通用編程語言中使用的SQL稱為嵌入式SQL在SQL標準中定義了多種語言的嵌入式SQL各個廠商對嵌入式SQL的具體實現不同宿主語言 Pro程序C/C++ Pro*C/C++FORTRANPro*FORTRANPASCALPro*PASCALCOBOLPro*COBOLPL/I Pro*PL/IAda Pro*Ada第三頁,共七十四頁,2022年,8月28日Pro*C/C++程序在C/C++語言中嵌入SQL語句而開發出的應用程序稱為Pro*C/C++程序。目的:使c/c++這種高效率語言成為訪問數據庫的工具。第四頁,共七十四頁,2022年,8月28日Pro*C程序實例#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);}第五頁,共七十四頁,2022年,8月28日Include頭文件(c/c++andpro*c/c++)定義變量定義函數main
連結數據庫:connect
SQL操作語句:EXECSQL…….; exceptionhandler 斷開連結:EXECSQLCOMMIT/ROLLBACKWORKreleasePROC程序結構第六頁,共七十四頁,2022年,8月28日一般應用程序(C)開發運行標準流程CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.c文件.o文件可執行文件第七頁,共七十四頁,2022年,8月28日%via_1.ca_2.c%gcc–ca_1.ca_2.c%gcc-oaa_1.oa_2.o一般應用程序(C)開發運行標準流程第八頁,共七十四頁,2022年,8月28日Pro*C程序開發運行流程.o文件可執行文件CodeCompileLinkExecuteSourceProgramObjectProgramExecutableProgram.pc文件PrecompileModifiedSourceProgram.c文件第九頁,共七十四頁,2022年,8月28日完成Pro*C源程序到純C源程序的轉換基本命令格式PROCINAME=filename[OptionName1=value1]…[OptionNameN=valueN]Pro*C預編譯程序第十頁,共七十四頁,2022年,8月28日PROC常用預編譯選項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第十一頁,共七十四頁,2022年,8月28日Pro*C程序開發運行流程Pro*C程序開發運行流程%via.pc%proca.pc%gcc-oaa.c-lclntsh--ComparePro*Candit’sCcode第十二頁,共七十四頁,2022年,8月28日Pro*C++預編譯程序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;}第十三頁,共七十四頁,2022年,8月28日宿主變量宿主變量是一種pro*c語言變量,用于在應用程序中和oracle數據庫之間傳遞數據。Pro*C程序中,既可在SQL語句中引用,也可在C語句中引用的變量稱為SQL變量。C語言語句群SQL語言語句群宿主變量第十四頁,共七十四頁,2022年,8月28日宿主變量的數據類型數據類型 描述char 單字符char[n] N個定長字符數組int 整數short 短整數long 長整數float 單精度浮點數double 雙精度浮點數VARCHAR[n] 變長字符串第十五頁,共七十四頁,2022年,8月28日宿主變量的使用輸入---將應用程序的數據傳遞到數據庫中。
intsalary,emp_number;cin>>salary;cin>>emp_number; EXECSQLupdateempsetsal=:salarywhereempno=:emp_number;輸出---將數據庫的數據傳遞到應用程序中。
floatv_salary; charv_job;EXECSQLselectsal,jobINTO:v_salary,:v_jobfromempwhereempno=7788; cout<<v_salary<<v_job;第十六頁,共七十四頁,2022年,8月28日處理字符數據
預編譯選項CHAR_MAP CHAR_MAP=CHARZ(默認設置):'\0'結尾,定長,空格補齊。 CHAR_MAP=CHARF|VARCHAR2:定長,空格補齊。 CHAR_MAP=STRING: '\0'結尾,變長。當'\0'結尾,宿主變量長度要大于實際數據長度。VARCHAR 1.變長,不是'\0'結尾。 2.Struct{ unsignedshortlen; unsignedchararr[] }variable_name;第十七頁,共七十四頁,2022年,8月28日使用宿主變量的注意事項其申明語法與普通C變量一致,但在CODE=CPP或MODE=ANSI
時變量必須放在申明區.可使用pointer作為宿主變量,使用前分配空間。
在DDL語句中不能用宿主變量。錯誤例子:
chartable_name[30]; cin>>table_name; EXECSQLDROPTABLE:table_name;第十八頁,共七十四頁,2022年,8月28日指示變量指示變量(indicatorvariable)短整型變量,用于處理數據庫的NULL值,監督和管理與其相關聯的宿主變量。引用語法:
:host_variableINDICATOR:indicator_variable OR :host_variable:indicator_variable第十九頁,共七十四頁,2022年,8月28日指示變量的作用主要用在輸出,即當宿主變量用于接收數據庫的返回數據時。通過在宿主變量后用指示變量,檢測是否返回了NULL。-1:數據庫表列的值為NULL,指示變量相關聯的輸出宿主變量值不確定=0:Oracle將數據庫表列值原封不動的賦給指示器變量相關聯的輸出宿主變量0:Oracle將數據庫表列值截斷后賦給指示器變量相關聯的輸出宿主變量,指示器變量值為該列值的原始長度第二十頁,共七十四頁,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;第二十一頁,共七十四頁,2022年,8月28日數組變量Pro*C只支持一維數組Pro*C不支持數組指針Pro*C所支持數組最大維數是32767,超出此限制將報錯示例 EXECSQLBEGINDECLARESECTION; intA[100]; charB[100]; charC[100][15]; EXECSQLENDDECLARESECTION;第二十二頁,共七十四頁,2022年,8月28日數組變量在SQL語句中使用數組變量,只需給出:和變量名稱,不要給下標。示例 EXECSQLBEGINDECLARESECTION; intemp_number[100]; charemp_name[100][15]; EXECSQLENDDECLARESECTION;
EXECSQLSELECTnumber,nameINTO:emp_number,:emp_nameFROMemp;第二十三頁,共七十四頁,2022年,8月28日數組變量錯誤的例子:
for(inti=0;i<100;i++){ EXECSQLSELECTnumber,nameINTO:emp_number[i],:emp_name[i];}指示器數組例子:
EXECSQLBEGINDECLARESECTION; intemp_number[100]; charemp_name[100][15]; shortind_emp_number[100]; EXECSQLENDDECLARESECTION; … EXECSQLSELECTnumber,nameINTO:emp_number:ind_emp_number,:emp_name;第二十四頁,共七十四頁,2022年,8月28日通信區說明(SQLCA)SQLCA是ORACLE提供的兩個通信區之一。SQLCA實際上是一個結構變量,其目的是為了診斷錯誤和事件處理結果。SQLCA的結構 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];};第二十五頁,共七十四頁,2022年,8月28日通信區說明(SQLCA)sqlcaid[8]用于標識一個SQLCAsqlabc用于保存SQLCA的長度sqlcode用于保存最近一次運行SQL指令的狀態
0 - 正常
>0 - 有一個異常發生
<0 - 系統錯誤,可能來自網絡,或數據庫本身sqlerrm.sqlerrml保存錯誤文本信息的長度sqlerrm.sqlerrmc保存錯誤文本信息,最長為70個字符sqlerrp系統保留sqlerrd[6] 0,1 ,3,5-系統保留
2 -當前SQL指令處理的行數
4 -保存相對位移,指出在什么地方出現語法錯誤第二十六頁,共七十四頁,2022年,8月28日通信區說明(SQLCA)sqlwarn[8] 0-指示是否設置了警告標志
1-指示是否將字符結果返回給宿主變量時,數據截短了
3-如果查詢時,返回的列數和指定的宿主數組變量的維數不等時設置該位
4-UPDATE和DELETE時沒有行被處理,設置改標志位
5-當EXECSQLCREATE{PROCEDURE|FUNCTION|PACKAGE|PACKAGEBODY}失敗時,設置該位
2,6,7-系統保留sqlext[8]系統保留第二十七頁,共七十四頁,2022年,8月28日intmain(){ … EXECSQLINCLUDEsqlca; … EXECSQLWHENEVERSQLERRORDoerr_report(sqlca); … }voiderr_report(structsqlcasqlca){ if(sqlca.sqlcode<0) ,sqlca.sqlerrm.sqlerrmc); exit(1); }SQLCA應用實例第二十八頁,共七十四頁,2022年,8月28日通信區說明(ORACA)當需要更進一步的信息時,ORACA將幫助我們達成愿望,所以ORACA也可以看作時SQLCA的補充和輔助。第二十九頁,共七十四頁,2022年,8月28日通信區說明(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*/ };第三十頁,共七十四頁,2022年,8月28日通信區說明(ORACA)oracaid[8]標識一個ORACA通信區oracabc用于保存ORACA通信區的長度oradbgf調試標志,0-關閉,1-開啟oracchf如果oradbgf=1,那oracchf遵循下列規則:
0-禁止光標緩沖一致性檢查
1-進行光標緩沖一致性檢查orahchf如果oradbgf=1,那oracchf遵循下列規則:
0-禁止堆緩沖一致性檢查
1-進行堆緩沖一致性檢查orastxtf可以是以下各值:
0-不保存SQL文本
1-僅對SQLERROR保存SQL文本
2-僅對SQLERROR和SQLWARNING保存SQL文本
3-總是保存SQL文本第三十一頁,共七十四頁,2022年,8月28日通信區說明(ORACA)要使用ORACA,那么就要顯式的加載ORACA結構到Pro*C程序中。可通過語句
EXECSQLINCLUDEoraca; EXECORACLEOPTION(ORACA=YES);
實現。第三十二頁,共七十四頁,2022年,8月28日嵌入SQL語句EXECSQLINSERTdept(1,‘人事部’,‘中鼎大廈7層’);EXECSQLsql-statement;形式:示例:單個SQL語句的嵌入語法第三十三頁,共七十四頁,2022年,8月28日嵌入事務控制語句事務控制語句Commit,rollbackandsavepoint.EXECSQLcommit;EXECSQLcommitworkrelease;EXECSQLrollbackworkrelease;第三十四頁,共七十四頁,2022年,8月28日嵌入事務控制語句…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;…第三十五頁,共七十四頁,2022年,8月28日數據操作語句(DML)語句列表EXECSQLSelect…….;EXECSQLInsert…….;EXECSQLupdate…….;EXECSQLDelete…….;嵌入DML語句第三十六頁,共七十四頁,2022年,8月28日數據定義語句(DDL):create,alter,dropExample:EXECSQLCREATTABLEt1(colaint);EXECSQLDROPTABLEt1;EXECSQLALTERTABLEt1add(faxnonumber);對象名,列名不能用宿主變量.自動提交事務嵌入DDL語句第三十七頁,共七十四頁,2022年,8月28日嵌入PL/SQL語句PL/SQL的嵌入語法/********************************/EXECSQLEXECUTEBEGIN /*PL/SQLBLOCK*/END;END-EXEC;/*******************************/形式:第三十八頁,共七十四頁,2022年,8月28日嵌入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-----------------*/第三十九頁,共七十四頁,2022年,8月28日調用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程序:第四十頁,共七十四頁,2022年,8月28日先有連結,后才能訪問數據庫.連結的方法:
連結本地或遠程數據庫 連結一個或多個數據庫連接數據庫第四十一頁,共七十四頁,2022年,8月28日EXECSQLCONNECT{:userIDENTIFIEDBY:pswd|:usr_psw}[[AT{dbname|:host_variable}]USING:connect_string][ALTERAUTHORIZATION:newpswd];Connect語法形式第四十二頁,共七十四頁,2022年,8月28日連接本地數據庫本地:客戶應用程序與oracleserver在同一臺機器上.方式一:用戶名口令由兩個獨立變量存儲CharuserName[20]=“scott”;CharuserPwd[20]=“tiger”;EXECSQLCONNECT:userNameIDENTIFIEDBY:userPwd;Charuname_pwd[40]=“scott/tiger”;EXECSQLCONNECT:uname_pwd;方式二:用戶名口令由單個變量存儲第四十三頁,共七十四頁,2022年,8月28日連接遠端數據庫遠端:客戶應用程序與oracleserver不在同一臺機器上.charuserPwd[20]=“scott/tiger”;chardbString[20]=“remoteDB”;EXECSQLCONNECT:userPwdUsing:dbString;remoteDB是網絡服務名,在$ORACLE_HOME/network/admin/tnsnames.ora文件中定義.連接方式:第四十四頁,共七十四頁,2022年,8月28日使用數據庫鏈訪問遠端數據庫Charname[25]=“scottsmith”;/***修改本地數據庫區**/EXECSQLupdateempsetsal=:salarywhereename=:name;/***修改遠端數據庫區**/EXECSQLupdateemp@myLinksetsal=:salarywhereename=:name;EXECSQLcommitworkrelease;CREATEDATABASELINKmyLinkCONNECTTOtarenaIDENTIFIEDBYtarenaUsing‘tlab1’;用SQLPLUS創建數據庫鏈接:第四十五頁,共七十四頁,2022年,8月28日連接多個數據庫應用程序遠端數據庫ORA1遠端數據庫ORA2遠端數據庫ORA3本地數據庫ORA0Net8一個程序同時連接多個數據庫或者建立多個連接到同一個數據庫第四十六頁,共七十四頁,2022年,8月28日連接多個數據庫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數據庫區**/EXECSQLAT:db1updateempsetsal=:salarywhereename=:name;/***修改db2數據庫區**/EXECSQLAT:db2updateempsetsal=:salarywhereename=:name;EXECSQLAT:db1commitworkrelease;EXECSQLAT:db2commitworkrelease;第四十七頁,共七十四頁,2022年,8月28日使用數據庫鏈訪問遠端數據庫應用程序Net8遠端數據庫ORA2遠端數據庫ORA1數據庫鏈是在本地數據庫和遠端數據庫之間的一種指針.使用它可以在不同數據庫的SQL語句和事務之間建立關聯關系。第四十八頁,共七十四頁,2022年,8月28日SQLCA與錯誤處理為了給用戶和開發人員提供oracleerrormessage,Oracle建議使用SQL通訊區(SQLCA).
SQLCAisaCstruct,紀錄每個當前SQL語句的執行狀態,以便進行錯誤診斷和事件處理。#include<sqlca.h> OR EXECSQLINCLUDESQLCA;
第四十九頁,共七十四頁,2022年,8月28日SQLCA通訊區SQLCA的信息結構structsqlca{charsqlcaid[8];longsqlcabc;longsqlcode;struct{ unsignedshortsqlerrml; char sqlerrmc[70];}sqlerrm;charsqlerrp[8];longsqlerrd[6];charsqlwarn[8];charsqlext[8];};第五十頁,共七十四頁,2022年,8月28日WHENEVER語句檢測并處理sql語句錯誤。語法: EXECSQLWHENEVER<condition><action> condition:SQLWARNING,SQLERROR,NOTFOUND. action:CONTINUE,DO,GOTO,STOP,BREAKExample: EXECSQLWHENEVERSQLWARNINGCONTINUE; EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLWHENEVERNOTFOUNDDOnotfound();
第五十一頁,共七十四頁,2022年,8月28日WHENEVER語句的管轄范圍自動檢查所有后面的SQLstatements.一般放在BeforefirstSQLstatement.IfusingmorethanoneWHENEVER,只有最近的WHENEVER
起作用。
第五十二頁,共七十四頁,2022年,8月28日一般的錯誤處理方法用WHENEVER檢查sql語句錯誤用SQLCA描述錯誤Rollback所有的操作,release資源.第五十三頁,共七十四頁,2022年,8月28日錯誤處理實例...voidsqlerror();Main(){ EXECSQLWHENEVERSQLERRORDOsqlerror(); EXECSQLCONNECT:usernameIDENTIFIEDBY:password; EXECSQLupdateempsetcomission=200whereemp_no=2;…..}voidsqlerror(){EXECSQLWHENEVERSQLERRORCONTINUE;cout<<"\n----oracleerrordetected:"<<sqlca.sqlerrm.sqlerrmc;EXECSQLROLLBACKWORKRELEASE;exit(1);}第五十四頁,共七十四頁,2022年,8月28日用單個變量操作單行單列用多個變量或結構(struct)操作單行多列用數組(array)或游標(cursor)操作多行多列數據的存取更新操作第五十五頁,共七十四頁,2022年,8月28日用單個變量操作單行單列
charename[35]; intempno=20; EXECSQLselectemp_nameINTO:enamefromemp whereemp_no=:empno; cout<<“thenameis“<<ename;注意事項:字符串長度定義指示變量的運用
第五十六頁,共七十四頁,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;注意事項:變量順序與字段名一至用多個變量操作單行多列第五十七頁,共七十四頁,2022年,8月28日宿主結構是指包含多個宿主變量的C語言結構,以此可簡化單行多列操作。Struct{ int no; char name[10]; int salary; }emp_record;輸入:EXECSQLINSERTINTOemp(empno,ename,sal) VALUES(:emp_record);輸出:EXECSQLSELECTempno,ename,salINTO:emp_record WHERErownum=1;用結構(struct)操作單行多列第五十八頁,共七十四頁,2022年,8月28日注意事項:可用結構pointer,但要分配空間。結構成員的數據類型,順序必須與SQL語句一至。不能用嵌套的結構。不能用C聯合(UNION)用結構(struct)操作單行多列第五十九頁,共七十四頁,2022年,8月28日目的:降低網絡開銷,提高程序性能。數組和INSERT語句:intnum[100];floatsalary[100];charname[100][25];/**在此為ARRAY賦值**/EXECSQLINSERTINTOemp(empno,ename,sal)VALUES(:num,:name,:salary);用數組(array)操作多行多列第六十頁,共七十四頁,2022年,8月28日用數組(array)操作多行多列數組和UPDATE/DELETE語句Charname[100];floatsalary[100];……../**在此為ARRAY賦值**/EXECSQLUPDATEEMPSETsal=:salaryWHEREename=:name;Charname[100];……../**在此為ARRAY賦值**/EXECSQLDELETEFROMempWHEREename=:name;第六十一頁,共七十四頁,2022年,8月28日用數組(array)操作多行多列數組和SELECT語句Charname[100][25];EXECSQLSELECTenameINTO:nameFROMemp WHEREdept_num=2;For(intj=0;j<sqlca.sqlerrd[2];j++) cout<<“Emp_name”<<name[j]<<endl;第六十二頁,共七十四頁,2022年,8月28日用數組(array)操作多行多列注意事項:只有CHAR和VARCHAR可為二維數組。如數組INDEX不同,按最小操作。在SELECT語句的WHERE子句中,不能用數組。數組元素最大值:32767第六十三頁,共七十四頁,2022年,8月28日使用非滾動游標1。定義游標
EXECSQLDECLAREemp_cursorCURSORFOR selectempno,ename,salfromempwheredeptno=10;2.打開游標
EXECSQLOPENemp_cursor;(Opencursor:puttheselectresultsintoamemoryplace,andthecursorpointerpointstothefirstrowdata.)3.提取游標
EXECSQLFETCHemp_cursorINTO:empnum,:name:salary; /**在此處理數據處理**/ (Afterfetch,cursorpointermovesdownoneline.Useloopformultiplerows)4.EXECSQLCLOSEemp_cursor;第六十四頁,共七十四頁,2022年,8月28日使用非滾動游標范例…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;…第六十五頁,共七十四頁,2022年,8月28日使用滾動游標1.定義游標EXECSQLDECLAREemp_cursorSCROLLCURSORFORselectempno,ename,salfromempwheredeptno=10;2.打開游標EXECSQLOPENemp_cursor;3.提取游標EXECSQLFETCHFIRSTemp_cursorINTO:empnum,:name:salary;
options:PRIOR(當前行的前一行),NEXT(當前行的下一行),CURRENT(當前行),RELATIVEn(n為付/正,當前行的前/后n行),ABSOLUTEn(游標中的第n行),LAST。4.EXECSQLCLOSEemp_cursor;第六十六頁,共七十四頁,2022年,8月28日動態SQL動態SQL是指在運行pro*c/c++應用程序時,動態輸入的SQL語句。目的:加強應用程序的功能和靈活性。比較靜態SQL和動態SQL: 靜態SQL----在編寫應用程序時,使用EXECSQL關鍵字直接嵌入的SQL語句; 動態SQL----在運行應用程序時,由用戶動態輸入的SQL語句。什么時候使用動態SQL語句SQL語句的文本(命令,子句等)不確定宿主變量個數不確定宿主變量的數據類型不確定引用的數據庫對象(列,表等)不確
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省濟南市天橋區濼口實驗學校2024-2025年第二學期期中考試八年級地理試題(含答案)
- 沙漠地區土地治理承包合同
- 物業臨聘人員勞動合同
- Unit1 starting out 教案2024-2025學年外研版(2024)七年級英語下冊
- 小學科學鄂教版五年級上冊9蛙教學設計及反思
- 幼兒表演性舞蹈創編實例
- 電工清包承包合同書
- 人教版小學二年級上冊數學 第3單元 角的初步認識 教案
- 紙漿采購合同范本
- 股權投資合作協議書
- T-ZMDS 10019-2024 經顱電刺激儀基本技術規范
- 人教版六年級下冊科學全冊教案
- 2024福建中閩能源股份有限公司招聘12人筆試參考題庫附帶答案詳解
- 2025年江西省旅游集團股份有限公司招聘筆試參考題庫含答案解析
- 《外科補液原則》課件
- 《墨家思想》課件
- 浙江省2025年1月首考高考英語試卷試題真題(含答案)
- 川教版(2024)小學信息技術三年級上冊《跨學科主題活動-在線健康小達人》教學實錄
- 機械專業英語
- 高空作業車(剪叉式、曲臂式)驗收表
- 廣東省廣州市2024屆高三下學期一模考試 政治 含解析
評論
0/150
提交評論