ESQLC培訓(xùn)教材_第1頁(yè)
ESQLC培訓(xùn)教材_第2頁(yè)
ESQLC培訓(xùn)教材_第3頁(yè)
ESQLC培訓(xùn)教材_第4頁(yè)
ESQLC培訓(xùn)教材_第5頁(yè)
已閱讀5頁(yè),還剩8頁(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)介

1、ESQL/C 編編程程培培訓(xùn)訓(xùn)教教材材ESQL/C 編程培訓(xùn)教材版本:1.0.1 - -目目 錄錄編寫說(shuō)明編寫說(shuō)明.1目目 錄錄.I1. 概述概述.11.1. SQL語(yǔ)句嵌入方法.11.2. 宿主變量.11.3. 頭文件.21.4. 錯(cuò)誤診斷.21.5. ESQL/C程序的編譯.42. C 語(yǔ)言程序中嵌入的語(yǔ)言程序中嵌入的 SQL 語(yǔ)句語(yǔ)句.52.1. 有關(guān)數(shù)據(jù)庫(kù)和表的權(quán)限.52.1.1. 選擇數(shù)據(jù)庫(kù)(DATABASE).52.1.2. 關(guān)閉數(shù)據(jù)庫(kù)(CLOSE DATABASE).52.1.3. 創(chuàng)建表(CREATE TABLE).52.1.4. 刪除表(DROP TABLE).52.2. 數(shù)

2、據(jù)查詢語(yǔ)句SELECT.52.3. 插入語(yǔ)句INSERT.72.4. 數(shù)據(jù)修改語(yǔ)句UPDATE.72.5. 數(shù)據(jù)刪除語(yǔ)句DELETE.72.6. PREPARE語(yǔ)句.83. 游標(biāo)游標(biāo).83.1. 滾動(dòng)游標(biāo).83.1.1. DECLARE.83.1.2. OPEN.83.1.3. FETCH .93.1.4. CLOSE .103.1.5. FREE .103.2. 更新游標(biāo).10ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 0 -1. 概述概述1.1. SQL語(yǔ)句嵌入方法語(yǔ)句嵌入方法任何可以交互式輸入的SQL語(yǔ)句,例如數(shù)據(jù)定義語(yǔ)句、數(shù)據(jù)檢索語(yǔ)句、數(shù)據(jù)控制語(yǔ)句等,都可以嵌入到C程序中??梢允褂?/p>

3、兩種方法指明SQL語(yǔ)句:一種是在SQL語(yǔ)句之前用“$”作為前綴,如:#include main()$ database book;$ delete from book where book_num=100;另一種是在SQL語(yǔ)句之前使用ANSI標(biāo)準(zhǔn)的EXEC SQL關(guān)鍵字來(lái)標(biāo)識(shí),如:#include main()EXEC SQL database book;EXEC SQL delete from book where book_num=100;1.2. 宿主變量宿主變量SQL 語(yǔ)句中可以有變量,變量可以出現(xiàn)在交互式 SQL 語(yǔ)句中常量可以出現(xiàn)的任何位置,SQL 語(yǔ)句中的這種變量稱為宿主變量。I

4、NFORMIX-ESQL/C 程序通過(guò)宿主變量在 C 語(yǔ)句和 SQL 語(yǔ)句中傳遞數(shù)據(jù)。一般情況下,在宿主變量前加“:” 。如:ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 1 -EXEC SQL update book set book_price = :fNewPrice;在定義宿主變量時(shí)也需要使用如下聲明語(yǔ)句,EXEC SQL BEGIN DECLARE SECTION; int iNumber;char name10;struct student int no;char name10; stu;EXEC SQL END DECLARE SECTION;另外,宿主變量可以像 C 語(yǔ)言變量

5、一樣用在 C 語(yǔ)言表達(dá)式中,如:EXEC SQL BEGIN DECLARE SECTION; char dbname11;EXEC SQL END DECLARE SECTION;gets( dbname, 80 );EXEC SQL database :dbname;1.3. 頭文件頭文件INFORMIX-ESQL/C 提供了許多頭文件,其中最常用的是 sqlca.h,它用于確定 SQL 語(yǔ)句的返回值和 SQL 語(yǔ)句執(zhí)行后的其他信息,在 ESQL/C 程序中是必須包含的,包含方法是“EXEC SQL include sqlca;” 。另外,如果自定義的頭文件中包含 SQL 語(yǔ)句或宿主變量的

