達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8-PROC使用手冊(cè)_第1頁(yè)
達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8-PROC使用手冊(cè)_第2頁(yè)
達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8-PROC使用手冊(cè)_第3頁(yè)
達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8-PROC使用手冊(cè)_第4頁(yè)
達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8-PROC使用手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩125頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、達(dá)夢(mèng)數(shù)據(jù)庫(kù)DM8_PROC 使用手冊(cè)Service manual of DM8_PROCDM8_PRO*C 使用手冊(cè) PAGE * ROMAN VI前言概述本文檔主要介紹 DM 對(duì)于 PRO*C 的支持,包括 DM 支持的嵌入式 SQL 語(yǔ)法、PRO*C 程序的編寫(xiě)以及dpc_new 工具的使用等。讀者對(duì)象本文檔主要適用于DM 數(shù)據(jù)庫(kù)的:開(kāi)發(fā)工程師測(cè)試工程師技術(shù)支持工程師數(shù)據(jù)庫(kù)管理員通用約定在本文檔中可能出現(xiàn)下列標(biāo)志,它們所代表的含義如下:表 0.1 標(biāo)志含義標(biāo)志說(shuō)明表示可能導(dǎo)致系統(tǒng)損壞、數(shù)據(jù)丟失或不可預(yù)知的結(jié)果。表示可能導(dǎo)致性能降低、服務(wù)不可用。可以幫助您解決某個(gè)問(wèn)題或節(jié)省您的時(shí)間。表示正文

2、的附加信息,是對(duì)正文的強(qiáng)調(diào)和補(bǔ)充。在本文檔中可能出現(xiàn)下列格式,它們所代表的含義如下:表 0.2 格式含義格式說(shuō)明宋體表示正文。Courier new表示代碼或者屏幕顯示內(nèi)容。粗體表示命令行中的關(guān)鍵字(命令中保持不變、必須照輸?shù)牟糠郑┗蛘哒闹袕?qiáng)調(diào)的內(nèi)容。標(biāo)題、警告、注意、小竅門(mén)、說(shuō)明等內(nèi)容均采用粗體。語(yǔ)法符號(hào)中,表示一個(gè)語(yǔ)法對(duì)象。:=語(yǔ)法符號(hào)中,表示定義符,用來(lái)定義一個(gè)語(yǔ)法對(duì)象。定義符左邊為語(yǔ)法對(duì)象,右邊為相應(yīng)的語(yǔ)法描述。|語(yǔ)法符號(hào)中,表示或者符,限定的語(yǔ)法選項(xiàng)在實(shí)際語(yǔ)句中只能出現(xiàn)一個(gè)。 語(yǔ)法符號(hào)中,大括號(hào)內(nèi)的語(yǔ)法選項(xiàng)在實(shí)際的語(yǔ)句中可以出現(xiàn) 0N 次(N 為大于 0 的自然數(shù)),但是大括號(hào)本身

3、不能出現(xiàn)在語(yǔ)句中。 語(yǔ)法符號(hào)中,中括號(hào)內(nèi)的語(yǔ)法選項(xiàng)在實(shí)際的語(yǔ)句中可以出現(xiàn) 01 次,但是中括號(hào)本身不能出現(xiàn)在語(yǔ)句中。關(guān)鍵字關(guān)鍵字在 DM_SQL 語(yǔ)言中具有特殊意義,在 SQL 語(yǔ)法描述中,關(guān)鍵字以大寫(xiě)形式出現(xiàn)。但在實(shí)際書(shū)寫(xiě) SQL 語(yǔ)句時(shí),關(guān)鍵字既可以大寫(xiě)也可以小寫(xiě)。目錄 HYPERLINK l _bookmark0 概述1 HYPERLINK l _bookmark1 功能簡(jiǎn)介1 HYPERLINK l _bookmark2 預(yù)編譯系統(tǒng)的結(jié)構(gòu)與功能2 HYPERLINK l _bookmark3 預(yù)編譯系統(tǒng)的結(jié)構(gòu)2 HYPERLINK l _bookmark4 預(yù)編譯系統(tǒng)的功能2 HYPE

4、RLINK l _bookmark5 預(yù)編譯系統(tǒng)的處理流程3 HYPERLINK l _bookmark6 預(yù)編譯系統(tǒng)配置3 HYPERLINK l _bookmark7 預(yù)編譯系統(tǒng)包含的程序和文件3 HYPERLINK l _bookmark8 預(yù)編譯命令的使用方法3 HYPERLINK l _bookmark9 編譯目標(biāo)代碼文件時(shí)的編譯選項(xiàng)6 HYPERLINK l _bookmark10 預(yù)編譯概念7 HYPERLINK l _bookmark11 嵌入式 SQL 關(guān)鍵概念7 HYPERLINK l _bookmark12 嵌入式 SQL 語(yǔ)句7 HYPERLINK l _bookmar

5、k13 嵌入式 SQL 語(yǔ)法8 HYPERLINK l _bookmark14 靜態(tài) SQL 與動(dòng)態(tài) SQL8 HYPERLINK l _bookmark15 嵌入 PL/SQL 塊9 HYPERLINK l _bookmark16 宿主變量與指示符9 HYPERLINK l _bookmark17 DM 數(shù)據(jù)類(lèi)型9 HYPERLINK l _bookmark18 宿主數(shù)組10 HYPERLINK l _bookmark19 2.1.8 事務(wù)10 HYPERLINK l _bookmark20 2.1.9 錯(cuò)誤與警告10 HYPERLINK l _bookmark21 開(kāi)發(fā)嵌入式程序的步驟10

6、 HYPERLINK l _bookmark22 程序編寫(xiě)10 HYPERLINK l _bookmark23 嵌入式程序的組成12 HYPERLINK l _bookmark24 一個(gè)簡(jiǎn)單的嵌入式程序結(jié)構(gòu)分析12 HYPERLINK l _bookmark25 宿主變量的定義13 HYPERLINK l _bookmark26 聲明節(jié)語(yǔ)句14 HYPERLINK l _bookmark27 常規(guī)數(shù)據(jù)類(lèi)型變量的定義14 HYPERLINK l _bookmark28 宿主變量的使用16 HYPERLINK l _bookmark29 VARCHAR 宿主變量的使用18 HYPERLINK l

