




已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 1 Pro C程序設(shè)計(jì) TigerConsultationStudio 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 2 目錄 Pro C概述Pro C基礎(chǔ)知識(shí)事務(wù)處理動(dòng)態(tài)SQL技術(shù)總結(jié) 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 3 動(dòng)態(tài)SQL技術(shù) 動(dòng)態(tài)SQL編程是Pro C C 中一種比較高級(jí)的編程方法 它增強(qiáng)了應(yīng)用程序的靈活性和可擴(kuò)展性 運(yùn)行應(yīng)用程序在運(yùn)行狀態(tài)時(shí)動(dòng)態(tài)組織SQL語(yǔ)句并執(zhí)行和處理執(zhí)行結(jié)果 Oracle支持如下兩種動(dòng)態(tài)SQL語(yǔ)句標(biāo)準(zhǔn)動(dòng)態(tài)SQL語(yǔ)句Oracle高級(jí)動(dòng)態(tài)SQL語(yǔ)句Oracle動(dòng)態(tài)SQL不支持以下列表的數(shù)據(jù)類型 CURSOR類型結(jié)構(gòu)數(shù)組 arraysofstruct DML語(yǔ)句的返回子句 returning Unicode變量LOBS類型 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 4 動(dòng)態(tài)SQL含義 動(dòng)態(tài)SQL就是在應(yīng)用程序執(zhí)行期間組織 準(zhǔn)備 執(zhí)行SQL語(yǔ)句的方法和技術(shù) 在一些應(yīng)用程序中需要根據(jù)業(yè)務(wù)邏輯特點(diǎn)接收應(yīng)用程序外部傳輸過(guò)來(lái)的變量 在運(yùn)行時(shí)決定執(zhí)行什么結(jié)構(gòu)的SQL語(yǔ)句 例如 根據(jù)用戶輸入的表名 刪除該表對(duì)應(yīng)的數(shù)據(jù) 由于SQL變量在靜態(tài)SQL語(yǔ)句時(shí)不能應(yīng)用到DELETE表名位置的 所以沒(méi)有辦法在執(zhí)行過(guò)程中通過(guò)靜態(tài)SQL語(yǔ)句完成這樣的功能 而動(dòng)態(tài)SQL語(yǔ)句則可以接受用戶輸入 動(dòng)態(tài)的組織SQL語(yǔ)句 完成上述要求 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 5 動(dòng)態(tài)SQL的優(yōu)缺點(diǎn) 優(yōu)點(diǎn) 增強(qiáng)應(yīng)用程序靈活性增強(qiáng)應(yīng)用程序擴(kuò)展性完成靜態(tài)SQL所不能完成的工作缺點(diǎn) 編碼相對(duì)復(fù)雜執(zhí)行效率沒(méi)有靜態(tài)SQL好 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 6 動(dòng)態(tài)SQL適用環(huán)境 在應(yīng)用程序執(zhí)行時(shí) 如果以下元素在編寫(xiě)代碼時(shí)不確定就需要使用動(dòng)態(tài)SQL SQL語(yǔ)句書(shū)寫(xiě)方式SQL變量 宿主變量數(shù)目SQL變量 宿主變量數(shù)據(jù)類型未知Oracle數(shù)據(jù)庫(kù)Objects 表 視圖 索引 列等 屬性 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 7 動(dòng)態(tài)SQL執(zhí)行條件 1 無(wú)論如何執(zhí)行動(dòng)態(tài)SQL語(yǔ)句 都需要一個(gè)包含有效的SQL語(yǔ)句 不包括EXECSQL語(yǔ)句 或下面嵌入式SQL指令的字符串 ALLOCATECLOSEDECLAREDESCRIBEEXECUTEFETCHFREEGETINCLUDEOPENPREPARESETWHENEVER 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 8 動(dòng)態(tài)SQL執(zhí)行條件 2 嵌入式SQL指令的字符串中 通常包含假的宿主變量這些假的宿主變量只為告訴預(yù)處理器在該位置需要進(jìn)行變量替換這些假宿主變量不需要聲明 可以采用任意命名方式如下兩個(gè)語(yǔ)句對(duì)動(dòng)態(tài)SQL來(lái)說(shuō)是完全一樣的 盡管有 mgr number job title 和 m j 在樣式上的區(qū)別 這些假宿主變量通常稱為占位符號(hào) DELETEFROMEMPWHEREMGR mgr numberANDJOB job title DELETEFROMEMPWHEREMGR mANDJOB j 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 9 動(dòng)態(tài)語(yǔ)句執(zhí)行過(guò)程 通常一個(gè)應(yīng)用程序提示用戶輸入SQL語(yǔ)句組成要素到宿主變量中應(yīng)用程序根據(jù)宿主變量值組織SQL語(yǔ)句提交SQL語(yǔ)句到Oracle數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行語(yǔ)法檢查Oracle綁定 bind 宿主變量到準(zhǔn)備好的SQL語(yǔ)句中 此時(shí)Oracle得到宿主變量的地址 以能對(duì)變量?jī)?nèi)容進(jìn)行讀寫(xiě)Oracle執(zhí)行 execute 準(zhǔn)備好的SQL語(yǔ)句隨著宿主變量的變化 Oracle可以重復(fù)執(zhí)行這條SQL語(yǔ)句 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 10 使用動(dòng)態(tài)SQL的方法 方法1 無(wú)SQL變量的非查詢語(yǔ)句方法2 已知輸入變量個(gè)數(shù)的非查詢語(yǔ)句方法3 已知SELECT語(yǔ)句選取列和輸入宿主變量個(gè)數(shù)的查詢語(yǔ)句方法4 未知SELECT語(yǔ)句選取列或輸入宿主變量個(gè)數(shù)的查詢語(yǔ)句也適用于未知列名列表和輸入宿主變量的其他DML語(yǔ)句 只是其他語(yǔ)句處理比SELECT查詢定義游標(biāo)要簡(jiǎn)單 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 11 方法1 無(wú)SQL變量的非查詢語(yǔ)句 應(yīng)用程序接收外界輸入構(gòu)造SQL語(yǔ)句到一個(gè)字符串然后調(diào)用EXECUTEIMMEDIATE命令執(zhí)行這個(gè)SQL語(yǔ)句這種SQL語(yǔ)句不能為SELECT語(yǔ)句 不能包含輸入變量的占位符 例如 DELETEFROMEMPWHEREDEPTNO 20 GRANTSELECTONEMPTOscott 缺點(diǎn)此種方法每執(zhí)行一次SQL語(yǔ)句 數(shù)據(jù)庫(kù)都需要解析一遍SQL語(yǔ)句所以這種方法只適合運(yùn)行一次或少數(shù)幾次 否則嚴(yán)重影響應(yīng)用程序效率 EXECUTEIMMEDIATE命令的語(yǔ)法為 EXECSQLEXECUTEIMMEDIATE host string string literal 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 12 方法1 代碼示例 chardynstmt1 10 VARCHARdynstmt2 80 EXECSQLEXECUTEIMMEDIATE CREATETABLEdyn1 col1VARCHAR2 4 strncpy dynstmt1 COMMIT 10 EXECSQLEXECUTEIMMEDIATE dynstmt1 strcpy dynstmt2 arr DROPTABLEDYN1 dynstmt2 len strlen dynstmt2 arr EXECSQLEXECUTEIMMEDIATE dynstmt2 EXECSQLCOMMITRELEASE 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 13 方法2 已知輸入變量個(gè)數(shù)的非查詢語(yǔ)句 應(yīng)用程序接受或組建一個(gè)SQL語(yǔ)句 并通過(guò)PREPARE和EXECUTE語(yǔ)句執(zhí)行這個(gè)SQL 不能是查詢語(yǔ)句 為輸入宿主變量準(zhǔn)備的占位符數(shù)目和輸入宿主變量的類型必須已知 例如 INSERTINTOEMP ENAME JOB VALUES emp name job title DELETEFROMEMPWHEREEMPNO emp number 對(duì)方法2來(lái)說(shuō) SQL語(yǔ)句只在PREPARE時(shí)解析一次 以后可以執(zhí)行多次 并隨輸入宿主變量的不同而執(zhí)行結(jié)果不同 對(duì)于數(shù)據(jù)定義語(yǔ)句 DDLSQL 語(yǔ)句 例如CREATE和GRANT 隨PREPARE語(yǔ)句執(zhí)行 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 14 方法2 已知輸入變量個(gè)數(shù)的非查詢語(yǔ)句 PREPARE語(yǔ)法格式如下 EXECSQLPREPAREstatement nameFROM host string string literal PREPARE語(yǔ)句解析host string宿主變量對(duì)應(yīng)的SQL語(yǔ)句 并指定一個(gè)語(yǔ)句名稱statement name 語(yǔ)句名稱不是一個(gè)宿主變量 不需要聲明 只是一個(gè)編譯標(biāo)識(shí) EXECUTE語(yǔ)法格式如下 EXECSQLEXECUTEstatement name USINGhost variable list 其中host variable list格式如下 host variable1 indicator1 host variable2 indicator2 EXECUTE通過(guò)USING子句讀取輸入的宿主變量 執(zhí)行經(jīng)過(guò)PREPARE解析過(guò)的SQL語(yǔ)句statement name USING子句中如果一個(gè)是數(shù)組宿主變量 USING子句中的宿主變量必須全是數(shù)組類型 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 15 方法2 代碼示例 VARCHARdynstmt 80 intempno 1234 deptno1 97 i 0 strcpy dynstmt arr INSERTINTOEMP EMPNO DEPTNO VALUES v1 v2 dynstmt len strlen dynstmt arr EXECSQLPREPAREsql statementFROM dynstmt For i 0 i MAX i EXECSQLEXECUTEsql statementUSING empno deptno1 empno EXECSQLCOMMITRELEASE 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 16 方法3 1 構(gòu)造動(dòng)態(tài)查詢語(yǔ)句 通過(guò)接受或構(gòu)建SQL語(yǔ)句 用DELCARE PREPARE和OPEN FETCH CLOSE語(yǔ)句執(zhí)行動(dòng)態(tài)查詢SQL語(yǔ)句 并訪問(wèn)查詢結(jié)構(gòu) 適用于已知SELECT查詢的各列 列類型 輸入宿主變量數(shù)目 輸入宿主變量類型的情況 例如 SELECTDEPTNO MIN SAL MAX SAL FROMEMPGROUPBYDEPTNO SELECTENAME EMPNOFROMEMPWHEREDEPTNO dept number 方法3同方法2比較相像 只是PREPARE關(guān)聯(lián)的語(yǔ)句需要管理和定義游標(biāo) 必須知道表 視圖名 列名 而不能通過(guò)占位符號(hào)用宿主變量代替 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 17 方法3 2 對(duì)順序游標(biāo)動(dòng)態(tài)查詢處理邏輯用語(yǔ)句描述如下 PREPAREstatement nameFROM host string string literal DECLAREcursor nameCURSORFORstatement name OPENcursor name USINGhost variable list FETCHcursor nameINTOhost variable list CLOSEcursor name 對(duì)滾動(dòng)游標(biāo)動(dòng)態(tài)查詢處理邏輯用語(yǔ)句描述如下 PREPAREstatement nameFROM host string string literal DECLAREcursor nameSCROLLCURSORFORstatement name OPENcursor name USINGhost variable list FETCH FIRST PRIOR NEXT LAST CURRENT RELATIVEfetch offset ABSOLUTEfetch offset cursor nameINTOhost variable list CLOSEcursor name 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 18 方法3 代碼示例 strcpy dynstmt arr SELECTenameFROMempWHEREdeptno v1 dynstmt len strlen dynstmt arr EXECSQLPREPARESFROM dynstmt EXECSQLDECLARECCURSORFORS EXECSQLOPENCUSING deptno EXECSQLWHENEVERNOTFOUNDDObreak for EXECSQLFETCHCINTO ename ename arr ename len 0 puts char ename arr EXECSQLCLOSEC 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 19 方法4 1 在用戶不知道SELECT語(yǔ)句選擇的列內(nèi)容或不明確輸入宿主變量個(gè)數(shù) 類型時(shí) 需要用描述字 descriptors 進(jìn)行處理 例如下面描述的語(yǔ)句 INSERTINTOEMP VALUES SELECTFROMEMPWHEREDEPTNO 20 一個(gè)描述字 descriptor 是一塊描述用于在應(yīng)用程序和Oracle數(shù)據(jù)庫(kù)間執(zhí)行動(dòng)態(tài)SQL所需變量信息的內(nèi)存區(qū)域 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 20 方法4 2 為了滿足這中情況下的動(dòng)態(tài)查詢 應(yīng)用程序必須使用DESCRIBESELECTLIST命令 并且需要聲明一個(gè)SQLDecriptorArea SQLDA 類型的數(shù)據(jù)結(jié)構(gòu) 使用這個(gè)結(jié)構(gòu)來(lái)保存SELECT選擇的列信息 這個(gè)結(jié)構(gòu)也被稱作檢索描述字 SELECTDESCRIPTOR 如果應(yīng)用程序同時(shí)有多個(gè)活動(dòng)的SQL語(yǔ)句 每一個(gè)活動(dòng)的SQL語(yǔ)句必須有它自己的SQLDA 如果動(dòng)態(tài)SQL語(yǔ)句包含一個(gè)未知的輸入宿主變量列表 host variablelist 則不能使用USING子句完成宿主變量值的傳入 在這種情況下 應(yīng)用程序必須執(zhí)行DESCRIBEBINDVARIABLES語(yǔ)句 并聲明被稱為綁定描述字 BINDDESCRIPTOR 的另一SQLDA種類變量 用于保存輸入宿主變量所需占位符信息 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 21 DESCRIBE語(yǔ)句 DESCRIBE語(yǔ)句初始化一個(gè)描述字 用于保存select list列信息或輸入宿主變量信息 如果指定了一個(gè)檢索描述字 DESCRIBESELECTLIST語(yǔ)句檢查PREPARE語(yǔ)句中的動(dòng)態(tài)查詢語(yǔ)句的SELECT LIST列信息 得到列的名稱 列的類型 約束 長(zhǎng)度 精度信息 并存儲(chǔ)這些信息到檢索描述字 如果指定了一個(gè)綁定描述字 DESCRIBEBINDVARIABLES檢查PREPARE語(yǔ)句中的占位符號(hào) 將信息存儲(chǔ)在綁定描述字中供后續(xù)程序使用 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 22 SQLDA 1 SQLDA是用來(lái)保存SELECT LIST列信息或輸入宿主變量信息的數(shù)據(jù)結(jié)構(gòu) SQLDA變量不能在DECLARESECTION段中定義 SQLDA變量包含下面SELECT LIST列信息 能被DESCRIBE的列的最大數(shù)量能被DESCRIBE的列的真實(shí)數(shù)量存儲(chǔ)列值緩沖區(qū)的地址列值的長(zhǎng)度列值的數(shù)據(jù)類型指示變量值的地址存儲(chǔ)列名的緩沖區(qū)的地址存儲(chǔ)列名的緩沖區(qū)的長(zhǎng)度列名稱的當(dāng)前長(zhǎng)度 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 23 SQLDA 2 SQLDA變量包含在一個(gè)動(dòng)態(tài)SQL語(yǔ)句中所需要的輸入宿主變量的信息 能被DESCRIBE的占位符最大數(shù)量能被DESCRIBE的占位符的真實(shí)數(shù)量輸入宿主變量的地址輸入宿主變量的長(zhǎng)度輸入宿主變量的數(shù)據(jù)類型指示變量的地址存儲(chǔ)占位符名稱的緩沖區(qū)的地址存儲(chǔ)占位符名稱的緩沖區(qū)的長(zhǎng)度當(dāng)前占位符名稱的長(zhǎng)度存儲(chǔ)指示變量名的緩沖區(qū)地址存儲(chǔ)指示變量名的緩沖區(qū)的長(zhǎng)度當(dāng)前指變量名的長(zhǎng)度 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 24 處理過(guò)程描述 EXECSQLPREPAREstatement nameFROM host string string literal EXECSQLDECLAREcursor nameCURSORFORstatement name EXECSQLDESCRIBEBINDVARIABLESFORstatement nameINTObind descriptor name EXECSQLOPENcursor name USINGDESCRIPTORbind descriptor name EXECSQLDESCRIBE SELECTLISTFOR statement nameINTOselect descriptor name EXECSQLFETCHcursor nameUSINGDESCRIPTORselect descriptor name EXECSQLCLOSEcursor name 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 25 使用SQLDA變量 SQLDA結(jié)構(gòu)定義在sqlda h頭文件中 通常應(yīng)用程序需要通過(guò)指針應(yīng)用SQLDA變量需要定義一個(gè)指向檢索描述字 SELECTDESCRIPTOR 的指針或一個(gè)指向綁定描述字 BINDDESCRIPTOR 的指針 includeSQLDA bind dp SQLDA select dp 然后通過(guò)使用SQLSQLDAAlloc函數(shù) Oracle8之前的sqlaldt函數(shù) 進(jìn)行所需空間的分配 bind dp SQLSQLDAAlloc runtime context size name length ind name length 當(dāng)應(yīng)用程序?yàn)榉嵌嗑€程時(shí) runtime context采用SQL SINGLE RCTX代替 dvoid 0 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 26 SQLSQLDAAlloc函數(shù) SQLSQLDAAlloc函數(shù)的參數(shù)含義如下 SQLSQLDAAlloc runtime context max vars max name max ind name runtime context指向運(yùn)行環(huán)境的指針max vars最大能DESCRIBE的SELECT LIST列和占位符號(hào)的數(shù)目max name占位符和SELECT LIST列名稱的最大長(zhǎng)度max ind name最大指示變量長(zhǎng)度 這個(gè)參數(shù)只用于分配綁定描述字 BINDDESCRIPTOR 空間 對(duì)分配檢索描述字 SELECTDESCRIPTOR 空間時(shí) 賦0即可 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 27 SQLDA結(jié)構(gòu) structSQLDA longN Descriptorsizeinnumberofentries char V PtrtoArrofaddressesofmainvariables long L PtrtoArroflengthsofbuffers short T PtrtoArroftypesofbuffers short I PtrtoArrofaddressesofindicatorvars longF NumberofvariablesfoundbyDESCRIBE char S PtrtoArrofvariablenamepointers short M PtrtoArrofmaxlengthsofvar names short C PtrtoArrofcurrentlengthsofvar names char X PtrtoArrofind var namepointers short Y PtrtoArrofmaxlengthsofind var names short Z PtrtoArrofcurlengthsofind var names 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 28 SQLDA結(jié)構(gòu)成員描述 1 NSELECT LIST列或占位符的最大數(shù)量 執(zhí)行DESCRIBE前必須執(zhí)行SQLSQLDAAlloc 函數(shù)給N進(jìn)行賦值 設(shè)定描述數(shù)組的維數(shù) 其決定了描述字結(jié)構(gòu)成員數(shù)組的最大元素個(gè)數(shù) 在DESCRIBE命令后 必須將存儲(chǔ)在F中的變量真實(shí)個(gè)數(shù)賦值給N V是一個(gè)指向一個(gè)地址數(shù)組的指針 在該數(shù)組中存儲(chǔ)SELECT LIST列值或綁定變量的值 當(dāng)使用SQLSQLDAAlloc函數(shù)時(shí) 系統(tǒng)給V 0 到V n 賦值為0 在使用selectdescriptors時(shí) 必須在FETCH語(yǔ)句前 給V指針數(shù)組分配內(nèi)存空間 應(yīng)為下列語(yǔ)句要用到兩種描述字具體的值 EXECSQLFETCH USING selectdescriptors 對(duì)于binddescriptors 必須在OPEN語(yǔ)句前分配空間EXECSQLOPEN USING binddescriptors 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 29 SQLDA結(jié)構(gòu)成員描述 2 LL是一個(gè)指向存放select list或bind variable變量值長(zhǎng)度數(shù)組的指針 對(duì)于selectdescriptors DESCRIBESELECTLIST語(yǔ)句設(shè)置數(shù)組中各元素的值 對(duì)不在select list的對(duì)應(yīng)長(zhǎng)度設(shè)置成該類型的可的定義的最大長(zhǎng)度 在FETCH語(yǔ)句前 用戶可能需要重新修改變量長(zhǎng)度 比如為了顯示原因 需要將NUMBER類型數(shù)據(jù)存儲(chǔ)到C語(yǔ)言char 類型 就需要通過(guò)SQLNumberPrecV6 函數(shù)得到NUMBER長(zhǎng)度 然后轉(zhuǎn)換成字符串后的真實(shí)長(zhǎng)度 對(duì)于binddescriptors 用戶必須在OPEN語(yǔ)句前 給數(shù)組成員賦對(duì)應(yīng)V變量成員長(zhǎng)度的值 因?yàn)镺racle間接的通過(guò)使用存儲(chǔ)在V i 變量的地址訪問(wèn)數(shù)據(jù)區(qū)域 如果不指定L i 變量 就不能得到V i 的存儲(chǔ)數(shù)據(jù)的長(zhǎng)度 也就不能得到或給V i 指定的數(shù)據(jù)區(qū)域賦值 如果用戶需要更改V i 指定數(shù)據(jù)區(qū)域的長(zhǎng)度 只需簡(jiǎn)單更改L i 的值即可 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 30 SQLDA結(jié)構(gòu)成員描述 3 TT時(shí)指向一個(gè)數(shù)組的指針 在這個(gè)數(shù)組中存放這select list或者bind variable的數(shù)據(jù)類型 這個(gè)成員決定了Oracle數(shù)據(jù)存儲(chǔ)到V數(shù)組中時(shí)如何進(jìn)行轉(zhuǎn)換 對(duì)于selectdescriptors DESCRIBESELECTLIST語(yǔ)句設(shè)置數(shù)據(jù)類型數(shù)組值為Oracle內(nèi)部數(shù)據(jù)類型 char number或date等 在進(jìn)行FETCH前 用戶可能需要重新更改此數(shù)組某元素的值 因?yàn)镺racle內(nèi)部數(shù)據(jù)類型很難被C語(yǔ)言所采用 通常為了對(duì)select list對(duì)應(yīng)的selectdescriptors數(shù)據(jù)進(jìn)行顯示 需要將數(shù)據(jù)類型轉(zhuǎn)換成varchar2或STRING類型 T i 的高位用來(lái)指示其對(duì)應(yīng)的select list列值的 NULL NOTNULL 狀態(tài) 在使用OPEN或FETCH語(yǔ)句前 需要調(diào)用SQLColumnNullCheck 接受T i 數(shù)據(jù)類型值 并清空高位NULL NOTNULL狀態(tài) 對(duì)于binddescriptors DESCRIBEBINDVARIABLES設(shè)置數(shù)據(jù)類型數(shù)組的各元素值為0 用戶必須在OPEN命令前設(shè)置各輸入宿主變量的數(shù)據(jù)類型 變量類型值采用Oracle外部數(shù)據(jù)類型描述 通常 綁定變量值存儲(chǔ)在字符串?dāng)?shù)組中 其對(duì)應(yīng)的T i 就設(shè)置為1 Varchar2 或者5 STRING 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 31 SQLDA結(jié)構(gòu)成員描述 4 I一個(gè)指向存儲(chǔ)指示變量值數(shù)組的指針 對(duì)于selectdescriptors 在FETCH語(yǔ)句前必須設(shè)置I數(shù)組各元素所指向的地址 EXECSQLFETCH USING selectdescriptor 如果第i個(gè)select list對(duì)應(yīng)列值為空 則I i 值為 1否則是個(gè) 0的整數(shù) 對(duì)于binddescriptors 須在OPEN語(yǔ)句前設(shè)置I數(shù)組各變量的值EXECSQLOPEN USING binddescriptor F存放通過(guò)DESCRIBE語(yǔ)句得到的select list或占位符的真實(shí)數(shù)目 如果經(jīng)過(guò)DESCRIBE語(yǔ)句后F小于零表示DESCRIBE語(yǔ)句發(fā)現(xiàn)的select list數(shù)目或占位符數(shù)目比分配描述符時(shí)指定的最大數(shù)據(jù)數(shù)目N大 例如 如果設(shè)置N 10但DESCRIBE發(fā)現(xiàn)select list的數(shù)目是11個(gè) 那么F將被設(shè)置成 11 這允許用戶根據(jù)此值重新調(diào)用SQLSQLDAAlloc函數(shù)分配大的描述符存儲(chǔ)區(qū)域 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 32 SQLDA結(jié)構(gòu)成員描述 5 S指向一個(gè)數(shù)組的指針 該數(shù)組存儲(chǔ)select list或占位符的名字 M指向一個(gè)數(shù)組的指針 該數(shù)組存儲(chǔ)了select list或占位符名字的最大長(zhǎng)度 C指向一個(gè)數(shù)組的指針 該數(shù)組存儲(chǔ)了select list或占位符名字的當(dāng)前長(zhǎng)度 X指向一個(gè)存儲(chǔ)指示變量名字?jǐn)?shù)組的指針 Y指向一個(gè)存儲(chǔ)指示變量名字最大長(zhǎng)度數(shù)組的指針 Z指向一個(gè)存儲(chǔ)指示變量名稱當(dāng)前長(zhǎng)度數(shù)組的指針 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 33 轉(zhuǎn)換數(shù)據(jù)類型 在之前的應(yīng)用程序中 預(yù)編譯時(shí)對(duì)Oracle內(nèi)部和外部數(shù)據(jù)類型進(jìn)行自動(dòng)轉(zhuǎn)換 在DECLARESECTION變量聲明語(yǔ)句段 預(yù)編譯程序自動(dòng)的將宿主變量類型轉(zhuǎn)換成等值的Oracle外部數(shù)據(jù)類型 如自動(dòng)將int類型的宿主變量轉(zhuǎn)換成Oracle外部數(shù)據(jù)類型NUMBER 在方法4中 用戶可能需要人為的控制數(shù)據(jù)類型轉(zhuǎn)換 然后將轉(zhuǎn)換后的類型設(shè)置給SQLDA的T數(shù)組變量 Oracle內(nèi)部數(shù)據(jù)類型指定了數(shù)據(jù)在Oracle數(shù)據(jù)庫(kù)中的存儲(chǔ)格式 當(dāng)使用DESCRIBESELECTLIST命令時(shí) Oracle返回select list各列的內(nèi)部數(shù)據(jù)類型存儲(chǔ)到SQLDA的T變量 如第n個(gè)select list成員的數(shù)據(jù)類型被存儲(chǔ)到T n 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 34 基本步驟 1 1 在DECLARESECITON段聲明一個(gè)存放動(dòng)態(tài)SQL語(yǔ)句的字符串變量2 定義用于selcet list和bind varibales的SQLDA變量描述字3 為檢索描述字 selectdescriptor 和綁定描述字 binddescriptor 分配空間4 設(shè)置描述字中select list列和bindvariables的最大數(shù)量5 給第一步定義的字符串宿主變量賦值SQL語(yǔ)句6 根據(jù)存放SQL語(yǔ)句的字符串宿主變量進(jìn)行PREPARE7 為查詢DECLARE一個(gè)游標(biāo)8 DESCRIBE綁定變量到綁定描述符9 重置綁定游標(biāo)中最大占位符數(shù)目為DESCRIBE實(shí)際得到的占位符數(shù)目 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 35 基本步驟 2 10 得到綁定變量值 并給DESCRIBE發(fā)現(xiàn)的綁定變量分配存儲(chǔ)空間11 通過(guò)USING綁定描述符調(diào)用OPEN打開(kāi)游標(biāo)12 DESCRIBEselect list到檢索描述字 selectdescriptor 13 重置檢索描述字中select list實(shí)際選取的列數(shù)14 因?yàn)轱@示原因 重置描述字中對(duì)應(yīng)select list變量的類型和長(zhǎng)度15 調(diào)用FETCH 從數(shù)據(jù)中讀取數(shù)據(jù)到檢索描述字指向的內(nèi)存區(qū)域16 繼續(xù)FETCH到記錄集結(jié)束17 釋放空間18 關(guān)閉游標(biāo) 2020 2 18 Tiger WangEmail Wangzhiyong512 MSN Wangzhiyong512 36 SQL語(yǔ)句描述 1 普通順序游標(biāo)EXECSQLPREPAREstatement nameFROM host string string literal EXECSQLDECLAREcursor nameCURSORFORstatement name EXECSQLDESCRIBEBINDVARIABLESFORstatement nameINTObind descriptor name EXECSQLOPENcursor name
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育學(xué)理論與實(shí)踐
- 教學(xué)方法創(chuàng)新探索
- 高效體育復(fù)習(xí)策略
- 《岳陽(yáng)樓記》練習(xí)
- 腫瘤外科年終總結(jié)
- 校車公司接送學(xué)生的車輛安排問(wèn)題
- 供應(yīng)合同范本短
- 企業(yè)采購(gòu)獸藥合同范例
- 校本課程設(shè)置方案
- 信訪合同范例
- 2024年節(jié)水知識(shí)競(jìng)賽考試題及答案
- 2024年江蘇醫(yī)藥職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)完整
- qc工作崗位職責(zé)
- 【體能大循環(huán)】聚焦體能循環(huán)-探索運(yùn)動(dòng)奧秘-幼兒園探究體能大循環(huán)有效開(kāi)展策略課件
- 采購(gòu)人員廉潔從業(yè)課件培訓(xùn)
- 2024年單招計(jì)算機(jī)試題題庫(kù)及答案
- XX藥業(yè)公司受試者日記卡
- 多組學(xué)數(shù)據(jù)的整合與分析
- 小學(xué)安全教育《平安校園 拒絕欺凌》劉偉【省級(jí)】?jī)?yōu)質(zhì)課
- 靜脈輸液的不良反應(yīng)及處理原則考核試題及答案
- 《建筑概論》期末考試試卷附答案
評(píng)論
0/150
提交評(píng)論