6、定義,也必須用同樣的方法進(jìn)行說(shuō)明,如:EXEC SQL include filename。如果源文件在某個(gè)路徑下,應(yīng)將其用引號(hào)括起來(lái),如:#include EXEC SQL include sqlca;EXEC SQL include xyz.h;EXEC SQL include /users/test/test.h;ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 2 -1.4. 錯(cuò)誤診斷錯(cuò)誤診斷在 INFORMIX-ESQL/C 程序中執(zhí)行一條 SQL 語(yǔ)句時(shí),數(shù)據(jù)庫(kù)服務(wù)器會(huì)返回幾種信息,反映 SQL 語(yǔ)句的執(zhí)行情況,包括: 該 SQL 語(yǔ)句的完成狀況; 有關(guān)性能的信息; 有關(guān)可能發(fā)生或已經(jīng)

7、發(fā)生的事情的警告。這些返回信息傳送到一個(gè)稱為 sqlca 的結(jié)構(gòu)中,該結(jié)構(gòu)定義在 sqlca.h 中:struct sqlca_slongsqlcode;charsqlerrm72;charsqlerrp8;longsqlerrd6;struct sqlcaw_scharsqlwarn0;charsqlwarn1;charsqlwarn2;charsqlwarn3;charsqlwarn4;charsqlwarn5;charsqlwarn6;charsqlwarn7; sqlwarn; sqlca;上述 sqlca 結(jié)構(gòu)中的信息反映了 INFORMIX-ESQL/C 語(yǔ)句執(zhí)行后的情況:成功或異

8、常,其中異常情況包括三種:(1) 執(zhí)行成功,但沒(méi)有找到記錄;(2) 執(zhí)行成功,但出現(xiàn)警告信息;(3) 執(zhí)行結(jié)果失敗??赏ㄟ^(guò) sqlcode 來(lái)檢測(cè) SQL 語(yǔ)句的執(zhí)行結(jié)果,其含義如下: sqlcode=0 時(shí),說(shuō)明語(yǔ)句執(zhí)行成功;ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 3 - sqlcode=100,說(shuō)明在執(zhí)行 Select 或 Fetch 查找操作后返回零記錄,在 sqlca.h 中將宏 SQLNOTFOUND 定義為 100; sqlcode0 時(shí),說(shuō)明 SQL 語(yǔ)句執(zhí)行后有錯(cuò)誤發(fā)生以下是一個(gè)簡(jiǎn)單的 ESQL/C 程序:1.5. ESQL/C程序的編譯程序的編譯用 INFORMIX-

9、ESQL/C 語(yǔ)句編寫的程序在使用 C 編譯程序之前必須預(yù)處理,預(yù)處理程序把嵌入的語(yǔ)句轉(zhuǎn)換成 C 語(yǔ)言程序。INFORMIX-ESQL/C 提供了編譯命令 esql,用來(lái)編譯 INFORMIX-ESQL/C#include EXEC SQL include sqlca;main()EXEC SQL BEGIN DECLARE SECTION;char fname15;char lname20;EXEC SQL END DECLARE SECTION;int i;printf( This is a ESQL/C Program!n );EXEC SQL database book;EXEC SQ

10、L declare democursor cursor forselect fname,lname into :fname, :lnamefrom booknamewhere lnameC;EXEC SQL open democursor;for( ; ; ) EXEC SQL fetch democursor;if ( sqlca.sqlcode )break;printf( %s%sn, fname, lname );$close demecursor;printf( nProgram Over.n );ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 4 -源代碼,這些源代碼的名稱必須具有