7、_bookmark30 游標(biāo)變量的使用19 HYPERLINK l _bookmark31 CONTEXT 變量19 HYPERLINK l _bookmark32 結(jié)構(gòu)宿主變量19 HYPERLINK l _bookmark33 指針變量24 HYPERLINK l _bookmark34 可執(zhí)行的 SQL 語(yǔ)句24 HYPERLINK l _bookmark35 數(shù)據(jù)庫(kù)登錄語(yǔ)句24 HYPERLINK l _bookmark36 數(shù)據(jù)庫(kù)退出語(yǔ)句25 HYPERLINK l _bookmark37 普通 SQL 語(yǔ)句26 HYPERLINK l _bookmark38 游標(biāo)語(yǔ)句27 HYPE

8、RLINK l _bookmark39 嵌入式程序中的異常處理32 HYPERLINK l _bookmark40 數(shù)據(jù)類(lèi)型支持37 HYPERLINK l _bookmark41 編寫(xiě)嵌入式程序的注意事項(xiàng)39 HYPERLINK l _bookmark42 ORACLE 兼容41 HYPERLINK l _bookmark43 簡(jiǎn)單的 ORACLE 嵌入式程序結(jié)構(gòu)分析41 HYPERLINK l _bookmark44 SQLDA/SQLCA48 HYPERLINK l _bookmark45 可執(zhí)行的 SQL 語(yǔ)句52 HYPERLINK l _bookmark46 預(yù)編譯命令 OPTIO

9、N53 HYPERLINK l _bookmark47 數(shù)據(jù)類(lèi)型映射54 HYPERLINK l _bookmark48 DB2 兼容56 HYPERLINK l _bookmark49 簡(jiǎn)單的 DB2 嵌入式程序結(jié)構(gòu)分析56 HYPERLINK l _bookmark50 SQLDA/SQLCA58 HYPERLINK l _bookmark51 可執(zhí)行的 SQL 語(yǔ)句59 HYPERLINK l _bookmark52 數(shù)據(jù)類(lèi)型映射59 HYPERLINK l _bookmark53 DM 嵌入式 SQL 高級(jí)功能61 HYPERLINK l _bookmark54 SSL 連接61 HY

10、PERLINK l _bookmark55 PL/SQL 塊62 HYPERLINK l _bookmark56 使用大字段句柄處理 LOB 類(lèi)型63 HYPERLINK l _bookmark57 游標(biāo)變量68 HYPERLINK l _bookmark58 批量執(zhí)行73 HYPERLINK l _bookmark59 SELECT 批量操作73 HYPERLINK l _bookmark60 INSERT 批量操作78 HYPERLINK l _bookmark61 UPDATE 批量操作78 HYPERLINK l _bookmark62 DELETE 批量操作79 HYPERLINK

11、l _bookmark63 FOR 語(yǔ)法79 HYPERLINK l _bookmark64 使用結(jié)構(gòu)數(shù)組80 HYPERLINK l _bookmark65 動(dòng)態(tài) SQL 語(yǔ)句83 HYPERLINK l _bookmark66 DM 動(dòng)態(tài) SQL 語(yǔ)句84 HYPERLINK l _bookmark68 ANSI 動(dòng)態(tài) SQL 語(yǔ)句89 HYPERLINK l _bookmark69 多線程支持96 HYPERLINK l _bookmark70 多線程應(yīng)用的運(yùn)行上下文環(huán)境96 HYPERLINK l _bookmark71 上下文的兩種使用方式96 HYPERLINK l _bookma

12、rk72 多線程嵌入式 SQL 與指令96 HYPERLINK l _bookmark73 多線程 PRO*C 程序注意事項(xiàng)100 HYPERLINK l _bookmark74 PRO*C 與 OCI 環(huán)境關(guān)聯(lián)100 HYPERLINK l _bookmark75 SQLEnvGet100 HYPERLINK l _bookmark76 SQLSvcCtxGet101 HYPERLINK l _bookmark77 編寫(xiě)與 OCI 關(guān)聯(lián)的 PRO*C 程序101 HYPERLINK l _bookmark78 PRO*C 中使用 OCI 實(shí)例103 HYPERLINK l _bookmark

13、79 修改當(dāng)前連接的自動(dòng)提交屬性109 HYPERLINK l _bookmark80 PRO*C 程序?qū)嵗?11 HYPERLINK l _bookmark81 SELECT 語(yǔ)句111 HYPERLINK l _bookmark82 插入、更新、刪除語(yǔ)句111 HYPERLINK l _bookmark83 插入語(yǔ)句111 HYPERLINK l _bookmark84 更新語(yǔ)句112 HYPERLINK l _bookmark85 刪除語(yǔ)句115 HYPERLINK l _bookmark86 日期、時(shí)間數(shù)據(jù)類(lèi)型的使用116 HYPERLINK l _bookmark87 7.4 多線程

14、118 HYPERLINK l _bookmark88 附錄 PRO*C 錯(cuò)誤碼匯編123DM8_PRO*C 使用手冊(cè) PAGE 109概述本章概要介紹PRO*C 與嵌入式SQL 的基本概念,以及 PRO*C 程序的工作機(jī)制即 DM的預(yù)編譯系統(tǒng)。功能簡(jiǎn)介SQL 語(yǔ)言作為結(jié)構(gòu)化的查詢(xún)語(yǔ)言,可以完成對(duì)數(shù)據(jù)庫(kù)的定義、查詢(xún)、更新、控制、維護(hù)、恢復(fù)、安全管理等一系列操作,充分體現(xiàn)了關(guān)系數(shù)據(jù)庫(kù)的特征。但 SQL 語(yǔ)言是非過(guò)程性語(yǔ)言,本身沒(méi)有過(guò)程性結(jié)構(gòu),大多數(shù)語(yǔ)句都是獨(dú)立執(zhí)行,與上下文無(wú)關(guān),而絕大多數(shù)完整的應(yīng)用都是過(guò)程性的,需要根據(jù)不同的條件來(lái)執(zhí)行不同的任務(wù)。因此,單純用 SQL 語(yǔ)言很難實(shí)現(xiàn)這樣的應(yīng)用。為

15、此,DM 數(shù)據(jù)庫(kù)提供了SQL 的兩種使用方式:一種是交互方式,另一種是嵌入方式。嵌入方式是將SQL 語(yǔ)言嵌入到高級(jí)語(yǔ)言中,這樣一來(lái),既發(fā)揮了高級(jí)語(yǔ)言數(shù)據(jù)類(lèi)型豐富、處理方便靈活的優(yōu)勢(shì),又以 SQL 語(yǔ)言彌補(bǔ)了高級(jí)語(yǔ)言難以描述數(shù)據(jù)庫(kù)操作的不足,從而為用戶(hù)提供了建立大型管理信息系統(tǒng)和處理復(fù)雜事務(wù)所需要的工作環(huán)境。在這種方式下使用的SQL 語(yǔ)言稱(chēng)為嵌入式 SQL,而嵌入 SQL 的高級(jí)語(yǔ)言稱(chēng)為主語(yǔ)言或宿主語(yǔ)言。DM 數(shù)據(jù)庫(kù)允許 C 作為嵌入方式的主語(yǔ)言。在 DM 系統(tǒng)中,我們將嵌有 SQL 語(yǔ)句的 C 語(yǔ)言程序稱(chēng)為PRO*C 程序。嵌入在主語(yǔ)言程序中的SQL 語(yǔ)句并不能直接被主語(yǔ)言編譯程序識(shí)別,必須對(duì)

