![達(dá)夢數(shù)據(jù)庫DM8-PROC使用手冊_第1頁](http://file4.renrendoc.com/view/b2ca91fece2e1915f237a62eba66978e/b2ca91fece2e1915f237a62eba66978e1.gif)
![達(dá)夢數(shù)據(jù)庫DM8-PROC使用手冊_第2頁](http://file4.renrendoc.com/view/b2ca91fece2e1915f237a62eba66978e/b2ca91fece2e1915f237a62eba66978e2.gif)
![達(dá)夢數(shù)據(jù)庫DM8-PROC使用手冊_第3頁](http://file4.renrendoc.com/view/b2ca91fece2e1915f237a62eba66978e/b2ca91fece2e1915f237a62eba66978e3.gif)
![達(dá)夢數(shù)據(jù)庫DM8-PROC使用手冊_第4頁](http://file4.renrendoc.com/view/b2ca91fece2e1915f237a62eba66978e/b2ca91fece2e1915f237a62eba66978e4.gif)
![達(dá)夢數(shù)據(jù)庫DM8-PROC使用手冊_第5頁](http://file4.renrendoc.com/view/b2ca91fece2e1915f237a62eba66978e/b2ca91fece2e1915f237a62eba66978e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、達(dá)夢數(shù)據(jù)庫DM8_PROC 使用手冊Service manual of DM8_PROCDM8_PRO*C 使用手冊 PAGE * ROMAN VI前言概述本文檔主要介紹 DM 對于 PRO*C 的支持,包括 DM 支持的嵌入式 SQL 語法、PRO*C 程序的編寫以及dpc_new 工具的使用等。讀者對象本文檔主要適用于DM 數(shù)據(jù)庫的:開發(fā)工程師測試工程師技術(shù)支持工程師數(shù)據(jù)庫管理員通用約定在本文檔中可能出現(xiàn)下列標(biāo)志,它們所代表的含義如下:表 0.1 標(biāo)志含義標(biāo)志說明表示可能導(dǎo)致系統(tǒng)損壞、數(shù)據(jù)丟失或不可預(yù)知的結(jié)果。表示可能導(dǎo)致性能降低、服務(wù)不可用??梢詭椭鉀Q某個(gè)問題或節(jié)省您的時(shí)間。表示正文
2、的附加信息,是對正文的強(qiáng)調(diào)和補(bǔ)充。在本文檔中可能出現(xiàn)下列格式,它們所代表的含義如下:表 0.2 格式含義格式說明宋體表示正文。Courier new表示代碼或者屏幕顯示內(nèi)容。粗體表示命令行中的關(guān)鍵字(命令中保持不變、必須照輸?shù)牟糠郑┗蛘哒闹袕?qiáng)調(diào)的內(nèi)容。標(biāo)題、警告、注意、小竅門、說明等內(nèi)容均采用粗體。語法符號中,表示一個(gè)語法對象。:=語法符號中,表示定義符,用來定義一個(gè)語法對象。定義符左邊為語法對象,右邊為相應(yīng)的語法描述。|語法符號中,表示或者符,限定的語法選項(xiàng)在實(shí)際語句中只能出現(xiàn)一個(gè)。 語法符號中,大括號內(nèi)的語法選項(xiàng)在實(shí)際的語句中可以出現(xiàn) 0N 次(N 為大于 0 的自然數(shù)),但是大括號本身
3、不能出現(xiàn)在語句中。 語法符號中,中括號內(nèi)的語法選項(xiàng)在實(shí)際的語句中可以出現(xiàn) 01 次,但是中括號本身不能出現(xiàn)在語句中。關(guān)鍵字關(guān)鍵字在 DM_SQL 語言中具有特殊意義,在 SQL 語法描述中,關(guān)鍵字以大寫形式出現(xiàn)。但在實(shí)際書寫 SQL 語句時(shí),關(guān)鍵字既可以大寫也可以小寫。目錄 HYPERLINK l _bookmark0 概述1 HYPERLINK l _bookmark1 功能簡介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 語句7 HYPERLINK l _bookmar
5、k13 嵌入式 SQL 語法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ù)類型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 開發(fā)嵌入式程序的步驟10
6、 HYPERLINK l _bookmark22 程序編寫10 HYPERLINK l _bookmark23 嵌入式程序的組成12 HYPERLINK l _bookmark24 一個(gè)簡單的嵌入式程序結(jié)構(gòu)分析12 HYPERLINK l _bookmark25 宿主變量的定義13 HYPERLINK l _bookmark26 聲明節(jié)語句14 HYPERLINK l _bookmark27 常規(guī)數(shù)據(jù)類型變量的定義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 語句24 HYPERLINK l _bookmark35 數(shù)據(jù)庫登錄語句24 HYPERLINK l _bookmark36 數(shù)據(jù)庫退出語句25 HYPERLINK l _bookmark37 普通 SQL 語句26 HYPERLINK l _bookmark38 游標(biāo)語句27 HYPE
8、RLINK l _bookmark39 嵌入式程序中的異常處理32 HYPERLINK l _bookmark40 數(shù)據(jù)類型支持37 HYPERLINK l _bookmark41 編寫嵌入式程序的注意事項(xiàng)39 HYPERLINK l _bookmark42 ORACLE 兼容41 HYPERLINK l _bookmark43 簡單的 ORACLE 嵌入式程序結(jié)構(gòu)分析41 HYPERLINK l _bookmark44 SQLDA/SQLCA48 HYPERLINK l _bookmark45 可執(zhí)行的 SQL 語句52 HYPERLINK l _bookmark46 預(yù)編譯命令 OPTIO
9、N53 HYPERLINK l _bookmark47 數(shù)據(jù)類型映射54 HYPERLINK l _bookmark48 DB2 兼容56 HYPERLINK l _bookmark49 簡單的 DB2 嵌入式程序結(jié)構(gòu)分析56 HYPERLINK l _bookmark50 SQLDA/SQLCA58 HYPERLINK l _bookmark51 可執(zhí)行的 SQL 語句59 HYPERLINK l _bookmark52 數(shù)據(jù)類型映射59 HYPERLINK l _bookmark53 DM 嵌入式 SQL 高級功能61 HYPERLINK l _bookmark54 SSL 連接61 HY
10、PERLINK l _bookmark55 PL/SQL 塊62 HYPERLINK l _bookmark56 使用大字段句柄處理 LOB 類型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 語法79 HYPERLINK l _bookmark64 使用結(jié)構(gòu)數(shù)組80 HYPERLINK l _bookmark65 動(dòng)態(tài) SQL 語句83 HYPERLINK l _bookmark66 DM 動(dòng)態(tài) SQL 語句84 HYPERLINK l _bookmark68 ANSI 動(dòng)態(tài) SQL 語句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 編寫與 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 語句111 HYPERLINK l _bookmark82 插入、更新、刪除語句111 HYPERLINK l _bookmark83 插入語句111 HYPERLINK l _bookmark84 更新語句112 HYPERLINK l _bookmark85 刪除語句115 HYPERLINK l _bookmark86 日期、時(shí)間數(shù)據(jù)類型的使用116 HYPERLINK l _bookmark87 7.4 多線程
14、118 HYPERLINK l _bookmark88 附錄 PRO*C 錯(cuò)誤碼匯編123DM8_PRO*C 使用手冊 PAGE 109概述本章概要介紹PRO*C 與嵌入式SQL 的基本概念,以及 PRO*C 程序的工作機(jī)制即 DM的預(yù)編譯系統(tǒng)。功能簡介SQL 語言作為結(jié)構(gòu)化的查詢語言,可以完成對數(shù)據(jù)庫的定義、查詢、更新、控制、維護(hù)、恢復(fù)、安全管理等一系列操作,充分體現(xiàn)了關(guān)系數(shù)據(jù)庫的特征。但 SQL 語言是非過程性語言,本身沒有過程性結(jié)構(gòu),大多數(shù)語句都是獨(dú)立執(zhí)行,與上下文無關(guān),而絕大多數(shù)完整的應(yīng)用都是過程性的,需要根據(jù)不同的條件來執(zhí)行不同的任務(wù)。因此,單純用 SQL 語言很難實(shí)現(xiàn)這樣的應(yīng)用。為
15、此,DM 數(shù)據(jù)庫提供了SQL 的兩種使用方式:一種是交互方式,另一種是嵌入方式。嵌入方式是將SQL 語言嵌入到高級語言中,這樣一來,既發(fā)揮了高級語言數(shù)據(jù)類型豐富、處理方便靈活的優(yōu)勢,又以 SQL 語言彌補(bǔ)了高級語言難以描述數(shù)據(jù)庫操作的不足,從而為用戶提供了建立大型管理信息系統(tǒng)和處理復(fù)雜事務(wù)所需要的工作環(huán)境。在這種方式下使用的SQL 語言稱為嵌入式 SQL,而嵌入 SQL 的高級語言稱為主語言或宿主語言。DM 數(shù)據(jù)庫允許 C 作為嵌入方式的主語言。在 DM 系統(tǒng)中,我們將嵌有 SQL 語句的 C 語言程序稱為PRO*C 程序。嵌入在主語言程序中的SQL 語句并不能直接被主語言編譯程序識(shí)別,必須對
16、這些SQL 語句進(jìn)行預(yù)處理,將其翻譯成主語言語句,生成由主語言語句組成的目標(biāo)文件,然后再由編譯程序編譯成可執(zhí)行文件,執(zhí)行該文件,方可得到用戶所需要的結(jié)果。DM 的PRO*C 嵌入工作方式支持的功能如下:支持國家和軍用標(biāo)準(zhǔn)關(guān)系數(shù)據(jù)庫語言 SQL;支持嵌入SQL 語言的多模塊程序設(shè)計(jì);提供對用戶透明的查詢優(yōu)化功能;支持對遠(yuǎn)程數(shù)據(jù)庫的訪問。預(yù)編譯系統(tǒng)的結(jié)構(gòu)與功能預(yù)編譯系統(tǒng)的結(jié)構(gòu)預(yù)編譯系統(tǒng)的結(jié)構(gòu)如下圖所示。預(yù)編譯系統(tǒng)詞法分析子系統(tǒng)語法分析子系統(tǒng)消息生成模塊圖 1.1 預(yù)編譯系統(tǒng)的結(jié)構(gòu)預(yù)編譯系統(tǒng)的功能預(yù)編譯系統(tǒng)主要包括詞法分析、語法分析、消息生成等幾個(gè)子系統(tǒng)。詞法分析子系統(tǒng)在嵌入工作方式下,詞法分析子系
17、統(tǒng)從指定的主語言源程序中逐段找出嵌入的 SQL 聲明節(jié)或語句段,將它們進(jìn)行分解,得到一個(gè)個(gè)單詞,順序填入單詞表,供語法分析時(shí)使用; 而對非 SQL 嵌入段的主語言正文則直接寫入目標(biāo)文件。在交互工作方式下,詞法分析子系統(tǒng)只需要接受用戶輸入的單個(gè) SQL 語句或 SQL 語句塊,將它們分解成單詞串并順序填入單詞表。語法分析子系統(tǒng)語法分析子系統(tǒng)在詞法分析的基礎(chǔ)上,對單詞表中所存入的SQL 單詞串按 SQL 語言文本進(jìn)行初步的合法性檢查,并對各種單詞進(jìn)行分類,識(shí)別語句中的嵌入變量并進(jìn)行相應(yīng)的語法檢查。消息生成模塊在 DM 中,客戶端對數(shù)據(jù)庫的操作都是以消息方式傳送給數(shù)據(jù)庫服務(wù)器,因此預(yù)編譯系統(tǒng)應(yīng)具有將
18、 SQL 語句轉(zhuǎn)換為消息的功能,這就是消息生成。消息生成的任務(wù)是將SQL 語句翻譯成主語言消息生成語句和消息發(fā)送及回收語句,并將它們寫入目標(biāo)文件。需要說明的是,預(yù)編譯系統(tǒng)并不直接生成消息,而是利用對DPI 接口的函數(shù)調(diào)用實(shí)現(xiàn),這樣可以進(jìn)行必要的封裝,模塊性也更強(qiáng)。預(yù)編譯系統(tǒng)的處理流程在嵌入工作方式下,預(yù)編譯系統(tǒng)的功能是:對嵌入的 SQL 語句段和 SQL 聲明節(jié)進(jìn)行全面的詞法、語法檢查,然后將SQL 語句翻譯成主語言語句(即 DPI 函數(shù)調(diào)用)寫入目標(biāo)文件中,使目標(biāo)文件成為一個(gè)純由主語言組成的程序。整個(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í)需要的庫文件 dmdpc.lib(Windows 操作系統(tǒng))或者 libdmdpc.a(Linux);執(zhí)行時(shí)需要的動(dòng)態(tài)庫文件 dmdpc.dll(Windows 操作系統(tǒng))或者libdmdpc.so(Linux)。預(yù)編譯命令的使用方法預(yù)編譯時(shí),
20、在命令提示符窗口中輸入帶參數(shù)的 dpc_new 命令,語法如下:dpc_new parameter=value parameter=valuedpc_new 支持的參數(shù)含義如下表所示。表 1.1 dpc_new 參數(shù)參數(shù)介紹FILE.pc 文件的完整路徑,必須指定TYPE指定生成文件類型。C 代表 C 源文件,CPP 代表 C+源文件;默認(rèn)為 CMODE編譯模式。STD 表示標(biāo)準(zhǔn)編譯模式;DM 表示達(dá)夢編譯模式;ORACLE 表示兼容部分 ORACLE 語法的編譯模式;DB2 表示兼容部分 DB2 語法的編譯模式。默認(rèn) STD 編譯模式MACRO解析宏,如果源 pc 文件中有#define 定
21、義的宏,在文件中使用了宏,若不加此命令,文件中的宏將不能識(shí)別DEFINE條件編譯宏,如果源 pc 文件中有#defWIN32 等條件編譯宏,可以根據(jù)需要在 DEFINE 命令中設(shè)置對應(yīng)的條件編譯宏,來解析對應(yīng)的內(nèi)容INCLUDE_DIR包含的頭文件目錄,指定 pc 文件中 include 的頭文件所在的目錄WRITE_DIRECT解析的文件是否立即可見,缺省為 N。當(dāng)為 N 時(shí),dpc_new 工具解析 pc 文件時(shí)解析完部分就會(huì)立即寫入 C 文件;當(dāng)為 Y 時(shí),整個(gè) pc 文件解析完,才會(huì)一起寫入生成的 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 本例說明如何根據(jù)設(shè)置的 define 命令,來解析對應(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”部分。若沒有使用 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;本例說明MACRO 參數(shù)的作用。假設(shè)原始文件test.pc 內(nèi)容如下#include dpc_dll.h如果編譯命令中不加 MACRO=Y,那么在嵌入式 SQL 語句中使用 buffer 變量就無法識(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 類型,如下所示:因此,如果 64 位環(huán)境下編譯應(yīng)用時(shí)沒加
27、 DM64 宏,會(huì)導(dǎo)致 DPI 接口調(diào)用異常。預(yù)編譯概念本章主要介紹嵌入式 SQL 中的一些關(guān)鍵概念與術(shù)語,并簡單介紹了開發(fā) PRO*C 程序的步驟。本文檔中從本章開始的所有示例,除了例子中特別建的表外,其余都使用 DM 示例庫中的表。嵌入式 SQL 關(guān)鍵概念嵌入式 SQL 語句嵌入式 SQL 是指在應(yīng)用程序里直接嵌入 SQL 語句。因?yàn)榍度?SQL,應(yīng)用程序又叫宿主程序,編寫應(yīng)用程序的高級語言又叫宿主語言。例如,PRO*C/C+能夠在 C 和 C+宿主程序嵌入一些 SQL 語句??汕度氲腟QL 語句包括 DDL 與DML 語句,以及一些事務(wù)控制語句,這些語句都是嵌入的可執(zhí)行語句。可執(zhí)行語句在
28、編譯時(shí)會(huì)調(diào)用 libdmdpc.so 庫接口,通過它們連接數(shù)據(jù)庫,進(jìn)行數(shù)據(jù)定義及查詢操作數(shù)據(jù)庫數(shù)據(jù),以及處理事務(wù),它們能存在 C/C+語言中任何可執(zhí)行語句能嵌入的地方。表 2.1 列出了常用的嵌入可執(zhí)行語句。表 2.1 常用的嵌入可執(zhí)行語句可執(zhí)行語句作用ALLOCATE初始化變量ALTER,CREATE TABLEDDLDELETE,UPDATE, INSERT,SELECTDMLCOMMIT,ROLLBACK,SAVEPOINT,SET TRANSACTION事務(wù)控制DESCRIBE,EXECUTE,PREPARE動(dòng)態(tài) SQL除了可執(zhí)行語句,可嵌入 SQL 還包括一些在宿主程序與 DM 數(shù)據(jù)
29、庫之間傳輸數(shù)據(jù)的指令。這些指令在編譯時(shí)不需要調(diào)用 libdmdpc.so 庫接口,也不會(huì)操作數(shù)據(jù)庫數(shù)據(jù),用戶可以使用它們聲明通信區(qū)域和宿主變量。表 2.2 列出了常用的嵌入指令。指令作用表 2.2 常用的嵌入指令BEGIN DECLARE SECTIONEND DECLARE SECTION聲明宿主變量INCLUDE包含其他文件TYPE類型定義WHENEVER捕獲運(yùn)行錯(cuò)誤嵌入式 SQL 語法在 PRO*C 程序中能夠自由地使用 SQL 語句與 C 語句,也可以在 SQL 語句中使用 C 變量和結(jié)構(gòu)。在 PRO*C 中使用 SQL 語句必須在 SQL 語句前加上關(guān)鍵字“EXEC SQL”并且以分
30、號結(jié)束。DM 的預(yù)編譯命令行運(yùn)行程序 dpc_new 將所有帶有“EXEC SQL”的語句轉(zhuǎn)換為對 libdmdpc.so 庫中接口的調(diào)用。EXEC SQL COMMIT;-嵌入式-交互式COMMIT;許多嵌入式 SQL 語句與交互式 SQL 語句的區(qū)別只在于能夠使用程序變量或者是增加了額外的“EXEC SQL”關(guān)鍵字,下面的例子比較了交互式與嵌入式 COMMIT 語句的區(qū)別,他們的作用是一樣的。靜態(tài) SQL 與動(dòng)態(tài) SQL大多數(shù)程序使用靜態(tài)的SQL 處理固定的語句,在這種情況下,你必須在運(yùn)行前事先知道 SQL 語句和事務(wù)的組成,以及哪些 SQL 命令會(huì)被執(zhí)行,哪些表的結(jié)構(gòu)會(huì)變動(dòng),哪些列會(huì)被更
31、新等等。然而,在某些情況下可能要在運(yùn)行時(shí)才能確定要執(zhí)行的有效的 SQL 語句,因此你在運(yùn)行前可能不知道所有的SQL 命令、數(shù)據(jù)庫表、牽涉到的列等,只有在程序執(zhí)行時(shí)才能構(gòu)造出完整的SQL。動(dòng)態(tài) SQL 是一種高級編程技術(shù),能夠讓程序在運(yùn)行時(shí)處理執(zhí)行過程中臨時(shí)生成的 SQL 語句。嵌入 PL/SQL 塊PRO*C 把 PL/SQL 語句塊視作單一的嵌入 SQL 語句,任何 SQL 語句能嵌入的地方也能嵌入 PL/SQL 塊。在宿主程序中嵌入PL/SQL 塊,必須使用關(guān)鍵字 EXEC SQL EXECUTE 和 END-EXEC 將 PL/SQL 語句塊括起來。宿主變量與指示符宿主變量是數(shù)據(jù)庫與應(yīng)用
32、程序聯(lián)系的關(guān)鍵,宿主變量是在 C 中聲明的 SQL 與 C 程序都能使用的變量。程序使用輸入宿主變量向數(shù)據(jù)庫傳遞數(shù)據(jù),數(shù)據(jù)庫使用輸出宿主變量傳輸數(shù)據(jù)或其他狀態(tài)信息給應(yīng)用程序。宿主變量能夠在任何 SQL 表達(dá)式可以使用的地方使用。在SQL 語句中,宿主變量必須以“:”作為前綴以便于同關(guān)鍵字區(qū)分開來。應(yīng)用程序中也能用結(jié)構(gòu)來包含多個(gè)宿主變量,在 SQL 語句中使用結(jié)構(gòu)時(shí)也要用“:”作為前綴,DM 會(huì)把結(jié)構(gòu)里的每個(gè)成員都當(dāng)宿主變量處理。每個(gè)宿主變量后都能跟一個(gè)指示符變量。指示符變量是一個(gè)整型的宿主變量,其作用 是用來指示宿主變量的取值情況。在 SQL 語句中,指示符變量必須加上“:”前綴并且只能緊跟在
33、它指示的宿主變量后面??梢栽谒拗髯兞颗c指示變量中間加上關(guān)鍵字 INDICATOR 使含義更明確,也可以省略。如果宿主變量是定義在結(jié)構(gòu)體中,你只需要定義一個(gè)指示符的結(jié)構(gòu),里面的指示變量與宿主結(jié)構(gòu)中的宿主變量一一對應(yīng),再在 SQL 語句使用指示結(jié)構(gòu)即可。與非結(jié)構(gòu)指示變量一樣,也需要緊跟在宿主結(jié)構(gòu)之后,且前綴加上“:”,也可在中間加上關(guān)鍵字INDICATOR。DM 數(shù)據(jù)類型一般來說,應(yīng)用程序輸入數(shù)據(jù)到數(shù)據(jù)庫,數(shù)據(jù)庫輸出數(shù)據(jù)到程序。數(shù)據(jù)庫將輸入的數(shù)據(jù)存儲(chǔ)到到表中,輸出數(shù)據(jù)存放到宿主變量里。存儲(chǔ)數(shù)據(jù)必須知道數(shù)據(jù)類型,以確定存儲(chǔ)格式。數(shù)據(jù)在DM 數(shù)據(jù)庫表中的存儲(chǔ)格式為DM 內(nèi)部數(shù)據(jù)類型;數(shù)據(jù)在宿主變量中的
34、存儲(chǔ)格式為外部數(shù)據(jù)類型。DM 數(shù)據(jù)庫能同時(shí)識(shí)別這兩種數(shù)據(jù)類型,且在二者間進(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ù)的概念,可以通過 COMMIT、ROLLBACK、SAVEPOINT 等語句對事務(wù)進(jìn)行控制。錯(cuò)誤與警告當(dāng)嵌入式 SQL 執(zhí)行出錯(cuò)或產(chǎn)生警告時(shí),PRO*C 提供了三種方法來捕獲錯(cuò)誤與警告:SQLCA 結(jié)構(gòu)、WHENEVER 語句、SQLCODE 與SQLSTATE。具體使用方法見后面章節(jié)介紹。開發(fā)嵌入式程序的步驟
35、舉例說明嵌有 SQL 語句的 C 語言程序PRO*C 的運(yùn)行過程:編寫嵌有SQL 語句的源程序 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。程序編寫本節(jié)簡單介紹一些嵌入式程序編寫的語法、慣例、限制等,具體在后續(xù)章節(jié)中會(huì)有詳細(xì)介紹。程序注釋可以在嵌入的
36、 SQL 語句中使用 C 類型注釋(/*/),也可以在一行的結(jié)尾使用ANSI 標(biāo)準(zhǔ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;”語句開始,以“EXEC SQLEND DECLARE SECTION;”結(jié)束。在聲明節(jié)中能夠存在的內(nèi)容包括有以下語句:宿主變量與指示符變量的定義非宿主的 C 變量C 的注釋EXEC SQL TYPE 語句引號EXEC SQL SELECT NAME, SEX FROM EMP WHERE PHONE = 123456789;C 使用單引號表示單個(gè)字符,SQL 使用單引號界定字符串,例如:C 使用雙引號界定字符串,SQL 使用雙引號界定包含小寫或特殊字符的標(biāo)識(shí)符,例如:EXEC SQL CREATE TABLE test(c
38、1 INT);行延長EXEC SQL INSERT INTO PERSON.PERSON (NAME, PHONE) VALUES (XQ, 123456);在 SQL 語句中能夠使用反斜杠延長一行字符串到另一行,例如:嵌入式程序的組成一個(gè)簡單的嵌入式程序結(jié)構(gòu)分析首先,從一個(gè)簡單的程序入手來認(rèn)識(shí)嵌入式程序的組成和基本語法。/* 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ù)庫*/EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;/*對數(shù)據(jù)庫操
40、作 */EXEC SQL SELECT name, phoneINTO :person_name,:person_phone FROM person.person例如,下面是一個(gè)名為 test.pc 的簡單的嵌入式程序。這個(gè)程序查詢并輸出“人員信息”表中人員編號為“1”的人員姓名和聯(lián)系電話。WHERE personid = 1;printf(n 對應(yīng)的人員姓名為: %sn, person_name); printf(n 對應(yīng)的聯(lián)系電話為: %sn, person_phone);/*退出數(shù)據(jù)庫*/ EXEC SQL LOGOUT;一般說來,pc 文件由以下幾個(gè)部分構(gòu)成:宿主變量定義EXEC SQ
41、L BEGIN DECLARE SECTION;EXEC SQL END DECLARE SECTION;在上面的例子中,宿主變量定義為嵌入在如下語句中的部分:登錄數(shù)據(jù)庫EXEC SQL LOGIN :username PASSWORD :password SERVER :servername;數(shù)據(jù)庫操作登錄成功之后,就可以對數(shù)據(jù)庫進(jìn)行各種操作。退出登錄EXEC SQL LOGOUT;下面將對以上各部分加以詳細(xì)說明。宿主變量的定義嵌入的 SQL 語句可以使用主語言的變量來輸入/輸出數(shù)據(jù)。例如在 SELECT 語句中, 需要將查找到的數(shù)據(jù)通過 INTO 子句送到某些變量中,或者 WHERE 子句
42、需要用某些變量的值作條件。我們稱SQL 語句中使用到的變量為宿主變量。在SQL 中所使用的宿主變量均必須在嵌入的 SQL 聲明節(jié)中加以說明。聲明節(jié)語句聲明節(jié)開始語句語法:EXEC SQL BEGIN DECLARE SECTION;功能:表示聲明節(jié)的開始。使用說明:后面必須有一個(gè)聲明節(jié)結(jié)束語句與之相對應(yīng)。聲明節(jié)結(jié)束語句語法:EXEC SQL END DECLARE SECTION;功能:表示聲明節(jié)的結(jié)束。使用說明:前面必須有一個(gè)聲明節(jié)開始語句與之相對應(yīng)。使用聲明節(jié)應(yīng)注意的問題在聲明節(jié)開始語句與結(jié)束語句中間,采用 C 語言定義變量的方式定義宿主變量。在聲明節(jié)中定義的變量可以被 C 語句使用,而不
43、必在聲明節(jié)之外重新定義這些變量,否則會(huì)引起變量重復(fù)定義的錯(cuò)誤。一個(gè)程序模塊中可以出現(xiàn)多個(gè)聲明節(jié),各個(gè)聲明節(jié)可以出現(xiàn)在 C 程序的說明語句可出現(xiàn)的位置上。PRO*C 規(guī)定,一個(gè)模塊中所有的聲明節(jié)中的宿主變量不得同名,而不論其實(shí)質(zhì)是全局變量還是局部變量。預(yù)編譯時(shí),相應(yīng)聲明節(jié)的 C 語句是去掉了“EXECSQL BEGIN DECLARE SECTION”和“EXEC SQL END DECLARE SECTION”兩個(gè)語句后的變量定義語句,其位置順序均保持不變。常規(guī)數(shù)據(jù)類型變量的定義在聲明節(jié)中,可以使用的常規(guī)數(shù)據(jù)類型包括:char、short、int、long、float、double 等C 數(shù)據(jù)
44、類型。定義這些類型變量的方法與 C 語言定義相應(yīng)變量的方法基本上是相同的。由于 DM 采用的是一次一個(gè)元組的處理方式,因而限制了數(shù)組的定義和使用,即不能使用數(shù)組的某個(gè)元素。作為一種特例,在聲明節(jié)中定義字符數(shù)組,作為字符串指針使用。如: char name20等價(jià)于 char *name ,其中 name 是指向長度為 20 個(gè)字節(jié)空間的字符指針(等價(jià)于指針變量)。在定義常規(guī)類型的變量時(shí),與 C 語言一樣,可以加上存儲(chǔ)類型修飾符,包括 extern、static 和auto。定義語句的語法如下::=:= ,.:=extern|static|auto:= char | short | int |
45、long | float | double 等:= = := | * | 無符號整數(shù)例如:EXEC SQL BEGIN DECLARE SECTION;char shop_no20,shop_name20; short flag;EXEC SQL END DECLARE SECTION;常規(guī)數(shù)據(jù)類型變量定義。預(yù)編譯后,產(chǎn)生的結(jié)果為:char shop_no20,shop_name20; short flag;宿主變量的使用常規(guī)使用方法在 SQL 語句中引用的宿主變量都應(yīng)在聲明節(jié)中定義,而且定義應(yīng)先于引用。在 SQL 語句中使用宿主變量時(shí),在引用的宿主變量名前必須加上并且只能加上冒號“:”,而不
46、論說明該變量時(shí)變量名前有無“*”,或者是否采用數(shù)組形式。在 C 語句中使用宿主變量時(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);查詢?nèi)藛T編號為“1”的人員姓名及聯(lián)系電話。執(zhí)行結(jié)果:李麗 02788548562指示符的使用在 SQL 語句中,在一個(gè)宿主變量之后,可以再跟一個(gè)數(shù)據(jù)類型為整型 (short, long,int) 的被稱為指示變量的宿主變量,其作用是指明該變量之前的一個(gè)宿主變量的取值情況。具體地說,它有如下兩個(gè)作用,分別舉例說明:指示 SQL 語句中輸入變量的值是否為空值。例如: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);/*該語句等價(jià)于:EXEC SQL INSERT INTO person.pe
49、rson (name, phone) VALUES(李麗, NULL);*/使用指示變量插入空值。利用預(yù)置指示變量的值為-1,表明插入一個(gè)空值。在前一種插入語句中,person_phone 帶指示變量 value_indicator,由于value_indicator 的值為-1,盡管 person_phone 的值為 02788548562,系統(tǒng)仍不使用該值作插入值,而認(rèn)為 person_phone 的插入值為空。如果希望 person_phone 的插入值為 02788548562,只需改變 value_indicator 的值為 0 即可。在后一個(gè)插入語句中,person_phone 未
50、使用指示變量,它的插入值在插入語句中固定為 NULL,如果希望 person_phone 的插入值為 02788548562,則要修改該插入語句。因此,前一種使用指示變量的方法比后一種方法靈活,同時(shí)也給用戶編程帶來方便。指示執(zhí)行 SQL 語句后,返回結(jié)果是否為空值或有截取等情況。在 INTO 子句中,使用指示變量表明該 SQL 語句執(zhí)行時(shí),對被指示的宿主變量的賦值情況。一個(gè)指示變量的取值有三種:取值為 0,說明返回值非空且賦給宿主變量時(shí)不發(fā)生截舍; 取值為-1,說明返回的值為空值;取值0,說明返回的值為非空值,但在賦給宿主變量時(shí), 字符串的值被截舍,這時(shí)指示變量的值為截?cái)嘀暗拈L度。使用宿主變
51、量應(yīng)注意的問題宿主變量的命名是有大小寫區(qū)別的。字符序列相同,大小寫不同的變量名代表不同的變量。宿主變量的命名不應(yīng)是 C 語句的關(guān)鍵字,以免產(chǎn)生誤用或錯(cuò)誤。使用宿主變量時(shí)應(yīng)注意:SQL 語句引用一個(gè)宿主變量時(shí),宿主變量名前加一個(gè)冒號;C 語句中使用宿主變量時(shí), 不加冒號;引用宿主變量時(shí),可以使用一個(gè)相關(guān)的指示變量。另外,由于 C 語言所允許的數(shù)據(jù)類型與 SQL 語言所采用的數(shù)據(jù)類型有一定的差別,因而在輸入輸出數(shù)據(jù)時(shí),在兩種數(shù)據(jù)類型之間要做一定的轉(zhuǎn)換工作。DM 支持BYTE、NUMERIC 與 short、int、float、double 之間的轉(zhuǎn)換,但應(yīng)注意數(shù)據(jù)轉(zhuǎn)換時(shí)產(chǎn)生的溢出問題。VARCHA
52、R 宿主變量的使用可以使用VARCHAR 類型聲明可變長度的字符串,如果需要處理VARCHAR 類型列的數(shù)據(jù)的輸入輸出,使用 VARCHAR 類型變量比使用 C 字符串類型會(huì)更加方便?!癡ARCHAR” 可以是大寫也可以是小寫,但是不能大小寫混用。VARCHAR 類型經(jīng)過預(yù)編譯被轉(zhuǎn)換為 C 的結(jié)構(gòu)。VARCHARusername20;例如:經(jīng)過預(yù)編譯后轉(zhuǎn)換成:structunsigned shortlen; unsigned chararr20; username;其中l(wèi)en 是數(shù)據(jù)的實(shí)際長度,arr 存放的是字符串的數(shù)據(jù)。在 SQL 語句中使用EXEC SQL SELECT NAME INT
53、O :username FROM PERSON.PERSON;VARCHAR 宿主變量與使用 C 類型宿主變量一樣。例如:游標(biāo)變量的使用游標(biāo)在 PRO*C 中作為一種對象變量使用,具體的使用方法見第 6.4 節(jié)介紹。CONTEXT 變量運(yùn)行上下文 CONTEXT 變量實(shí)際上是一個(gè)句柄,指向客戶端內(nèi)存的一段區(qū)域,對應(yīng)一個(gè)DM8 數(shù)據(jù)庫連接,包含 0 個(gè)或多個(gè)游標(biāo)的狀態(tài)與信息等。使用CONTEXT 變量一般包括以下幾個(gè)步驟:sql_context my_context ;使用sql_context 定義上下文宿主變量例如:EXEC SQL CONTEXT ALLOCATE :my_context
54、;使用ALLOCATE 語句初始化 context 變量例如:使用context 變量,context 使用后直到下一個(gè) CONTEXT USE 才會(huì)切換到新的上下文。EXEC SQL CONTEXT USE :my_context ;例如:使用FREE 語句釋放 context 變量例如:EXEC SQL CONTEXT FREE :my_context ;CONTEXT 變量的具體使用可參看后續(xù)“多線程支持”章節(jié)。結(jié)構(gòu)宿主變量可以在嵌入式程序中定義 C 結(jié)構(gòu)宿主變量,然后在SQL 語句中引用結(jié)構(gòu)變量,需要注意結(jié)構(gòu)中的成員必須與查詢或插入SQL 語句中表達(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ù)組,這樣用來批量執(zhí)行,可同時(shí)操作多行。例 2:一次向 PERSON 表插入三行數(shù)據(jù)。當(dāng)需要使用指示符變量時(shí),由于宿主變量都包含在結(jié)構(gòu)里,所以必須再定義一個(gè)結(jié)構(gòu)包含各個(gè)宿主變量對應(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 宜賓市荒山土地承包合同范本
- 動(dòng)漫作品授權(quán)合作合同范本
- 企業(yè)用人正式合同范例
- 淺析京劇發(fā)聲與民歌唱法美聲唱法的關(guān)系
- 加盟押金店合同范例
- 2025年度市政道路施工建設(shè)投資合作協(xié)議
- MW光伏電站項(xiàng)目EC總承包合同范本
- 三方合租協(xié)議合同范本
- 制砂機(jī)租賃合同范本
- 保險(xiǎn)內(nèi)勤銷售合同范例
- 餐飲服務(wù)與管理(高職)PPT完整全套教學(xué)課件
- 成人學(xué)士學(xué)位英語1000個(gè)高頻必考詞匯匯總
- 2023年菏澤醫(yī)學(xué)專科學(xué)校單招綜合素質(zhì)模擬試題及答案解析
- 常見食物的嘌呤含量表匯總
- 人教版數(shù)學(xué)八年級下冊同步練習(xí)(含答案)
- SB/T 10752-2012馬鈴薯雪花全粉
- 2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語)試題庫含答案解析
- 濕型砂中煤粉作用及檢測全解析
- 積累運(yùn)用表示動(dòng)作的詞語課件
- 機(jī)動(dòng)車登記證書英文證書模板
- 第8課《山山水水》教學(xué)設(shè)計(jì)(新人教版小學(xué)美術(shù)六年級上冊)
評論
0/150
提交評論