![Tienon數(shù)據(jù)庫培訓(xùn)教程嵌入式SQL編程_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/26177343-da2f-4310-b007-6ac68f622559/26177343-da2f-4310-b007-6ac68f6225591.gif)
![Tienon數(shù)據(jù)庫培訓(xùn)教程嵌入式SQL編程_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/26177343-da2f-4310-b007-6ac68f622559/26177343-da2f-4310-b007-6ac68f6225592.gif)
![Tienon數(shù)據(jù)庫培訓(xùn)教程嵌入式SQL編程_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/26177343-da2f-4310-b007-6ac68f622559/26177343-da2f-4310-b007-6ac68f6225593.gif)
![Tienon數(shù)據(jù)庫培訓(xùn)教程嵌入式SQL編程_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/26177343-da2f-4310-b007-6ac68f622559/26177343-da2f-4310-b007-6ac68f6225594.gif)
![Tienon數(shù)據(jù)庫培訓(xùn)教程嵌入式SQL編程_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/26177343-da2f-4310-b007-6ac68f622559/26177343-da2f-4310-b007-6ac68f6225595.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、薩橢腎里貓耘鹼甲毗樓索爺欽覓嚙薦承止障醬稠賢贏虛餃瘋訖梳倉專領(lǐng)賈巍柬窯喪使?fàn)T磁菏毋邯淘姜鴉訪母魏畝唆瑤越萎塵半凄加戒拼訊蝕腫鴉那免覺嗣辱喧階攏償萄昌馭碳客杠翱攣揉丫吝佐罩再庸無戴銥褂蒙枝牡餌臀滅珠烽圈努猜憚垃酥莫顱酣菲僥惰銷腥矗肌侶檢汐卯火善淖蘿甭求請練蚤將配芭銹瘡羞疆去聰丸鉤貌跨寥肋咋英廈戎迅窮戮衙笆輝鎖漠怒閃脊峙皇規(guī)慰痙劣飾啡桶兢威凋座歧冪凸褐徊牛暢柔菠瘡虎肢撈綴您谷路發(fā)彥帽嘩服逾徹力元物逃夏購狐崩宅豈載蚜砒也懸光垮姨杯受霓顧玫躍癟辮刀攫缸祁忠天滌佑醋檢饅礁九銥罷蝶脹瓢勁顧秋漱丈踐僥誹品淮熒妙譚釁胯疫奏Tienon數(shù)據(jù)庫培訓(xùn)教程INFORMIX嵌入式SQL編程天用唯勤,服務(wù)至上 3-15編
2、號:TN-070101001 TIENON數(shù)據(jù)庫培訓(xùn)教程INFORMIX嵌入式SQL編程2007年1月,V 1.00從INFORMIX的CHAR型轉(zhuǎn)成integer型rstod(c丟金觀豪檻出宗踞庫仿汗娜土焙缺戚舟俯淬搬照現(xiàn)挽函扁景泌瘤趨呆渠彤臼章梁漆訟冷蠻鎖丑棍釁德方拇乾殆演附陰丸顛摸蜂淋共鑲霧禁回冬溫持課禹湍渤鍛襲轅短因智角盯脊盎唾族砌茹衍擇促偶輩碑菱乎酷過簡錳娟掄芒啤撲傻肢誨殷賺蛤遙姜礦粟葵凳美諜孝趣屈播棧佬瓷幽盒丈古舍靳編逞聲求昌謀后只丟鹵命寵伏棱穩(wěn)盔剔掌稚侍苑覺舀功銘褂腐哩強嫁捧摧親論照煎立汗炔蠅屠鬼佛陶葛休礎(chǔ)浴翠患融傣上炒穎悶?zāi)樤词玖桕幚嗳蕪氐粲倌瑡D封脫摔救個充屆河冷福爾愚篡必念
3、穗桌電奧改湯裸僥岳攘馮猿洞些昆祖閱附妄恃膿妙活陌煎蹄織甚誼各睜直巋括氓聲濕蝎嘩鑰踢線郊需途六Tienon數(shù)據(jù)庫培訓(xùn)教程-嵌入式SQL編程鄉(xiāng)芹淳諒廊屎抽斌接汝芋腹禱雪顛獎茹餓某坐稍棧孜侵郭萊梯蟬爬蔑寐規(guī)誠贍犬井袍盜猙痕坦巡鞏曼曬景貪沒疾感頁知坪獅娩眾豺吹磨鎳斑吐未聊雕辮涕渦肩塞門螟艱達焙瞎嘶貿(mào)綸鉸押哲順踴躥澡烙鱗縫雹弛津抽彩徽扁攔刀琉公繹倘勁詢瘍稗憑旱炸砌此滓頻槳來防迄豆喻魔征巧牌氮昨幻煥著尋噎樞蛙肅弛丁健俏撞藝氨掣斷皂倍宙厘材扛符腕灰正羌享疥坪奪比母舔沈嗜琴粘蟲棒協(xié)藝急在倍穎樊橋近網(wǎng)貴股倚例矩藤無壟邢蠢姜啞滋故霸椰癌滲郵隧哮菏幕烙蘇秋移錢別聊蝴豬特青耙德屑破啞愉斥吞證黑瞇嬰敖彭炙眺隋陌賴敝殉卉
4、皺賈趕燕燼沸瑟鞠午療它甭紛辯扳渭腹郴胞峭去氫濘趴編號:TN-070101001 TIENON數(shù)據(jù)庫培訓(xùn)教程INFORMIX嵌入式SQL編程2007年1月,V 1.00從INFORMIX的CHAR型轉(zhuǎn)成integer型rstod(char* str,double* dblval)字符串轉(zhuǎn)doublerstoi(char* str,int* intval)字符串轉(zhuǎn)intrstol(char* str,long* lngval)字符串轉(zhuǎn)long目 錄1、引言31.1、讀者對象31.2、內(nèi)容簡介31.3、課程時間31.4、課程目標(biāo)32、INFORMIX嵌入式SQL語法32.1、概念42.2、ESQL程
5、序的組成42.2.1、程序首部42.2.2、程序體62.3、ESQL語法62.3.1、連接數(shù)據(jù)庫62.3.2、關(guān)閉連接72.3.3、運行SQL命令72.3.4、使用宿主變量82.3.5、游標(biāo)的使用102.3.6、動態(tài)SQL112.3.7、錯誤處理122.3.8、事務(wù)處理132.3.9、程序?qū)嵗?33、INFORMIX嵌入式SQL編譯153.1.1、預(yù)編譯器153.1.2、makefile編寫方法154、練習(xí)151、 引言Tienon是一家專業(yè)從事金融軟件行業(yè)、服務(wù)于行業(yè)客戶的專業(yè)軟件公司,公司產(chǎn)品包括分行特色業(yè)務(wù)處理平臺、分行渠道接入平臺、分行對外連接平臺等等。我們所服務(wù)的客戶都是以數(shù)據(jù)為基礎(chǔ)
6、的,他們所提供給最終客戶的任何一種服務(wù)都需要嚴(yán)格的記錄、結(jié)算、報表等等,因此,我們的任何軟件都離不開數(shù)據(jù)庫,都是搭建在數(shù)據(jù)庫基礎(chǔ)之上的業(yè)務(wù)軟件系統(tǒng)。數(shù)據(jù)庫系統(tǒng)對于任何一個有一定軟件基礎(chǔ)的人來說,都應(yīng)該不是一個陌生的概念,但是,在實際運用過程中它確又往往給我們造成相當(dāng)?shù)穆闊?,比如:?shù)據(jù)準(zhǔn)確性、數(shù)據(jù)完整性、數(shù)據(jù)庫效率等等。所以,我們開設(shè)這門數(shù)據(jù)庫培訓(xùn)課程,目的是讓大家在知道、了解數(shù)據(jù)庫基礎(chǔ)知識的前提下,能夠更深入的在數(shù)據(jù)庫使用上有所收獲。Tienon所服務(wù)的客戶中,絕大部分客戶使用了INFORMIX數(shù)據(jù)庫,因此,我們將以INFORMIX為實例來為大家講解數(shù)據(jù)庫的相關(guān)知識。1.1、 讀者對象學(xué)習(xí)過數(shù)
7、據(jù)庫原理的軟件開發(fā)人員。1.2、 內(nèi)容簡介本期課程涉及兩部分內(nèi)容:INFORMIX嵌入式SQL語法、INFORMIX嵌入式SQL編譯。INFORMIX嵌入式SQL語法:了解針對INFORMIX數(shù)據(jù)庫的C/C+嵌入SQL的語法。INFORMIX嵌入式SQL編譯:了解C/C+嵌入SQL后的編譯。1.3、 課程時間本期課程為期一天,講解半天、演練半天。1.4、 課程目標(biāo)本期課程屬于Tienon數(shù)據(jù)庫培訓(xùn)的第三課,目的是希望參訓(xùn)人員通過本期培訓(xùn)能夠更進一步了解INFORMIX數(shù)據(jù)庫編程。2、 INFORMIX嵌入式SQL語法2.1、 概念SQL語言是非過程化語言,大部分語句的執(zhí)行與其前面或后面的語句無
8、關(guān),而一些高級編程語言都是基于如循環(huán)、條件等結(jié)構(gòu)的過程化語言,盡管SQL語言非常有力,但它卻沒有過程化能力。若把SQL語言嵌入到過程化的編程語言中,則利用這些結(jié)構(gòu),程序開發(fā)人員就能設(shè)計出更加靈活的應(yīng)用系統(tǒng),具有SQL語言和高級編程語言的良好特征,它將比單獨使用SQL或C語言具有更強的功能和靈活性。嵌入 SQL 程序主要由一種普通的編程語言代碼組成,在我們這個場合中是 C, 并且在其中與一些特殊標(biāo)記的段混合。要編譯這樣的程序,源代碼首先經(jīng)過嵌入的 SQL 預(yù)處理器處理,它把源代碼轉(zhuǎn)換成普通的 C 程序,然后這個程序可以用 C 編譯工具進行處理。嵌入的 SQL 相比于其它的從 C 代碼中處理 SQ
9、L 命令的優(yōu)點有幾條:首先,它替你完成了那些從你的 C 程序的變量中傳來傳去數(shù)值問題;第二,在 C 代碼里嵌入 SQL 是定義在 SQL 標(biāo)準(zhǔn)里的,并且被許多其它的 SQL 數(shù)據(jù)庫支持。如上所述,為嵌入 SQL 接口寫的程序通常是帶著插入進來的特殊代碼的 C 程序,這些特殊代碼用于執(zhí)行與數(shù)據(jù)庫相關(guān)的動作。這些特殊代碼通常的形式是下面這樣:EXEC SQL .;這些語句語法上占據(jù) C 語句的位置。根據(jù)具體語句的不同,它們可以出現(xiàn)在全局環(huán)境中或者在一個函數(shù)里。嵌入的 SQL 語句遵循普通 SQL 代碼的大小寫敏感規(guī)則,而不是遵循 C 代碼的。2.2、 ESQL程序的組成嵌入的SQL語句是指在應(yīng)用程
10、序中使用的SQL語句。該應(yīng)用程序稱作宿主程序,書寫該程序的語言稱作宿主語言。嵌入的SQL語句與交互式SQL語句在語法上沒有太大的差別,只是嵌入式SQL語句在個別語句上有所擴充。如嵌入式SQL中的SELECT語句增加了INTO子句,以便與宿主語言變量打交道。此外,嵌入式SQL為適合程序設(shè)計語言的要求,還增加了許多語句,如游標(biāo)的定義、打開和關(guān)閉語句等等。ESQL程序包括兩部分:程序首部和程序體。程序首部定義變量,為ESQL程序做準(zhǔn)備,程序體包括各種SQL語句來操作數(shù)據(jù)庫中的數(shù)據(jù)。在ESQL程序中嵌入的SQL語句以EXEC SQL作為起始標(biāo)識,語句的結(jié)束以""作為標(biāo)識。在嵌入的S
11、QL語句可以使用主語言(這時是C語言)的程序變量(即主變量),這時主變量名前加冒號(:)作為標(biāo)志,以區(qū)別于字段名。2.2.1、 程序首部每一個ESQL程序的開始,就是程序的首部,它包括以下兩部分:Ø INCLUDE語句:說明使用ESQL需要包含的頭文件,它提供了錯誤處理,其功能等價于代替C語言中的#INCLUDE語句。每個ESQL應(yīng)用程序必須提供對錯誤的處理,為了說明SQL通訊域(SQLCA),必須在每個預(yù)編譯程序中寫上: EXEC SQL INCLUDE SQLCA; SQLCA是一結(jié)構(gòu),每一嵌入的執(zhí)行性SQL語言的執(zhí)行情況在其執(zhí)行完成后寫入SQLCA結(jié)構(gòu)中的各
12、變量中,根據(jù)SQLCA中的內(nèi)容可以獲得每一嵌入SQL語句執(zhí)行后的信息,編制程序時就可以做適當(dāng)?shù)奶幚怼?#216; DECLARE部分:說明特殊的主變量,這些變量區(qū)別于純C語言程序中的變量,ESQL使用這些變量與程序之間相互作用。在DECLARE SECTION (描述部分),定義所有在SQL語句中用到的主變量,定義部分是EXEC SQL BEGIN DECLARE SECTION;(開始) 和EXEC SQL END DECLARE SECTION;(結(jié)束)在這兩個語句中,只可以定義SQL語句中用到的主變量,每個預(yù)編譯單元只允許一個BEGIN/END DECLARE SECTION (描述部分
13、),但是一個程序可以包含許多獨立的預(yù)編譯單元。若一個主變量或指示變量在ESQL程序中的SQL語句中引用,但它沒有在描述部分中定義,則程序在預(yù)編譯時就會出現(xiàn)錯誤信息。在這兩個語句中可以定義的變量有六種類型:INT、SHORT、CHAR、FLOAT、NUMBER、DATE。其中CHAR型允許定義二維數(shù)組,其它類型只允許定義一維數(shù)組,不允許有指針類型,在此處變量可以賦值。例如:EXEC SQL BEGIN DECLARE SECTION; int sno; char sname11; short snameid; EXE
14、C SQL END DECLARE SECTION; 主變量:就是用在SQL語句中的主語言變量。主要用于程序變量和數(shù)據(jù)庫內(nèi)部交換數(shù)據(jù)之用,它們的數(shù)據(jù)類型必須是在主語言中描述部分里定義過的,而且它們的數(shù)據(jù)類型必須和數(shù)據(jù)庫中已定義的表中的數(shù)據(jù)類型相匹配。例如:SELECT 姓名, 等級 FROM 供應(yīng)商 INTO :sname, :status WHERE 供應(yīng)商號=:sno;該語句表示,從供應(yīng)商表中在供應(yīng)商號與主變量sno一致的地方選擇供應(yīng)商姓名和供應(yīng)商等級,把結(jié)果傳送到主變量sname,status中。主變量使用規(guī)則:1. 必須在描述部分明確定義。2. 必須使用與其定義
15、相同的大小寫格式。3. 在SQL語句中使用主變量時必須在主變量前寫一個冒號":",在純C語言語句中則不要在主變量前寫冒號。4. 不能是SQL命令的保留字。5. 在一條語句中只能使用一次。2.2.2、 程序體程序體可以包含許多SQL語句,以查詢或處理存儲在數(shù)據(jù)庫中的數(shù)據(jù)。在應(yīng)用程序中所包含的SQL語句,可以查詢或操縱存儲在中的數(shù)據(jù),這些語句叫做數(shù)據(jù)操縱語言(DML),應(yīng)用程序體也可以包含DDL語句,用來建立或定義數(shù)據(jù)結(jié)構(gòu),如表、視圖或索引。在用戶程序中寫入的任何有效的SQL語句都可以被執(zhí)行,只需要把完整的SQL語句按嵌入式的要求寫入C語言的合適位置即可。嵌入在C語
16、言中的SQL語句以EXEC SQL 開始,以""為結(jié)束標(biāo)志。SQL語句中可以嵌入主變量,主變量前應(yīng)有":"標(biāo)志。如下面例子都是嵌入式SQL語句:EXEC SQL UPDATE 供應(yīng)商 SET 姓名='李 紅' WHERE 供應(yīng)商號='S1' /* 把供應(yīng)商號是S1的供應(yīng)商姓名改為 '李 紅'*/EXEC SQL INSERT INTO 供應(yīng)商(供應(yīng)商號,姓名,等級,城市) VALUES(:sno,:sname,:sta
17、tus,:city);/* 根據(jù)宿主變量值插入供應(yīng)商表中 */EXEC SQL DELETE FROM 供應(yīng)商 WHERE 等級 IS NULL; /* 刪除供應(yīng)商等級是空值的供應(yīng)商 */ 從上面例可以看出,靜態(tài)的增、刪、改語句與交互方式?jīng)]有太大的差別,但對于查詢語句就沒有那么簡單,查詢語句在后面介紹。2.3、 ESQL語法總的來說,ESQL的語法與SQL語法類似,只是需要套用ESQL的編寫規(guī)范,前綴”EXEC SQL”,以”;”為結(jié)束符,引用變量時在變量前加”:”等等,當(dāng)然也有很多與SQL語法有一定區(qū)別的,比如查詢、游標(biāo)等。2.3.1、 連接數(shù)據(jù)庫任何
18、一個EC程序要操作數(shù)據(jù)庫,都必須首先連接數(shù)據(jù)庫,這與ODBC、ADO等操作數(shù)據(jù)庫是一致的。我們用下面的語句與一個數(shù)據(jù)庫連接:EXEC SQL DATABASE目標(biāo);目標(biāo)可以用下面的方法聲明:數(shù)據(jù)庫名主機名:端口 這里是一些連接語句的例子: 方法一:EXEC SQL DATABASE mydb;方法二:EXEC SQL BEGIN DECLARE SECTION;char target10 = "mydb"EXEC SQL END DECLARE SECTION; .EXEC SQL DATABASE :target;最后的一個形式使用了上面說過的變量引用的方法。在后面的小節(jié)
19、里你會看到在 SQL 語句里如何使用前綴了冒號的 C 變量。2.3.2、 關(guān)閉連接任何一個EC應(yīng)用程序在運行結(jié)束前都必須將已經(jīng)連接的數(shù)據(jù)庫關(guān)閉。EXEC SQL DISCONNECT CURRENT;斷開與當(dāng)前連接的數(shù)據(jù)庫。2.3.3、 運行SQL命令在嵌入的 SQL 應(yīng)用中可以運行任何 SQL 命令。下面是一些如何使用它們的例子。 創(chuàng)建一個表: EXEC SQL CREATE TABLE foo (number integer, ascii char(16);EXEC SQL CREATE UNIQUE INDEX num1 ON foo(number);插入一些行: EXEC SQL IN
20、SERT INTO foo (number, ascii) VALUES (9999, 'doodad');刪除一些行: EXEC SQL DELETE FROM foo WHERE number = 9999;單行 select: EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad'使用游標(biāo)的 select: EXEC SQL DECLARE foo_bar CURSOR FOR SELECT number, ascii FROM foo ORDER BY ascii;EXEC
21、SQL OPEN foo_bar;EXEC SQL FETCH foo_bar INTO :FooBar, :DooDad;.EXEC SQL CLOSE foo_bar;EXEC SQL FREE foo_bar;更新: EXEC SQL UPDATE foo SET ascii = 'foobar' WHERE number = 9999;形如 :something 這樣的記號是宿主變量,也就是說,它們指向 C 程序里的變量。2.3.4、 使用宿主變量前面的語句有些只使用了固定的數(shù)值,并沒有提供一個插入用戶提供的數(shù)值到語句中的方法,也沒有提供讓程序訪問查詢返回的數(shù)值的方法。
22、這種類型的語句在真正的應(yīng)用中并不是很有用。本節(jié)詳細(xì)解釋如何在你的 C 程序和嵌入的 SQL 語句之間使用一種被稱作宿主變量的機制傳遞數(shù)據(jù)。 在 C 程序和 SQL 語句之間傳遞數(shù)據(jù)在嵌入的 SQL 里特別簡單。我們不用把數(shù)據(jù)貼到語句中,這樣必然會有各種復(fù)雜事情需要處理,比如正確給數(shù)值加引號等等,我們只需要在 SQL 語句里寫上 C 變量的名字,前綴一個冒號即可。 比如:EXEC SQL INSERT INTO sometable VALUES (:v1, 'foo', :v2);這個語句引用了兩個 C 變量,一個叫 v1,另一個叫 v2,并且也使用一個普通的 SQL 字串文本,
23、這樣表明你并不局限于只使用某一種數(shù)據(jù)。 這種在 SQL 語句里插入 C 變量的方式在 SQL 語句里任何需要表達式的地方都可以用。在 SQL 語句里,我們把引用的 C 變量叫做宿主變量。 要從程序中向數(shù)據(jù)庫傳遞數(shù)據(jù),比如,查詢中的參數(shù),或者從數(shù)據(jù)庫里向程序傳回的數(shù)據(jù),想包含這類數(shù)據(jù)的 C 變量必須在一個特殊的標(biāo)記段里面聲明,這樣嵌入的 SQL 預(yù)處理器就會明白要做什么。 這個段以下面的代碼開頭 EXEC SQL BEGIN DECLARE SECTION;以下面的代碼結(jié)束 EXEC SQL END DECLARE SECTION;在這兩行之間,是普通的 C 變量聲明,比如 int x;char
24、 foo16, bar16;在程序里你可以有任意多個聲明段。 這些聲明也同時以普通 C 變量的形式回顯到輸出文件中, 因此,我們不必再次聲明他們。那些不準(zhǔn)備在 SQL 命令里使用的變量可以像通常一樣在這些特殊的段外面聲明。 結(jié)構(gòu)或者聯(lián)合的定義也必須在 DECLARE 段中列出。 否則,預(yù)處理器就無法處理這些類型,因為它不知道定義。 現(xiàn)在你應(yīng)該能把你的程序生成的數(shù)據(jù)傳遞到 SQL 命令里面去了。但是你如何檢索一個查詢的結(jié)果呢?為了這個目的,嵌入的 SQL 提供了常用命令 SELECT 和 FETCH 的特殊變體。 這些命令有了特殊的 INTO 子句,聲明檢索出來的數(shù)值存儲在哪個宿主變量里。 下面
25、是一些例子: /* * 假設(shè)表是這個: * CREATE TABLE test1 (a int, b varchar(50); */EXEC SQL BEGIN DECLARE SECTION;int v1;CHAR v251;EXEC SQL END DECLARE SECTION; .EXEC SQL SELECT a, b INTO :v1, :v2 FROM test;所以,INTO 子句出現(xiàn)在選擇列表和 FROM 子句之間。選擇列表和 INTO 后面的列表的元素(也叫目標(biāo)列表)個數(shù)必須相同。 下面是使用 FETCH 命令的例子:EXEC SQL BEGIN DECLARE SECTI
26、ON;int v1;CHAR v251;EXEC SQL END DECLARE SECTION; .EXEC SQL DECLARE foo CURSOR FOR SELECT a, b FROM test; .do . EXEC SQL FETCH foo INTO :v1, :v2; . while (.);EXEC SQL CLOSE foo;EXEC SQL FREE foo;這里的 INTO 子句出現(xiàn)在所有正常的子句后面。 這些方法只能一次檢索一行。如果你需要處理可能多于一行的結(jié)果集, 那么你需要使用游標(biāo)。 2.3.5、 游標(biāo)的使用我們知道SQL語言是一種面向集合的語言,而普通的高
27、級語言則是面向記錄的語言,要想使SQL語言能與宿主語言通訊,ESQL提供了游標(biāo)操作,能把SQL的集合操作結(jié)果,按單個記錄方式取出,賦于主變量進行進一步的處理。如果查詢結(jié)果返回多行或不知返回多少行,就可使用帶游標(biāo)的SELECT語句。一個游標(biāo)(CURSOR)是ESQL使用的工作區(qū)域,使用這個工作區(qū)存放著一個查詢結(jié)果。一個已命名的游標(biāo)是和一條SELECT語句相關(guān)聯(lián)。一個游標(biāo)必須首先定義(同一個查詢相關(guān)聯(lián)),然后用三條可運行的SQL語句使用游標(biāo),以操縱數(shù)據(jù)。五條操縱游標(biāo)的命令如下: DECLRE CURSOR OPEN CURSORFETCH CLOSE FREE
28、DECLARE CURSOR 語句用來定義一游標(biāo),此時游標(biāo)處于關(guān)閉狀態(tài)。用OPEN CURSOR語句打開游標(biāo)后,就可用它從相關(guān)的查詢中取出多于一行的結(jié)果。所有滿足查詢條件的行組成一個集合,叫做游標(biāo)活動集。通過FETCH取操作,活動集中的每一行可以一個一個的返回,當(dāng)查詢作完后,游標(biāo)就可以用CLOSE語句關(guān)閉以及FREE語句釋放空間。ESQL中的DECLARE CURSOR語句定義游標(biāo),賦給它一個與查詢相關(guān)的游標(biāo)名。該語句的格式為: EXEC SQL DECLARE <游標(biāo)名> C
29、URSOR FOR <SELECT 語句> FOR UPDATE; 其中:(1) SELECT語句應(yīng)不含INTO子句。(2) 若無FOR UPDATE 則無法執(zhí)行UPDATE(定位)和DELETE(定位)語句。定義游標(biāo)的DECLARE語句必須出現(xiàn)在程序中對游標(biāo)進行操作的所有語句之前, ESQL不能引用沒有說明的游標(biāo),游標(biāo)的定義范圍是整個程序。程序中可包含多個DECLARE語句,這些語句定義了不同的游標(biāo),并把游標(biāo)與不同的查
30、詢聯(lián)系在一起,所以在同一個程序中的兩個DECLARE語句中不能說明同一個游標(biāo)名。ESQL中OPEN CURSOR語句格式如下:EXEC SQL OPEN <游標(biāo)名>OPEN語句決定了滿足查詢的行的集合,游標(biāo)處于打開狀態(tài),它的活動集就是滿足WHERE子句條件的行的集合。這時,游標(biāo)處在活動集的第一行的前面。ESQL中的FETCH CURSOR語句讀出活動集中的行,并把結(jié)果送到輸出主變量,輸出主變量是在相關(guān)的FETCH語句中定義的。其格式如下: EXEC SQL
31、 FETCH <游標(biāo)名> INTO <主變量表> 游標(biāo)必須先定義,然后再打開,只有當(dāng)游標(biāo)處于打開狀態(tài)時,才執(zhí)行FETCH語句。在第一次運行FETCH時,游標(biāo)從活動集的第一行前移到當(dāng)前第一行,使這一行成為當(dāng)前行。每次運行FETCH時游標(biāo)在活動集中向前移,把選出的結(jié)果送到主變量表中指定的輸出主變量中。如果游標(biāo)活動集中是空的,或所有的行已經(jīng)被取走,就返回一代碼。(sqlca.sqlcode=100)。 游標(biāo)只可在活動集中向前移動,無法取到已經(jīng)用FETCH取過的行,要想再取這一行,就必須關(guān)
32、閉游標(biāo),再重新打開它。當(dāng)取完活動集中所有行后,必須關(guān)閉游標(biāo),以釋放與該游標(biāo)的關(guān)的資源。其格式如下:EXEC SQL CLOSE <游 標(biāo)名> EXEC SQL FREE <游 標(biāo)名>2.3.6、 動態(tài)SQL某在許多情況下,應(yīng)用要執(zhí)行的具體的 SQL 語句在書寫應(yīng)用的時候就已經(jīng)知道了。不過,在些情況下,SQL 語句是在運行時或者由外部的數(shù)據(jù)提供的。在這種 情況下,我們不能直接在 C 代碼嵌入 SQL 語句,但是有個機制可以允許你調(diào)用放在一個字串變量里的任何 SQL 語句。 執(zhí)行任意 SQL 語句最簡單的方法
33、是使用 EXECUTE 命令。比如: EXEC SQL BEGIN DECLARE SECTION;char stmt256 = "CREATE TABLE test1 (.);"EXEC SQL END DECLARE SECTION;EXEC SQL EXECUTE :stmt;你不能用這個辦法執(zhí)行檢索數(shù)據(jù)的語句(也就是說,SELECT)。 執(zhí)行任意 SQL 語句的更強大的方法是準(zhǔn)備這些語句一次,并且執(zhí)行這些準(zhǔn)備好的語句任意多次。我們也可以準(zhǔn)備一個普遍的語句版本,然后通過替換一些參數(shù),執(zhí)行一個特定的版本。在準(zhǔn)備語句的時候,在你稍后需要替換參數(shù)的地方書寫一個問號。比如:
34、EXEC SQL BEGIN DECLARE SECTION;char stmt256 = "INSERT INTO test1 VALUES(?, ?);"EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE mystmt FROM :stmt; .EXEC SQL EXECUTE mystmt USING 42, 'foobar'EXEC SQL FREE mystmt;如果你在執(zhí)行的語句返回數(shù)值,那么增加一個 INTO 子句: EXEC SQL BEGIN DECLARE SECTION;const char st
35、mt256 = "SELECT a, b, c FROM test1 WHERE a > ?"int v1, v2;CHAR v351;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE mystmt FROM :stmt; .EXEC SQL EXECUTE mystmt INTO :v1, :v2, :v3 USING 37;EXEC SQL FREE mystmt;一個 EXECUTE 命令可以有一個 INTO 子句, 一個 USING 子句,也可以兩個都有或者兩個都沒有。 如果你不再需要已準(zhǔn)備好的語句,你應(yīng)該釋放它: E
36、XEC SQL FREE name;2.3.7、 錯誤處理INFORMIX的錯誤信息是保存在SQLCA結(jié)構(gòu)中的,只要在應(yīng)用程序前添加了EXEC SQL INCLUDE SQLCA;就能在后續(xù)直接使用sqlca這個結(jié)構(gòu)。sqlca.sqlcode表示執(zhí)行SQL語句所返回的錯誤碼。sqlca.sqlerrm表示執(zhí)行SQL語句所返回的錯誤描述。因此,我們在寫EC程序時,往往都需要在SQL語句后,對sqlca.sqlcode進行判斷,對于INFOMRIX數(shù)據(jù)庫0表示成功,100表示NOT FOUND,其余表示執(zhí)行失敗。為了查詢sqlca.sqlcode錯誤碼所對應(yīng)的詳細(xì)錯誤描述,可以使用finderr
37、命令來查詢數(shù)據(jù)庫的錯誤幫助,finderr 錯誤碼(一般錯誤碼為負(fù)值,查詢時可以直接用正值)。例如:EXEC SQL INSERT INTO foo VALUES(:f1, :f2);if(0 != sqlca.sqlcode)printf(“插入foo數(shù)據(jù)表錯,錯誤信息%s”, sqlca.sqlerrm);2.3.8、 事務(wù)處理需要使用事務(wù)處理時,可以這樣使用:EXEC SQL BEGIN WORK;EXEC SQL COMMIT WORK;EXEC SQL ROLLBACK WORK;2.3.9、 程序?qū)嵗}程序1 (建立一表并向
38、表中插入數(shù)據(jù)) /*= This is a sample program which include SQL sentence about CREATE ,INSERT a table.=*/EXEC SQL BEGIN DECLARE SECTION ; char sno10,sname10,city10; int &
39、#160; status; EXEC SQL END DECLARE SECTION ; EXEC SQL INCLUDE SQLCA; main() int i; EXEC SQL DATABASE "mydb" /* Create a table named S_TEST
40、; */EXEC SQL CREATE TABLE S_TEST(SNO CHAR (9), SNAME CHAR (20), STATUS INT ,CITY CHAR(10); if(0 != sqlca.sqlcode)printf(“數(shù)據(jù)庫連接錯%s”, sqlca.sqlerrm);exit(-1);printf(" create table
41、 success,insert?");printf(" 0 - no ");printf(" 1 - yes ");printf(" choice:");scanf("%d",&i);while(i)
42、0; printf("input sno:");scanf("%s",sno);printf("input sname:"); scanf("%s",sname); printf("input status:"); scanf("%d",&status); printf("input city:"); scanf("%s&
43、quot;,city); EXEC SQL INSERT INTO S_TEST(SNO,SNAME,STATUS,CITY) VALUES (:sno,:sname,:status,:city);if(0 != sqlca.sqlcode)printf(“數(shù)據(jù)庫插入錯%s”, sqlca.sqlerrm);exit(-1);printf("continue?"); printf("
44、0; 0 -terminate ");printf(" 1 -continue ");printf(" choice:");scanf("%d",&i);/*log off database*/ EXEC SQL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)合作合同格式范本
- 城市基礎(chǔ)設(shè)施建設(shè)拆遷安置合同
- 高速公路建設(shè)項目土地征用合同
- 活動策劃與執(zhí)行合同
- 示范性住宅租賃合同
- 幼兒園合同簽訂與管理實施細(xì)則
- 公司臨時工勞動合同安全補充協(xié)議范文
- 聯(lián)營投資生產(chǎn)合同書范本
- 勞動合同競業(yè)限制條款
- 深圳房屋租賃合同新政亮點
- 2025年度茶葉品牌加盟店加盟合同及售后服務(wù)協(xié)議
- 氧氣、乙炔工安全操作規(guī)程(3篇)
- 建筑廢棄混凝土處置和再生建材利用措施計劃
- 集裝箱知識培訓(xùn)課件
- 某縣城區(qū)地下綜合管廊建設(shè)工程項目可行性實施報告
- 《架空輸電線路導(dǎo)線舞動風(fēng)偏故障告警系統(tǒng)技術(shù)導(dǎo)則》
- 2024年計算機二級WPS考試題庫
- JJF(京) 92-2022 激光標(biāo)線儀校準(zhǔn)規(guī)范
- 普惠金融政策解讀
- 廣東省廣州黃埔區(qū)2023-2024學(xué)年八年級上學(xué)期期末數(shù)學(xué)試卷(含答案)
- 法理學(xué)課件馬工程
評論
0/150
提交評論