16、這些SQL 語(yǔ)句進(jìn)行預(yù)處理,將其翻譯成主語(yǔ)言語(yǔ)句,生成由主語(yǔ)言語(yǔ)句組成的目標(biāo)文件,然后再由編譯程序編譯成可執(zhí)行文件,執(zhí)行該文件,方可得到用戶(hù)所需要的結(jié)果。DM 的PRO*C 嵌入工作方式支持的功能如下:支持國(guó)家和軍用標(biāo)準(zhǔn)關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言 SQL;支持嵌入SQL 語(yǔ)言的多模塊程序設(shè)計(jì);提供對(duì)用戶(hù)透明的查詢(xún)優(yōu)化功能;支持對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)的訪問(wèn)。預(yù)編譯系統(tǒng)的結(jié)構(gòu)與功能預(yù)編譯系統(tǒng)的結(jié)構(gòu)預(yù)編譯系統(tǒng)的結(jié)構(gòu)如下圖所示。預(yù)編譯系統(tǒng)詞法分析子系統(tǒng)語(yǔ)法分析子系統(tǒng)消息生成模塊圖 1.1 預(yù)編譯系統(tǒng)的結(jié)構(gòu)預(yù)編譯系統(tǒng)的功能預(yù)編譯系統(tǒng)主要包括詞法分析、語(yǔ)法分析、消息生成等幾個(gè)子系統(tǒng)。詞法分析子系統(tǒng)在嵌入工作方式下,詞法分析子系

17、統(tǒng)從指定的主語(yǔ)言源程序中逐段找出嵌入的 SQL 聲明節(jié)或語(yǔ)句段,將它們進(jìn)行分解,得到一個(gè)個(gè)單詞,順序填入單詞表,供語(yǔ)法分析時(shí)使用; 而對(duì)非 SQL 嵌入段的主語(yǔ)言正文則直接寫(xiě)入目標(biāo)文件。在交互工作方式下,詞法分析子系統(tǒng)只需要接受用戶(hù)輸入的單個(gè) SQL 語(yǔ)句或 SQL 語(yǔ)句塊,將它們分解成單詞串并順序填入單詞表。語(yǔ)法分析子系統(tǒng)語(yǔ)法分析子系統(tǒng)在詞法分析的基礎(chǔ)上,對(duì)單詞表中所存入的SQL 單詞串按 SQL 語(yǔ)言文本進(jìn)行初步的合法性檢查,并對(duì)各種單詞進(jìn)行分類(lèi),識(shí)別語(yǔ)句中的嵌入變量并進(jìn)行相應(yīng)的語(yǔ)法檢查。消息生成模塊在 DM 中,客戶(hù)端對(duì)數(shù)據(jù)庫(kù)的操作都是以消息方式傳送給數(shù)據(jù)庫(kù)服務(wù)器,因此預(yù)編譯系統(tǒng)應(yīng)具有將

18、 SQL 語(yǔ)句轉(zhuǎn)換為消息的功能,這就是消息生成。消息生成的任務(wù)是將SQL 語(yǔ)句翻譯成主語(yǔ)言消息生成語(yǔ)句和消息發(fā)送及回收語(yǔ)句,并將它們寫(xiě)入目標(biāo)文件。需要說(shuō)明的是,預(yù)編譯系統(tǒng)并不直接生成消息,而是利用對(duì)DPI 接口的函數(shù)調(diào)用實(shí)現(xiàn),這樣可以進(jìn)行必要的封裝,模塊性也更強(qiáng)。預(yù)編譯系統(tǒng)的處理流程在嵌入工作方式下,預(yù)編譯系統(tǒng)的功能是:對(duì)嵌入的 SQL 語(yǔ)句段和 SQL 聲明節(jié)進(jìn)行全面的詞法、語(yǔ)法檢查,然后將SQL 語(yǔ)句翻譯成主語(yǔ)言語(yǔ)句(即 DPI 函數(shù)調(diào)用)寫(xiě)入目標(biāo)文件中,使目標(biāo)文件成為一個(gè)純由主語(yǔ)言組成的程序。整個(gè)預(yù)編譯的處理流程如圖所示:圖 1.2 預(yù)編譯系統(tǒng)的處理流程預(yù)編譯系統(tǒng)配置預(yù)編譯系統(tǒng)包含的程序

19、和文件預(yù)編譯系統(tǒng)提供的軟件有:預(yù)編譯命令行運(yùn)行程序dpc_new.exe;編譯時(shí)要使用的文件 dpc_dll.h、DPI.h、DPItypes.h、sqlca.h;若兼容ORACLE,則需另外添加 sqlca_ora.h、sqlda_ora.h、dpc_ora_dll.h;若兼容DB2,則需另外添加 sqlca_db2.h、sqlda_db2.h;連接時(shí)需要的庫(kù)文件 dmdpc.lib(Windows 操作系統(tǒng))或者 libdmdpc.a(Linux);執(zhí)行時(shí)需要的動(dòng)態(tài)庫(kù)文件 dmdpc.dll(Windows 操作系統(tǒng))或者libdmdpc.so(Linux)。預(yù)編譯命令的使用方法預(yù)編譯時(shí),

20、在命令提示符窗口中輸入帶參數(shù)的 dpc_new 命令,語(yǔ)法如下:dpc_new parameter=value parameter=valuedpc_new 支持的參數(shù)含義如下表所示。表 1.1 dpc_new 參數(shù)參數(shù)介紹FILE.pc 文件的完整路徑,必須指定TYPE指定生成文件類(lèi)型。C 代表 C 源文件,CPP 代表 C+源文件;默認(rèn)為 CMODE編譯模式。STD 表示標(biāo)準(zhǔn)編譯模式;DM 表示達(dá)夢(mèng)編譯模式;ORACLE 表示兼容部分 ORACLE 語(yǔ)法的編譯模式;DB2 表示兼容部分 DB2 語(yǔ)法的編譯模式。默認(rèn) STD 編譯模式MACRO解析宏,如果源 pc 文件中有#define 定

