資源描述:
《sql語句使用綁定變量方法》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Oracle對SQL的處理過程1、語法檢查(syntaxcheck),檢查此SQL的拼寫是否符合語法。2、語義檢查(semanticcheck),諸如檢查SQL語句中的訪問對象是否存在及該用戶是否具備相應的權(quán)限。3、對SQL語句進行解析(prase),利用內(nèi)部算法對SQL進行解析,生成解析樹(parsetree)及執(zhí)行計劃(executionplan)。4、執(zhí)行SQL,返回結(jié)果(executeandreturn)。1415926535zr軟、硬解析Oracle利用內(nèi)部的hash算法來取得該sql的hash值,然后在librarycache里查找是否存在該has
2、h值;假設(shè)存在,則將此sql與cache中的進行比較;假設(shè)“相同”,就將利用已有的解析樹與執(zhí)行計劃,而省略了優(yōu)化器的相關(guān)工作。這也就是軟解析的過程。誠然,如果上面的2個假設(shè)中任有一個不成立,那么優(yōu)化器都將進行創(chuàng)建解析樹、生成執(zhí)行計劃的動作。這個過程就叫硬解析。創(chuàng)建解析樹、生成執(zhí)行計劃對于SQL的執(zhí)行來說是開銷昂貴的動作,所以,應當極力避免硬解析,盡量使用軟解析。SQL執(zhí)行計劃一個SQL語句表示你所想要得到的但是并沒有告訴Server如何去做。例如,利用一個SQL語句,你可能要Server取出所有住在Prague的客戶。當Server收到的這條SQL的時候,第一
3、件事情并不是解析它。如果這條SQL沒有語法錯誤,Server才會繼續(xù)工作。Server會決定最好的計算方式。Server會選擇,是讀整個客戶表好呢,還是利用索引會比較快些。Server會比較所有可能方法所耗費的資源。最終SQL語句被物理性執(zhí)行的方法被稱做執(zhí)行計劃或者是查詢計劃。一個執(zhí)行計劃有若干基本操作組成。例如,遍歷整張表,利用索引,執(zhí)行一個嵌套循環(huán)或Hash連接等等。負責處理或計算最優(yōu)的執(zhí)行計劃的DBServer組件叫優(yōu)化器。優(yōu)化器是建立在其所在的DB資源的基礎(chǔ)上而進行工作的。綁定變量查詢通常只是因為改變where子句中的內(nèi)容而產(chǎn)生不同的結(jié)果。為了在這種情
4、況下避免硬解析,需要使用綁定變量(bindvariable)。它是用戶放入查詢中的占位符,它會告訴Oracle隨后為這個變量提供一個值,現(xiàn)在需要生成一個方案,但我實際執(zhí)行語句的時候,我會提供應該使用的實際值。WEB頁面執(zhí)行SQL語句使用綁定變量:<%StringsqlStr="selectto_char(CONTRACT_NO)CONTRACTNO,to_char(id_no)idNo,user_passwdfromdcustmsgwherephone_no=:phoneandcust_id=:custidandsubstr(run_code,2,1)<'a'
5、";Stringparam2="phone="+phoneNo+",custid="+custID;%>"outnum="3">"/>"/>逗號分隔變量,number型的要to_char服務中SQL語句使用綁定變量:
6、1直接執(zhí)行的SQL語句中的綁定變量:EXECSQLSELECTProduct_Code,Trim(Product_Name),Srv_CodeINTO:vProduct_Code,:vProduct_Name,:vSrv_CodeFROMsGPRSSrvCodeWHEREProduct_Code=:vCur_ProdCodeANDSUBSTR(Srv_Code,1,4)=:vSrv_Code;2動態(tài)語句中使用綁定變量:sprintf(vSql_Text,"SELECTbegin_timeFROMdSrvMsg%sWHEREid_no=:vId_NoANDpro
7、duct_code=:vProduct_Code",tail_id);EXECSQLEXECUTEBEGINEXECUTEIMMEDIATE:vSql_TextINTO:vBeginTimeusing:vId_No,:vProduct_Code;END;3游標中使用綁定變量:sprintf(vSql_Text,"SELECTservice_codeFROMssrvinfoWHEREproduct_code=:vProduct_Code");EXECSQLPREPAREpre_getsrv2from:vSql_Text;EXECSQLDECLAREcur_g
8、etsrv2CURSORforpre_