11、.ec 后綴才能進(jìn)行轉(zhuǎn)換。轉(zhuǎn)換后的結(jié)果存在與源文件同名但后綴為“.c”的文件中,然后調(diào)用 C 編譯器將.c 文件轉(zhuǎn)換成以.o為后綴的目標(biāo)文件,最后調(diào)用 C 語(yǔ)言標(biāo)準(zhǔn)庫(kù)和 INFORMIX-ESQL/C 庫(kù)以及用戶自己所鏈接的庫(kù)生成可執(zhí)行文件。2. C語(yǔ)言程序中嵌入的語(yǔ)言程序中嵌入的SQL語(yǔ)句語(yǔ)句2.1. 有關(guān)數(shù)據(jù)庫(kù)和表的權(quán)限有關(guān)數(shù)據(jù)庫(kù)和表的權(quán)限2.1.1. 選擇數(shù)據(jù)庫(kù)(選擇數(shù)據(jù)庫(kù)(DATABASE)功能:DATABASE 語(yǔ)句用來(lái)選擇已存在的數(shù)據(jù)庫(kù),使其成為當(dāng)前數(shù)據(jù)庫(kù)。格式:DATABASE database_name2.1.2. 關(guān)閉數(shù)據(jù)庫(kù)(關(guān)閉數(shù)據(jù)庫(kù)(CLOSE DATABASE)功能:關(guān)

12、閉當(dāng)前數(shù)據(jù)庫(kù)。格式:CLOSE DATABASE2.1.3. 創(chuàng)建表(創(chuàng)建表(CREATE TABLE)功能:在當(dāng)前數(shù)據(jù)庫(kù)中建立一張新表。格式:CREATE TEMP TABLE table_name(column_name datatype NOT NULL,)2.1.4. 刪除表(刪除表(DROP TABLE)功能:刪除一個(gè)已存在的表,以及相關(guān)的索引和數(shù)據(jù)。格式:DROP TABLE table_nameESQL/C 編程培訓(xùn)教材版本:1.0.1 - 5 -2.2. 數(shù)據(jù)查詢語(yǔ)句數(shù)據(jù)查詢語(yǔ)句SELECT數(shù)據(jù)查詢語(yǔ)句 SELECT 的執(zhí)行結(jié)果有三種情況: 沒(méi)有滿足條件的記錄; 返回單個(gè)記錄;

13、 返回多個(gè)記錄。前兩種情況可以使用單個(gè)的 SELECT 語(yǔ)句,最后一種情況必須使用游標(biāo)進(jìn)行查詢。格式: SELECT 子句 INTO 子句FROM TableListWHERE FilterJoinGROUP BY ColumnGroupListHAVING GroupFilterORDER BY OrderFilterINTO TERMTable說(shuō)明: INTO 子句檢索出來(lái)的數(shù)據(jù)存放的宿主變量INTO TEMPTable將檢索處理的結(jié)果存在至臨時(shí)表SELECT 如果返回多個(gè)記錄,必須通過(guò)游標(biāo)方式進(jìn)行處理。如果返回單條記錄,我們將該語(yǔ)句稱為單記錄 SELECT 語(yǔ)句,如果有記錄返回,sqlc

14、a.sqlcode則被設(shè)置為 0,如果沒(méi)有滿足條件的記錄,sqlca.sqlcode 則被設(shè)置為SQLNOTFOUND,以下是對(duì)單記錄 SELECT 語(yǔ)句操作的示例:EXEC SQL BEGIN DECLARE SECTION;char fj11,zh10,xb20;double zhxb;EXEC SQL END DECLARE SECTION;EXEC SQL SELECT fj,zh,xb,zhxb into:fj, :zh, :xb, :zhxbfrom bookwhere book_num=100;ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 6 -if ( sqlca.slqco

15、de = SQLNOTFOUND )printf( 沒(méi)有滿足條件的記錄n );if ( sqlca.sqlcode = 0 ) printf( 書名:%sn, fj );printf( 作者:%sn, zh );printf( 出版社:%sn, xb );printf( 定價(jià):%.2fn, zhxb );2.3. 插入語(yǔ)句插入語(yǔ)句INSERT功能:INSERT 語(yǔ)句的主要目的是在表中增加一條或多條新記錄。格式: INSERT INTO table_name(ColumnList)VALUES( valuelist )示例:EXEC SQL INSERT INTO Customer( custo

16、mer_num, fname, lname, company )VALUES( 0, $Firstname, $Lastname, JOHN CORP );2.4. 數(shù)據(jù)修改語(yǔ)句數(shù)據(jù)修改語(yǔ)句UPDATE功能:UPDATE 語(yǔ)句用來(lái)改變一個(gè)或多個(gè)記錄中的一個(gè)或多個(gè)字段的值。格式: UPDATE table_name SETcolumn_name=expr,|(column_list)=(expr_list)WHERE condition示例:EXEC SQL UPDATE customer SET(fname,lname)=(:Fname,:Lname)WHERE customer_num=:c

17、ust;ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 7 -2.5. 數(shù)據(jù)刪除語(yǔ)句數(shù)據(jù)刪除語(yǔ)句DELETE功能:刪除語(yǔ)句 DELETE 從數(shù)據(jù)庫(kù)表中刪除一個(gè)或多個(gè)記錄。格式: DELETE FROM table_nameWHERE condition示例:EXEC SQL DELETE FROM bookWHERE book_num=:booknum;2.6. PREPARE語(yǔ)句語(yǔ)句功能:PREPARE 語(yǔ)句顯示地請(qǐng)求對(duì) SQL 語(yǔ)句進(jìn)行語(yǔ)法分析。格式: PREPARE statement_name FROM string_spec示例:EXEC SQL PREPARE Del FROMde

18、lete from book where boo_num=?;if ( SQLCODE 0 ) / SQLCODE=sqlca.sqlcodeprintf( prepare Del Error sqlcode=%dn, SQLCODE );exit( -1 );while( ) EXEC SQL EXECUTE Del Using :book10;3. 游標(biāo)游標(biāo)3.1. 滾動(dòng)游標(biāo)滾動(dòng)游標(biāo)3.1.1. DECLAREDECLARE 定義一個(gè)游標(biāo),它給游標(biāo)命名并把一個(gè)查詢同一個(gè)游標(biāo)相關(guān)聯(lián)。ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 8 -格式:DECLARE cursor_name CURSO

19、R FOR selectstmt示例:EXEC SQL declare C1 cursor for select xy1,xy2 into :xy1, :xy2 from fj;3.1.2. OPENOPEN 語(yǔ)句激活游標(biāo)并開始執(zhí)行相關(guān)聯(lián)的 SELECT 語(yǔ)句格式: OPEN cursor_name示例:EXEC SQL declare custptr scroll cursor for select * from customer where zipcode=:zip;EXEC SQL open custptr;3.1.3. FETCHFETCH 語(yǔ)句把已打開的游標(biāo)移到一個(gè)新的位置,并把記錄

20、的字段值存放到INTO 子句說(shuō)明的宿主變量中。格式: FETCH position cursor_name INTO HOSTVARLIST說(shuō)明:對(duì)于一個(gè)滾動(dòng)游標(biāo),該新位置可以是活動(dòng)集中的任意位置。(1) 絕對(duì)位置FIRST取得活動(dòng)集中的第一個(gè)記錄。LAST取得活動(dòng)集中的最后一個(gè)記錄。CURRENT取得當(dāng)前記錄。ABSOLUTE n 取得活動(dòng)集的第 n 個(gè)記錄(2) 相對(duì)位置NEXT取得活動(dòng)集的下一個(gè)記錄。PREVIOUS取得活動(dòng)集的前一個(gè)記錄。RELATIVE n取得相對(duì)當(dāng)前記錄的第 n 個(gè)記錄,負(fù)值向前,正值向后數(shù)。示例:ESQL/C 編程培訓(xùn)教材版本:1.0.1 - 9 -EXEC SQ

21、L declare custptr scroll cursor for select customer_num, lname, fnamefrom customerwhere zipcode =:zip;EXEC SQL open custptr;EXEC SQL fetch next custptr into :Cnum, :Lname, :Fname;當(dāng)游標(biāo)成功地移動(dòng)到指定位置且在該位置有記錄時(shí),則 SQLCODE 值為 0,如果沒(méi)有記錄,則返回 SQLNOTFOUND(100) 。3.1.4. CLOSECLOSE 語(yǔ)句關(guān)閉游標(biāo)。格式: CLOSE cursor_name示例:EXEC SQL declare custptr scroll for select cnum,lname,fnamefrom customerwhere zipcode=:zip;EXEC SQL open custptr;EXEC SQL fetch next custptr into :Cnum,:Lname,:Fname;EXEC SQL close custptr;關(guān)閉游標(biāo)之后,除了 OPEN 和 FREE 語(yǔ)句之外,所有其它語(yǔ)句都不能再使用。3.1.5. FREEFREE 語(yǔ)句釋放空間和數(shù)據(jù)服務(wù)器中的游標(biāo)資源。格式:FREE cursor_name;示例:EX

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論