21、義的宏,在文件中使用了宏,若不加此命令,文件中的宏將不能識(shí)別DEFINE條件編譯宏,如果源 pc 文件中有#defWIN32 等條件編譯宏,可以根據(jù)需要在 DEFINE 命令中設(shè)置對(duì)應(yīng)的條件編譯宏,來(lái)解析對(duì)應(yīng)的內(nèi)容INCLUDE_DIR包含的頭文件目錄,指定 pc 文件中 include 的頭文件所在的目錄WRITE_DIRECT解析的文件是否立即可見(jiàn),缺省為 N。當(dāng)為 N 時(shí),dpc_new 工具解析 pc 文件時(shí)解析完部分就會(huì)立即寫(xiě)入 C 文件;當(dāng)為 Y 時(shí),整個(gè) pc 文件解析完,才會(huì)一起寫(xiě)入生成的 C 文件OCI_CONNECT是否使用 OCI 連接,缺省為 NINCLUDE_SQLC

22、A是否包含 sqlca,缺省為 NCHAR_MAP字符串的處理方式,目前只支持 STRING、CHARZHELP打印幫助信息例 1:./dpc_new FILE=test.pc假設(shè)已有文件為 test.pc,則編譯命令如下。如果編譯成功將會(huì)生成test.c 文件,否則 dpc_new 工具會(huì)報(bào)錯(cuò)。例 2:#include #include #ifdef WIN32 #include #include 本例說(shuō)明如何根據(jù)設(shè)置的 define 命令,來(lái)解析對(duì)應(yīng)的內(nèi)容。假設(shè)原始文件test.pc 內(nèi)容如下:typedefLPTHREAD_START_ROUTINE os_thread_fun_t; #

23、else#include #endifos_thread_t;typedef HANDLE./dpc_new FILE=test.pc DEFINE=WIN32使用如下命令進(jìn)行編譯:則生成的test.c 的內(nèi)容為如下所示??梢钥吹剑?yàn)?DEFINE 參數(shù)指明了使用typedefLPTHREAD_START_ROUTINE os_thread_fun_t;os_thread_t;typedef HANDLE#include #include #include #include WIN32 條件編譯宏,因此編譯結(jié)果中正確解析了源文件中“ifdef WIN32”部分。若沒(méi)有使用 DEFINE=WI

24、N32 參數(shù),使用如下命令進(jìn)行編譯./dpc_new FILE=test.pc#include #include #include 則生成的test.c 的內(nèi)容為:例 3:#define BUFFERMAX20971520/* 緩 存 1024*1024*20 */unsigned char bufferBUFFERMAX;本例說(shuō)明MACRO 參數(shù)的作用。假設(shè)原始文件test.pc 內(nèi)容如下#include dpc_dll.h如果編譯命令中不加 MACRO=Y,那么在嵌入式 SQL 語(yǔ)句中使用 buffer 變量就無(wú)法識(shí)別 BUFFERMAX。使用 MACRO=Y 后,生成的 C 文件將所有使

25、用 BUFFERMAX 地方用20971520 替代。上面的 pc 將解析為下面內(nèi)容:/* Thread Safety */typedef void * sql_context; typedef void * SQL_CONTEXT;unsigned char buffer 20971520 ;如果指定了INCLUDE_DIR目錄,則默認(rèn)MACRO=Y編譯目標(biāo)代碼文件時(shí)的編譯選項(xiàng)_OciConnect:目標(biāo)文件需要使用 dci.dll 時(shí),包含頭文件 dci.h,在編譯時(shí)應(yīng)該加上該選項(xiàng)。DM64:如果在 64 位機(jī)器上編譯,需要加上該選項(xiàng)。由于 dpc_new 在編譯時(shí)需要使用#define

26、SLENGTH_MAX SDINT4_MAX #define ULENGTH_MAX UDINT4_MAX#endifulength;typedef udint4slength;typedef sdint4#define SLENGTH_MAX SDINT8_MAX #define ULENGTH_MAX UDINT8_MAX#elseulength;typedef udint8slength;#ifdef DM64typedef sdint8DPItypes.h,而在 DPItypes.h 中定義了 slength 和 ulength 類(lèi)型,如下所示:因此,如果 64 位環(huán)境下編譯應(yīng)用時(shí)沒(méi)加

27、 DM64 宏,會(huì)導(dǎo)致 DPI 接口調(diào)用異常。預(yù)編譯概念本章主要介紹嵌入式 SQL 中的一些關(guān)鍵概念與術(shù)語(yǔ),并簡(jiǎn)單介紹了開(kāi)發(fā) PRO*C 程序的步驟。本文檔中從本章開(kāi)始的所有示例,除了例子中特別建的表外,其余都使用 DM 示例庫(kù)中的表。嵌入式 SQL 關(guān)鍵概念嵌入式 SQL 語(yǔ)句嵌入式 SQL 是指在應(yīng)用程序里直接嵌入 SQL 語(yǔ)句。因?yàn)榍度?SQL,應(yīng)用程序又叫宿主程序,編寫(xiě)應(yīng)用程序的高級(jí)語(yǔ)言又叫宿主語(yǔ)言。例如,PRO*C/C+能夠在 C 和 C+宿主程序嵌入一些 SQL 語(yǔ)句??汕度氲腟QL 語(yǔ)句包括 DDL 與DML 語(yǔ)句,以及一些事務(wù)控制語(yǔ)句,這些語(yǔ)句都是嵌入的可執(zhí)行語(yǔ)句??蓤?zhí)行語(yǔ)句在

28、編譯時(shí)會(huì)調(diào)用 libdmdpc.so 庫(kù)接口,通過(guò)它們連接數(shù)據(jù)庫(kù),進(jìn)行數(shù)據(jù)定義及查詢(xún)操作數(shù)據(jù)庫(kù)數(shù)據(jù),以及處理事務(wù),它們能存在 C/C+語(yǔ)言中任何可執(zhí)行語(yǔ)句能嵌入的地方。表 2.1 列出了常用的嵌入可執(zhí)行語(yǔ)句。表 2.1 常用的嵌入可執(zhí)行語(yǔ)句可執(zhí)行語(yǔ)句作用ALLOCATE初始化變量ALTER,CREATE TABLEDDLDELETE,UPDATE, INSERT,SELECTDMLCOMMIT,ROLLBACK,SAVEPOINT,SET TRANSACTION事務(wù)控制DESCRIBE,EXECUTE,PREPARE動(dòng)態(tài) SQL除了可執(zhí)行語(yǔ)句,可嵌入 SQL 還包括一些在宿主程序與 DM 數(shù)據(jù)

29、庫(kù)之間傳輸數(shù)據(jù)的指令。這些指令在編譯時(shí)不需要調(diào)用 libdmdpc.so 庫(kù)接口,也不會(huì)操作數(shù)據(jù)庫(kù)數(shù)據(jù),用戶(hù)可以使用它們聲明通信區(qū)域和宿主變量。表 2.2 列出了常用的嵌入指令。指令作用表 2.2 常用的嵌入指令BEGIN DECLARE SECTIONEND DECLARE SECTION聲明宿主變量INCLUDE包含其他文件TYPE類(lèi)型定義WHENEVER捕獲運(yùn)行錯(cuò)誤嵌入式 SQL 語(yǔ)法在 PRO*C 程序中能夠自由地使用 SQL 語(yǔ)句與 C 語(yǔ)句,也可以在 SQL 語(yǔ)句中使用 C 變量和結(jié)構(gòu)。在 PRO*C 中使用 SQL 語(yǔ)句必須在 SQL 語(yǔ)句前加上關(guān)鍵字“EXEC SQL”并且以分

30、號(hào)結(jié)束。DM 的預(yù)編譯命令行運(yùn)行程序 dpc_new 將所有帶有“EXEC SQL”的語(yǔ)句轉(zhuǎn)換為對(duì) libdmdpc.so 庫(kù)中接口的調(diào)用。EXEC SQL COMMIT;-嵌入式-交互式COMMIT;許多嵌入式 SQL 語(yǔ)句與交互式 SQL 語(yǔ)句的區(qū)別只在于能夠使用程序變量或者是增加了額外的“EXEC SQL”關(guān)鍵字,下面的例子比較了交互式與嵌入式 COMMIT 語(yǔ)句的區(qū)別,他們的作用是一樣的。靜態(tài) SQL 與動(dòng)態(tài) SQL大多數(shù)程序使用靜態(tài)的SQL 處理固定的語(yǔ)句,在這種情況下,你必須在運(yùn)行前事先知道 SQL 語(yǔ)句和事務(wù)的組成,以及哪些 SQL 命令會(huì)被執(zhí)行,哪些表的結(jié)構(gòu)會(huì)變動(dòng),哪些列會(huì)被更

31、新等等。然而,在某些情況下可能要在運(yùn)行時(shí)才能確定要執(zhí)行的有效的 SQL 語(yǔ)句,因此你在運(yùn)行前可能不知道所有的SQL 命令、數(shù)據(jù)庫(kù)表、牽涉到的列等,只有在程序執(zhí)行時(shí)才能構(gòu)造出完整的SQL。動(dòng)態(tài) SQL 是一種高級(jí)編程技術(shù),能夠讓程序在運(yùn)行時(shí)處理執(zhí)行過(guò)程中臨時(shí)生成的 SQL 語(yǔ)句。嵌入 PL/SQL 塊PRO*C 把 PL/SQL 語(yǔ)句塊視作單一的嵌入 SQL 語(yǔ)句,任何 SQL 語(yǔ)句能嵌入的地方也能嵌入 PL/SQL 塊。在宿主程序中嵌入PL/SQL 塊,必須使用關(guān)鍵字 EXEC SQL EXECUTE 和 END-EXEC 將 PL/SQL 語(yǔ)句塊括起來(lái)。宿主變量與指示符宿主變量是數(shù)據(jù)庫(kù)與應(yīng)用

32、程序聯(lián)系的關(guān)鍵,宿主變量是在 C 中聲明的 SQL 與 C 程序都能使用的變量。程序使用輸入宿主變量向數(shù)據(jù)庫(kù)傳遞數(shù)據(jù),數(shù)據(jù)庫(kù)使用輸出宿主變量傳輸數(shù)據(jù)或其他狀態(tài)信息給應(yīng)用程序。宿主變量能夠在任何 SQL 表達(dá)式可以使用的地方使用。在SQL 語(yǔ)句中,宿主變量必須以“:”作為前綴以便于同關(guān)鍵字區(qū)分開(kāi)來(lái)。應(yīng)用程序中也能用結(jié)構(gòu)來(lái)包含多個(gè)宿主變量,在 SQL 語(yǔ)句中使用結(jié)構(gòu)時(shí)也要用“:”作為前綴,DM 會(huì)把結(jié)構(gòu)里的每個(gè)成員都當(dāng)宿主變量處理。每個(gè)宿主變量后都能跟一個(gè)指示符變量。指示符變量是一個(gè)整型的宿主變量,其作用 是用來(lái)指示宿主變量的取值情況。在 SQL 語(yǔ)句中,指示符變量必須加上“:”前綴并且只能緊跟在

33、它指示的宿主變量后面??梢栽谒拗髯兞颗c指示變量中間加上關(guān)鍵字 INDICATOR 使含義更明確,也可以省略。如果宿主變量是定義在結(jié)構(gòu)體中,你只需要定義一個(gè)指示符的結(jié)構(gòu),里面的指示變量與宿主結(jié)構(gòu)中的宿主變量一一對(duì)應(yīng),再在 SQL 語(yǔ)句使用指示結(jié)構(gòu)即可。與非結(jié)構(gòu)指示變量一樣,也需要緊跟在宿主結(jié)構(gòu)之后,且前綴加上“:”,也可在中間加上關(guān)鍵字INDICATOR。DM 數(shù)據(jù)類(lèi)型一般來(lái)說(shuō),應(yīng)用程序輸入數(shù)據(jù)到數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)輸出數(shù)據(jù)到程序。數(shù)據(jù)庫(kù)將輸入的數(shù)據(jù)存儲(chǔ)到到表中,輸出數(shù)據(jù)存放到宿主變量里。存儲(chǔ)數(shù)據(jù)必須知道數(shù)據(jù)類(lèi)型,以確定存儲(chǔ)格式。數(shù)據(jù)在DM 數(shù)據(jù)庫(kù)表中的存儲(chǔ)格式為DM 內(nèi)部數(shù)據(jù)類(lèi)型;數(shù)據(jù)在宿主變量中的

34、存儲(chǔ)格式為外部數(shù)據(jù)類(lèi)型。DM 數(shù)據(jù)庫(kù)能同時(shí)識(shí)別這兩種數(shù)據(jù)類(lèi)型,且在二者間進(jìn)行轉(zhuǎn)換。宿主數(shù)組PRO*C 允許定義數(shù)組宿主變量和數(shù)組結(jié)構(gòu)宿主變量,并且在單個(gè)SQL 中使用。使用數(shù)組可以同時(shí)操作大量數(shù)據(jù),也可以在結(jié)構(gòu)中使用數(shù)組宿主變量。事務(wù)PRO*C 中嵌入的SQL 也適用交互式SQL 中事務(wù)的概念,可以通過(guò) COMMIT、ROLLBACK、SAVEPOINT 等語(yǔ)句對(duì)事務(wù)進(jìn)行控制。錯(cuò)誤與警告當(dāng)嵌入式 SQL 執(zhí)行出錯(cuò)或產(chǎn)生警告時(shí),PRO*C 提供了三種方法來(lái)捕獲錯(cuò)誤與警告:SQLCA 結(jié)構(gòu)、WHENEVER 語(yǔ)句、SQLCODE 與SQLSTATE。具體使用方法見(jiàn)后面章節(jié)介紹。開(kāi)發(fā)嵌入式程序的步驟

35、舉例說(shuō)明嵌有 SQL 語(yǔ)句的 C 語(yǔ)言程序PRO*C 的運(yùn)行過(guò)程:編寫(xiě)嵌有SQL 語(yǔ)句的源程序 test.pc;使用DM 預(yù)編譯工具 dpc_new 編譯test.pc,生成 test.c;C 編譯器編譯鏈接上述文件,以及 dpc_dll.h、DPI.h、DPItypes.h、sqlca.h、dmdpc.lib、dmdpc.dll,生成 test.exe 可執(zhí)行程序。若在Linux 下則將 dmdpc.lib、dmdpc.dll 改為 libdmdpc.a 和 libdmdpc.so。程序編寫(xiě)本節(jié)簡(jiǎn)單介紹一些嵌入式程序編寫(xiě)的語(yǔ)法、慣例、限制等,具體在后續(xù)章節(jié)中會(huì)有詳細(xì)介紹。程序注釋可以在嵌入的

36、 SQL 語(yǔ)句中使用 C 類(lèi)型注釋?zhuān)?*/),也可以在一行的結(jié)尾使用ANSI 標(biāo)準(zhǔn)的注釋?zhuān)?)。EXEC SQL SELECT NAME,/*名字*/ SEXINTO :name, :sex- output host variables FROM PERSON.PERSONWHERE PERSONID = :personid;例如:聲明節(jié)EXEC SQL BEGIN DECLARE SECTION;/* 聲明宿主變量在這里*/char username20,password20,servername20;.EXEC SQL END DECLARE SECTION;一個(gè)聲明節(jié)的組成如下例所示:聲

37、明節(jié)以“EXEC SQL BEGIN DECLARE SECTION;”語(yǔ)句開(kāi)始,以“EXEC SQLEND DECLARE SECTION;”結(jié)束。在聲明節(jié)中能夠存在的內(nèi)容包括有以下語(yǔ)句:宿主變量與指示符變量的定義非宿主的 C 變量C 的注釋EXEC SQL TYPE 語(yǔ)句引號(hào)EXEC SQL SELECT NAME, SEX FROM EMP WHERE PHONE = 123456789;C 使用單引號(hào)表示單個(gè)字符,SQL 使用單引號(hào)界定字符串,例如:C 使用雙引號(hào)界定字符串,SQL 使用雙引號(hào)界定包含小寫(xiě)或特殊字符的標(biāo)識(shí)符,例如:EXEC SQL CREATE TABLE test(c

38、1 INT);行延長(zhǎng)EXEC SQL INSERT INTO PERSON.PERSON (NAME, PHONE) VALUES (XQ, 123456);在 SQL 語(yǔ)句中能夠使用反斜杠延長(zhǎng)一行字符串到另一行,例如:嵌入式程序的組成一個(gè)簡(jiǎn)單的嵌入式程序結(jié)構(gòu)分析首先,從一個(gè)簡(jiǎn)單的程序入手來(lái)認(rèn)識(shí)嵌入式程序的組成和基本語(yǔ)法。/* test.pc */ #include /*宿主變量的定義 */EXEC SQL BEGIN DECLARE SECTION;char username20,password20,servername20; varchar person_name50;varchar p

39、erson_phone25; EXEC SQL END DECLARE SECTION;void main(void)printf( Please input username:); scanf(%s,username);printf( Please input password :); scanf(%s,password);printf( Please input servername :); scanf(%s,servername);/*登錄數(shù)據(jù)庫(kù)*/EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;/*對(duì)數(shù)據(jù)庫(kù)操

40、作 */EXEC SQL SELECT name, phoneINTO :person_name,:person_phone FROM person.person例如,下面是一個(gè)名為 test.pc 的簡(jiǎn)單的嵌入式程序。這個(gè)程序查詢(xún)并輸出“人員信息”表中人員編號(hào)為“1”的人員姓名和聯(lián)系電話。WHERE personid = 1;printf(n 對(duì)應(yīng)的人員姓名為: %sn, person_name); printf(n 對(duì)應(yīng)的聯(lián)系電話為: %sn, person_phone);/*退出數(shù)據(jù)庫(kù)*/ EXEC SQL LOGOUT;一般說(shuō)來(lái),pc 文件由以下幾個(gè)部分構(gòu)成:宿主變量定義EXEC SQ

41、L BEGIN DECLARE SECTION;EXEC SQL END DECLARE SECTION;在上面的例子中,宿主變量定義為嵌入在如下語(yǔ)句中的部分:登錄數(shù)據(jù)庫(kù)EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;數(shù)據(jù)庫(kù)操作登錄成功之后,就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行各種操作。退出登錄EXEC SQL LOGOUT;下面將對(duì)以上各部分加以詳細(xì)說(shuō)明。宿主變量的定義嵌入的 SQL 語(yǔ)句可以使用主語(yǔ)言的變量來(lái)輸入/輸出數(shù)據(jù)。例如在 SELECT 語(yǔ)句中, 需要將查找到的數(shù)據(jù)通過(guò) INTO 子句送到某些變量中,或者 WHERE 子句

42、需要用某些變量的值作條件。我們稱(chēng)SQL 語(yǔ)句中使用到的變量為宿主變量。在SQL 中所使用的宿主變量均必須在嵌入的 SQL 聲明節(jié)中加以說(shuō)明。聲明節(jié)語(yǔ)句聲明節(jié)開(kāi)始語(yǔ)句語(yǔ)法:EXEC SQL BEGIN DECLARE SECTION;功能:表示聲明節(jié)的開(kāi)始。使用說(shuō)明:后面必須有一個(gè)聲明節(jié)結(jié)束語(yǔ)句與之相對(duì)應(yīng)。聲明節(jié)結(jié)束語(yǔ)句語(yǔ)法:EXEC SQL END DECLARE SECTION;功能:表示聲明節(jié)的結(jié)束。使用說(shuō)明:前面必須有一個(gè)聲明節(jié)開(kāi)始語(yǔ)句與之相對(duì)應(yīng)。使用聲明節(jié)應(yīng)注意的問(wèn)題在聲明節(jié)開(kāi)始語(yǔ)句與結(jié)束語(yǔ)句中間,采用 C 語(yǔ)言定義變量的方式定義宿主變量。在聲明節(jié)中定義的變量可以被 C 語(yǔ)句使用,而不

43、必在聲明節(jié)之外重新定義這些變量,否則會(huì)引起變量重復(fù)定義的錯(cuò)誤。一個(gè)程序模塊中可以出現(xiàn)多個(gè)聲明節(jié),各個(gè)聲明節(jié)可以出現(xiàn)在 C 程序的說(shuō)明語(yǔ)句可出現(xiàn)的位置上。PRO*C 規(guī)定,一個(gè)模塊中所有的聲明節(jié)中的宿主變量不得同名,而不論其實(shí)質(zhì)是全局變量還是局部變量。預(yù)編譯時(shí),相應(yīng)聲明節(jié)的 C 語(yǔ)句是去掉了“EXECSQL BEGIN DECLARE SECTION”和“EXEC SQL END DECLARE SECTION”兩個(gè)語(yǔ)句后的變量定義語(yǔ)句,其位置順序均保持不變。常規(guī)數(shù)據(jù)類(lèi)型變量的定義在聲明節(jié)中,可以使用的常規(guī)數(shù)據(jù)類(lèi)型包括:char、short、int、long、float、double 等C 數(shù)據(jù)

44、類(lèi)型。定義這些類(lèi)型變量的方法與 C 語(yǔ)言定義相應(yīng)變量的方法基本上是相同的。由于 DM 采用的是一次一個(gè)元組的處理方式,因而限制了數(shù)組的定義和使用,即不能使用數(shù)組的某個(gè)元素。作為一種特例,在聲明節(jié)中定義字符數(shù)組,作為字符串指針使用。如: char name20等價(jià)于 char *name ,其中 name 是指向長(zhǎng)度為 20 個(gè)字節(jié)空間的字符指針(等價(jià)于指針變量)。在定義常規(guī)類(lèi)型的變量時(shí),與 C 語(yǔ)言一樣,可以加上存儲(chǔ)類(lèi)型修飾符,包括 extern、static 和auto。定義語(yǔ)句的語(yǔ)法如下::=:= ,.:=extern|static|auto:= char | short | int |

45、long | float | double 等:= = := | * | 無(wú)符號(hào)整數(shù)例如:EXEC SQL BEGIN DECLARE SECTION;char shop_no20,shop_name20; short flag;EXEC SQL END DECLARE SECTION;常規(guī)數(shù)據(jù)類(lèi)型變量定義。預(yù)編譯后,產(chǎn)生的結(jié)果為:char shop_no20,shop_name20; short flag;宿主變量的使用常規(guī)使用方法在 SQL 語(yǔ)句中引用的宿主變量都應(yīng)在聲明節(jié)中定義,而且定義應(yīng)先于引用。在 SQL 語(yǔ)句中使用宿主變量時(shí),在引用的宿主變量名前必須加上并且只能加上冒號(hào)“:”,而不

46、論說(shuō)明該變量時(shí)變量名前有無(wú)“*”,或者是否采用數(shù)組形式。在 C 語(yǔ)句中使用宿主變量時(shí),不能夠加上“:”。例如:EXEC SQL BEGIN DECLARE SECTION;varchar person_name50; varchar person_phone25; varchar person_id10;EXEC SQL END DECLARE SECTION;strcpy(person_id,1);EXEC SQL SELECT name, phoneINTO :person_name, :person_phone FROM person.person WHERE personid =:pe

47、rson_id;printf(%s %s , person_name, person_phone);查詢(xún)?nèi)藛T編號(hào)為“1”的人員姓名及聯(lián)系電話。執(zhí)行結(jié)果:李麗 02788548562指示符的使用在 SQL 語(yǔ)句中,在一個(gè)宿主變量之后,可以再跟一個(gè)數(shù)據(jù)類(lèi)型為整型 (short, long,int) 的被稱(chēng)為指示變量的宿主變量,其作用是指明該變量之前的一個(gè)宿主變量的取值情況。具體地說(shuō),它有如下兩個(gè)作用,分別舉例說(shuō)明:指示 SQL 語(yǔ)句中輸入變量的值是否為空值。例如:EXEC SQL BEGIN DECLARE SECTION;varchar person_name50; varchar person

48、_phone25; varchar person_id10; shortvalue_indicator;EXEC SQL END DECLARE SECTION;strcpy(person_name,李麗); person_phone =02788548562;value_indicator=-1;EXEC SQL INSERT INTO person.person (name, phone) VALUES(:person_name,:person_phone INDICATOR :value_indicator);/*該語(yǔ)句等價(jià)于:EXEC SQL INSERT INTO person.pe

49、rson (name, phone) VALUES(李麗, NULL);*/使用指示變量插入空值。利用預(yù)置指示變量的值為-1,表明插入一個(gè)空值。在前一種插入語(yǔ)句中,person_phone 帶指示變量 value_indicator,由于value_indicator 的值為-1,盡管 person_phone 的值為 02788548562,系統(tǒng)仍不使用該值作插入值,而認(rèn)為 person_phone 的插入值為空。如果希望 person_phone 的插入值為 02788548562,只需改變 value_indicator 的值為 0 即可。在后一個(gè)插入語(yǔ)句中,person_phone 未

50、使用指示變量,它的插入值在插入語(yǔ)句中固定為 NULL,如果希望 person_phone 的插入值為 02788548562,則要修改該插入語(yǔ)句。因此,前一種使用指示變量的方法比后一種方法靈活,同時(shí)也給用戶(hù)編程帶來(lái)方便。指示執(zhí)行 SQL 語(yǔ)句后,返回結(jié)果是否為空值或有截取等情況。在 INTO 子句中,使用指示變量表明該 SQL 語(yǔ)句執(zhí)行時(shí),對(duì)被指示的宿主變量的賦值情況。一個(gè)指示變量的取值有三種:取值為 0,說(shuō)明返回值非空且賦給宿主變量時(shí)不發(fā)生截舍; 取值為-1,說(shuō)明返回的值為空值;取值0,說(shuō)明返回的值為非空值,但在賦給宿主變量時(shí), 字符串的值被截舍,這時(shí)指示變量的值為截?cái)嘀暗拈L(zhǎng)度。使用宿主變

51、量應(yīng)注意的問(wèn)題宿主變量的命名是有大小寫(xiě)區(qū)別的。字符序列相同,大小寫(xiě)不同的變量名代表不同的變量。宿主變量的命名不應(yīng)是 C 語(yǔ)句的關(guān)鍵字,以免產(chǎn)生誤用或錯(cuò)誤。使用宿主變量時(shí)應(yīng)注意:SQL 語(yǔ)句引用一個(gè)宿主變量時(shí),宿主變量名前加一個(gè)冒號(hào);C 語(yǔ)句中使用宿主變量時(shí), 不加冒號(hào);引用宿主變量時(shí),可以使用一個(gè)相關(guān)的指示變量。另外,由于 C 語(yǔ)言所允許的數(shù)據(jù)類(lèi)型與 SQL 語(yǔ)言所采用的數(shù)據(jù)類(lèi)型有一定的差別,因而在輸入輸出數(shù)據(jù)時(shí),在兩種數(shù)據(jù)類(lèi)型之間要做一定的轉(zhuǎn)換工作。DM 支持BYTE、NUMERIC 與 short、int、float、double 之間的轉(zhuǎn)換,但應(yīng)注意數(shù)據(jù)轉(zhuǎn)換時(shí)產(chǎn)生的溢出問(wèn)題。VARCHA

52、R 宿主變量的使用可以使用VARCHAR 類(lèi)型聲明可變長(zhǎng)度的字符串,如果需要處理VARCHAR 類(lèi)型列的數(shù)據(jù)的輸入輸出,使用 VARCHAR 類(lèi)型變量比使用 C 字符串類(lèi)型會(huì)更加方便?!癡ARCHAR” 可以是大寫(xiě)也可以是小寫(xiě),但是不能大小寫(xiě)混用。VARCHAR 類(lèi)型經(jīng)過(guò)預(yù)編譯被轉(zhuǎn)換為 C 的結(jié)構(gòu)。VARCHARusername20;例如:經(jīng)過(guò)預(yù)編譯后轉(zhuǎn)換成:structunsigned shortlen; unsigned chararr20; username;其中l(wèi)en 是數(shù)據(jù)的實(shí)際長(zhǎng)度,arr 存放的是字符串的數(shù)據(jù)。在 SQL 語(yǔ)句中使用EXEC SQL SELECT NAME INT

53、O :username FROM PERSON.PERSON;VARCHAR 宿主變量與使用 C 類(lèi)型宿主變量一樣。例如:游標(biāo)變量的使用游標(biāo)在 PRO*C 中作為一種對(duì)象變量使用,具體的使用方法見(jiàn)第 6.4 節(jié)介紹。CONTEXT 變量運(yùn)行上下文 CONTEXT 變量實(shí)際上是一個(gè)句柄,指向客戶(hù)端內(nèi)存的一段區(qū)域,對(duì)應(yīng)一個(gè)DM8 數(shù)據(jù)庫(kù)連接,包含 0 個(gè)或多個(gè)游標(biāo)的狀態(tài)與信息等。使用CONTEXT 變量一般包括以下幾個(gè)步驟:sql_context my_context ;使用sql_context 定義上下文宿主變量例如:EXEC SQL CONTEXT ALLOCATE :my_context

54、;使用ALLOCATE 語(yǔ)句初始化 context 變量例如:使用context 變量,context 使用后直到下一個(gè) CONTEXT USE 才會(huì)切換到新的上下文。EXEC SQL CONTEXT USE :my_context ;例如:使用FREE 語(yǔ)句釋放 context 變量例如:EXEC SQL CONTEXT FREE :my_context ;CONTEXT 變量的具體使用可參看后續(xù)“多線程支持”章節(jié)。結(jié)構(gòu)宿主變量可以在嵌入式程序中定義 C 結(jié)構(gòu)宿主變量,然后在SQL 語(yǔ)句中引用結(jié)構(gòu)變量,需要注意結(jié)構(gòu)中的成員必須與查詢(xún)或插入SQL 語(yǔ)句中表達(dá)式的順序一致。typedef str

55、uct例 1:使用結(jié)構(gòu)進(jìn)行數(shù)據(jù)插入。charsex2;charname51; charemail51; char phone26; person_record; person_record new_person;/* 為 new_person 賦值 */EXEC SQL INSERT INTOPERSON.PERSON(SEX, NAME, EMAIL, PHONE)VALUES (:new_person);typedef structcharsex32;charname351; charemail351; char phone326; person_record; person_record

56、 new_person;/* 為 new_person 賦值 */EXEC SQL INSERT INTOPERSON.PERSON(SEX, NAME, EMAIL, PHONE)VALUES (:new_person);結(jié)構(gòu)中的成員也可以是數(shù)組,這樣用來(lái)批量執(zhí)行,可同時(shí)操作多行。例 2:一次向 PERSON 表插入三行數(shù)據(jù)。當(dāng)需要使用指示符變量時(shí),由于宿主變量都包含在結(jié)構(gòu)里,所以必須再定義一個(gè)結(jié)構(gòu)包含各個(gè)宿主變量對(duì)應(yīng)的指示符變量,并且成員順序必須與宿主變量的結(jié)構(gòu)一致。struct例 3:short sex_ind; short name_ind; short email_ind; shor

57、t phone_ind; person_record_ind;/* 為 person_record_ind 賦值 */EXEC SQL INSERT INTOPERSON.PERSON(SEX, NAME, EMAIL, PHONE)VALUES (:person_record_ind);例 4:一個(gè)完整的使用結(jié)構(gòu)的示例。person_info;person_info person_rec_ptr;phone50;charemail50;charname50;chartypedef structEXEC SQL INCLUDE SQLCA;40#define PWD_LEN20#define

58、UNAME_LEN/*This program connects to DM, declares and opens a cursor,fetches the name, email, and phone of allpeople, displays the results, then closes the cursor.*/#include EXEC SQL BEGIN DECLARE SECTION;charusername50;charpassword50;charservername50;EXEC SQL END DECLARE SECTION;/* Declare function

59、to handle unrecoverable errors. */void sql_error();main()/* Connect to DM. */strcpy(username, SYSDBA);strcpy(password, SYSDBA);strcpy(servername, 9:5289);EXEC SQL WHENEVER SQLERROR DO sql_error(DM error-);EXEC SQL CONNECT :username IDENTIFIED BY :password USING :servername;printf(nConnected to dm as

60、 user: %sn, username);/* Declare the cursor. All static SQL explicit cursorscontain SELECT commands. salespeople is a SQL identifier,not a (C) host variable.*/EXEC SQL DECLARE salespeople CURSOR FORSELECT NAME, EMAIL, PHONE FROM PERSON;/* Open the cursor. */EXEC SQL OPEN salespeople;/* Get ready to

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論