?? esqlc方面的資料.txt
字號:
>> ChinaUnix.net > SCO
有人有ESQL/C方面的資料嗎?
作者:sunw 發(fā)表時(shí)間:2002/10/28 05:04pm
能發(fā)一份給我嗎?
sunw80@163.com
--------------------------------------------------------------------------------
此文章相關(guān)評論:
該文章有13個(gè)相關(guān)評論如下:(點(diǎn)這兒可以發(fā)表評論)
threehair 發(fā)表于: 2002/10/28 05:21pm
第六章 嵌入式SQL(E-SQL)簡介3
第一節(jié) 什么是嵌入SQL語言?3
1.1 嵌入SQL程序的組成元素3
1.2 什么是靜態(tài)SQL和動(dòng)態(tài)SQL?4
1.3 什么是SQLCA?4
1.4 什么是SQLDA?5
第二節(jié) SYBASE SQL SERVER嵌入式SQL語言5
2.1 一個(gè)嵌入SQL語言的簡單例子5
2.2 嵌入SQL的處理過程6
2.3 嵌入SQL語句總覽7
2.3.1 宿主變量7
2.3.2 連接數(shù)據(jù)庫12
2.3.3 數(shù)據(jù)的查詢和修改13
2.3.4 游標(biāo)的使用13
2.3.5 SQLCA15
2.3.6 WHENEVER16
2.3.7 批處理18
2.3.8 事務(wù)18
2.4動(dòng)態(tài)SQL語句18
2.4 .1 動(dòng)態(tài)修改19
2.4.2 動(dòng)態(tài)游標(biāo)20
2.4.3 SQLDA23
2.4.4 DESCRIBE語句27
2.5 兩個(gè)例子程序27
2.5.1 TELECOM程序27
2.5.2 ADHOC程序29
第三節(jié) IBM DB2嵌入SQL語言35
3.1 一個(gè)簡單示例35
3.2 嵌入SQL語句37
3.2.1宿主變量37
3.2.2單行查詢39
3.2.3多行查詢39
3.2.4插入、刪除和修改操作40
3.2.5 SQLCA43
3.2.6事務(wù)45
3.3 DB2的嵌入SQL程序處理過程46
3.4 DB2的動(dòng)態(tài)SQL嵌入語句53
3.4.1 基本方法53
3.4.2 動(dòng)態(tài)游標(biāo)55
3.4.3 SQLDA55
第四節(jié) ORACLE數(shù)據(jù)庫的嵌入SQL語言66
4.1 基本的SQL語句66
4.1.1宿主變量和指示符66
4.1.2 查詢68
4.1.3 修改數(shù)據(jù)68
4.1.4 游標(biāo)68
4.2 嵌入PL/SQL71
4.3 動(dòng)態(tài)SQL語句72
4.3.1 ORACLE動(dòng)態(tài)SQL語句的一些特點(diǎn)72
4.3.2 使用動(dòng)態(tài)SQL的四種方法72
4.3.3 SQLDA75
第五節(jié)INFORMIX的嵌入SQL/C語言89
5.1 一個(gè)簡單的入門例子89
5.2 宿主變量91
5.3 嵌入SQL的處理過程96
5.4 動(dòng)態(tài)SQL語言96
5.4.1 SQLDA97
第六節(jié)MICROSOFT SQL SERVER7嵌入式SQL語言105
6.1 一個(gè)嵌入SQL語言的簡單例子105
6.2 嵌入SQL的處理過程106
6.3 嵌入SQL語句112
6.3.1 聲明嵌入SQL語句中使用的C變量112
6.3.2 連接數(shù)據(jù)庫115
6.3.3 數(shù)據(jù)的查詢和修改115
6.3.4 游標(biāo)的使用116
6.3.5 SQLCA117
6.3.6 WHENEVER118
6.4動(dòng)態(tài)SQL語句119
6.4 .1 動(dòng)態(tài)修改119
6.4.2 動(dòng)態(tài)游標(biāo)120
6.4.3 SQLDA122
6.4.4 DESCRIBE語句130
6.5 API130
第六章 嵌入式SQL(E-SQL)簡介
第一節(jié) 什么是嵌入SQL語言?
SQL是一種雙重式語言,它既是一種用于查詢和更新的交互式數(shù)據(jù)庫語言,又是一種應(yīng)用程序進(jìn)行數(shù)據(jù)庫訪問時(shí)所采取的編程式數(shù)據(jù)庫語言。SQL語言在這兩種方式中的大部分語法是相同的。在編寫訪問數(shù)據(jù)庫的程序時(shí),必須從普通的編程語言開始(如C語言),再把SQL加入到程序中。所以,嵌入式SQL語言就是將SQL語句直接嵌入到程序的源代碼中,與其他程序設(shè)計(jì)語言語句混合。專用的SQL預(yù)編譯程序?qū)⑶度氲腟QL語句轉(zhuǎn)換為能被程序設(shè)計(jì)語言(如C語言)的編譯器識別的函數(shù)調(diào)用。然后,C編譯器編譯源代碼為可執(zhí)行程序。
各個(gè)數(shù)據(jù)庫廠商都采用嵌入SQL語言,并且都符合ANSI/ISO的標(biāo)準(zhǔn)。所以,如果采用合適的嵌入SQL語言,那么可以使得你的程序能夠在各個(gè)數(shù)據(jù)庫平臺(tái)上執(zhí)行(即:源程序不用做修改,只需要用相應(yīng)數(shù)據(jù)庫產(chǎn)品的預(yù)編譯器編譯即可)。當(dāng)然,每個(gè)數(shù)據(jù)庫廠商又?jǐn)U展了ANSI/ISO的標(biāo)準(zhǔn),提供了一些附加的功能。這樣,也使得每個(gè)數(shù)據(jù)庫產(chǎn)品在嵌入SQL方面有一些區(qū)別。本章的目標(biāo)是,對所有的數(shù)據(jù)庫產(chǎn)品的嵌入SQL做一個(gè)簡單、實(shí)用的介紹。
當(dāng)然,嵌入SQL語句完成的功能也可以通過應(yīng)用程序接口(API)實(shí)現(xiàn)。通過API的調(diào)用,可以將SQL語句傳遞到DBMS,并用API調(diào)用返回查詢結(jié)果。這個(gè)方法不需要專用的預(yù)編譯程序。
1.1 嵌入SQL程序的組成元素
我們以IBM的DB2嵌入SQL為例,來看看嵌入SQL語句的組成元素。
例1、連接到SAMPLE數(shù)據(jù)庫,查詢LASTNAME為JOHNSON的FIRSTNAME信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA; (1)
main()
{
EXEC SQL BEGIN DECLARE SECTION; (2)
char firstname[13];
char userid[9];
char passwd[19];
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO sample; (3)
EXEC SQL SELECT FIRSTNME INTO :firstname (4)
FROM employee
WHERE LASTNAME = 'JOHNSON';(4)
printf( "First name = %s\n", firstname );
EXEC SQL CONNECT RESET; (5)
return 0;
}
上面是一個(gè)簡單的靜態(tài)嵌入SQL語句的應(yīng)用程序。它包括了嵌入SQL的主要部分:
(1)中的include SQLCA語句定義并描述了SQLCA的結(jié)構(gòu)。SQLCA用于應(yīng)用程序和數(shù)據(jù)庫之間的通訊,其中的SQLCODE返回SQL語句執(zhí)行后的結(jié)果狀態(tài)。
(2)在BEGIN DECLARE SECTION和END DECLARE SECTION之間定義了宿主變量。宿主變量可被SQL語句引用,也可以被C語言語句引用。它用于將程序中的數(shù)據(jù)通過SQL語句傳給數(shù)據(jù)庫管理器,或從數(shù)據(jù)庫管理器接收查詢的結(jié)果。在SQL語句中,主變量前均有“:”標(biāo)志以示區(qū)別。
(3)在每次訪問數(shù)據(jù)庫之前必須做CONNECT操作,以連接到某一個(gè)數(shù)據(jù)庫上。這時(shí),應(yīng)該保證數(shù)據(jù)庫實(shí)例已經(jīng)啟動(dòng)。
(4)是一條選擇語句。它將表employee中的LASTNAME為“JOHNSON”的行數(shù)據(jù)的FIRSTNAME查出,并將它放在firstname變量中。該語句返回一個(gè)結(jié)果。可以通過游標(biāo)返回多個(gè)結(jié)果。當(dāng)然,也可以包含update、insert和delete語句。
(5)最后斷開數(shù)據(jù)庫的連接。
從上例看出,每條嵌入式SQL語句都用EXEC SQL開始,表明它是一條SQL語句。這也是告訴預(yù)編譯器在EXEC SQL和“;”之間是嵌入SQL語句。如果一條嵌入式SQL語句占用多行,在C程序中可以用續(xù)行符“\”。
1.2 什么是靜態(tài)SQL和動(dòng)態(tài)SQL?
嵌入SQL語言,分為靜態(tài)SQL語言和動(dòng)態(tài)語言兩類。靜態(tài)SQL語言,就是在編譯時(shí)已經(jīng)確定了引用的表和列。宿主變量不改變表和列信息。可以使用主變量改變查詢參數(shù)值,但是不能用主變量代替表名或列名。
動(dòng)態(tài)SQL語言就是:不在編譯時(shí)確定SQL的表和列,而是讓程序在運(yùn)行時(shí)提供,并將SQL語句文本傳給DBMS執(zhí)行。靜態(tài)SQL語句在編譯時(shí)已經(jīng)生成執(zhí)行計(jì)劃。而動(dòng)態(tài)SQL語句,只有在執(zhí)行時(shí)才產(chǎn)生執(zhí)行計(jì)劃。動(dòng)態(tài)SQL語句首先執(zhí)行PREPARE語句要求DBMS分析、確認(rèn)和優(yōu)化語句,并為其生成執(zhí)行計(jì)劃。DBMS還設(shè)置SQLCODE以表明語句中發(fā)現(xiàn)的錯(cuò)誤。當(dāng)程序執(zhí)行完“PREPARE”語句后,就可以用EXECUTE語句執(zhí)行執(zhí)行計(jì)劃,并設(shè)置SQLCODE,以表明完成狀態(tài)。
1.3 什么是SQLCA?
應(yīng)用程序執(zhí)行時(shí),每執(zhí)行一條SQL語句,就返回一個(gè)狀態(tài)符和一些附加信息。這些信息反映了SQL語句的執(zhí)行情況,它有助于用戶分析應(yīng)用程序的錯(cuò)誤所在。這些信息都存放在sqlca.h的sqlca結(jié)構(gòu)中。如果一個(gè)源文件中包含SQL語句,則必須要在源程序中定義一個(gè)SQLCA結(jié)構(gòu),而且名為SQLCA。最簡單的定義方法是在源文件中加入一些語句:EXEC SQL INCLUDE sqlca.h。每個(gè)數(shù)據(jù)庫產(chǎn)品都提供了SQLCA結(jié)構(gòu)。
1.4 什么是SQLDA?
我們知道,動(dòng)態(tài)SQL語句在編譯時(shí)可能不知道有多少列信息。在嵌入SQL語句中,這些不確定的數(shù)據(jù)是通過SQLDA完成的。SQLDA的結(jié)構(gòu)非常靈活,在該結(jié)構(gòu)的固定部分,指明了多少列等信息,在該結(jié)構(gòu)的后面有一個(gè)可變長的結(jié)構(gòu),說明每列的信息。在從數(shù)據(jù)庫獲得數(shù)據(jù)時(shí),就可以采用SQLDA來獲得每行的數(shù)據(jù)。各個(gè)數(shù)據(jù)庫產(chǎn)品的SQLDA結(jié)構(gòu)都不完全相同。
第二節(jié) SYBASE SQL Server嵌入式SQL語言
2.1 一個(gè)嵌入SQL語言的簡單例子
我們首先來看一個(gè)簡單的嵌入式SQL語言的程序(C語言):用sa(口令為password)連接數(shù)據(jù)庫服務(wù)器,并將所有書的價(jià)格增加10%。這個(gè)例子程序如下:
例1、
/*建立通訊區(qū)域*/
Exec sql include sqlca;
main()
{
/*聲明宿主變量*/
EXEC SQL BEGIN DECLARE SECTION;
char user[30],passwd[30];
EXEC SQL END DECLARE SECTION;
/*錯(cuò)誤處理*/
EXEC SQL WHENEVER SQLERROR CALL err_p();
/*連接到SQL SERVER服務(wù)器*/
printf("\nplease enter your userid ");
gets(user);
printf("\npassword ");
gets(passwd);
exec sql connect :user identified by :passwd;
exec sql use pubs2;
EXEC SQL update titles set price=price*1.10;
EXEC SQL commit work;
/*斷開數(shù)據(jù)庫服務(wù)器的連接*/
Exec sql disconnect all;
return (0);
}
/*錯(cuò)誤處理程序*/
err_p()
{
printf("\nError occurred: code %d.\n%s", \
sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
}
從上面這個(gè)例子,我們看出嵌入SQL的基本特點(diǎn)是:
1、每條嵌入式SQL語句都用EXEC SQL開始,表明它是一條SQL語句。這也是告訴預(yù)編譯器在EXEC SQL和“;”之間是嵌入SQL語句。
2、如果一條嵌入式SQL語句占用多行,在C程序中可以用續(xù)行符“\”,在Fortran中必須有續(xù)行符。其他語言也有相應(yīng)規(guī)定。
3、每一條嵌入SQL語句都有結(jié)束符號,如:在C中是“;”。
4、嵌入SQL語句的關(guān)鍵字不區(qū)分大小寫。
5、可以使用“/*….*/”來添加注釋。也可以使用“--”來添加注釋。
2.2 嵌入SQL的處理過程
嵌入SQL的處理過程如下圖所示:
圖6-1 SYBASE SQL SERVER嵌入SQL程序處理過程
嵌入SQL程序的后綴為.cp。嵌入SQL處理的第一步是預(yù)編譯。預(yù)編譯器(cpre.exe)處理過程分為兩個(gè)小步:
第一小步:語法分析。檢查嵌入SQL語句的語法正確性。
第二小步:增加一些預(yù)編譯器變量,并注釋了所有的嵌入的SQL語句,將嵌入SQL語句轉(zhuǎn)換為對client-library中函數(shù)的調(diào)用(注意:在連接時(shí),編譯后的代碼需要使用client-library中的庫文件)。如果在編譯時(shí),設(shè)置一些選項(xiàng),則生成存儲(chǔ)過程。預(yù)編譯后可能產(chǎn)生3個(gè)文件:一個(gè)C文件(肯定產(chǎn)生),一個(gè)列表文件(需要在編譯時(shí)設(shè)置選項(xiàng),才能產(chǎn)生)和一個(gè)isql腳本文件(需要在編譯時(shí)設(shè)置選項(xiàng),才能產(chǎn)生)。列表文件包含了輸入文件的源語句和一些警告信息和錯(cuò)誤信息。Isql腳本文件包含了預(yù)編譯器產(chǎn)生的存儲(chǔ)過程腳本文件。這個(gè)存儲(chǔ)過程是用T-SQL寫的。總之,預(yù)編譯器的處理方法是,注釋了嵌入的SQL語句,用一些特定的函數(shù)代替。
第二步是C源程序的編譯和鏈接。cl是編譯和鏈接命令的集成命令,編譯的結(jié)果是產(chǎn)生.obj,在鏈接時(shí),將C的系統(tǒng)庫和SQL Server提供的庫文件同目標(biāo)文件連接在一起。最后生成.exe。也可以使用SET LIB語句設(shè)置庫文件的環(huán)境信息。
2.3 嵌入SQL語句總覽
除了print、readtext和writetext外,大多數(shù)的Transact-SQL語句都可以在嵌入SQL中使用。嵌入SQL語句的語法為:“exec sql [at connection_name] sql_statement; ”。那么,你可以用Transact-SQL語句來替代sql_statement 就可以完成嵌入SQL的編寫。(同T-SQL相比,嵌入SQL提供了:自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換、動(dòng)態(tài)SQL、SQLCA數(shù)據(jù)結(jié)構(gòu)等功能。)
但是,也有一些嵌入式SQL所特有的語句,有些嵌入式SQL語句的名字同Transact-SQL語句相同,但是語句的語法有所不同。
嵌入SQL語句應(yīng)該包含五個(gè)步驟:
1)、通過SQLCA建立應(yīng)用程序和SQL SERVER的SQL通信區(qū)域。
2)、聲明宿主變量。
3)、連接到SQL SERVER。
4)、通過SQL語句操作數(shù)據(jù)。
5)、處理錯(cuò)誤和結(jié)果信息。
嵌入式SQL語句分為靜態(tài)SQL語句和動(dòng)態(tài)SQL語句兩類。下面我們按照功能講解這些語句。本節(jié)講解靜態(tài)SQL語句的作用。動(dòng)態(tài)SQL語句將在下一節(jié)講解。同動(dòng)態(tài)SQL相關(guān)的一些語句也在下一節(jié)中講解。
2.3.1 宿主變量
1)、聲明方法
宿主變量(host variable)就是在嵌入式SQL語句中引用主語言說明的程序變量(如例中的user[31]變量)。如:
EXEC SQL BEGIN DECLARE SECTION;
char user[31],passwd[31];
EXEC SQL END DECLARE SECTION;
…………
exec sql connect :user identified by :passwd;
………….
在嵌入式SQL語句中使用主變量前,必須采用BEGIN DECLARE SECTION 和END DECLARE SECTION之間給主變量說明。這兩條語句不是可執(zhí)行語句,而是預(yù)編譯程序的說明。主變量是標(biāo)準(zhǔn)的C程序變量。嵌入SQL語句使用主變量來輸入數(shù)據(jù)和輸出數(shù)據(jù)。C程序和嵌入SQL語句都可以訪問主變量。
另外,在定義宿主變量時(shí)也可以使用client-library定義的數(shù)據(jù)類型,如:CS_CHAR。這些定義存放在cspublic.h文件中。如:
EXEC SQL BEGIN DECLARE SECTION;
CS_CHAR user[30],passwd[30];
EXEC SQL END DECLARE SECTION;
client-library定義的數(shù)據(jù)類型共有:CS_BINARY、CS_BIT、 CS_BOOL、 CS_CHAR、 CS_DATETIME、CS_DATETIME4、 CS_DECIMAL、 CS_FLOAT、 CS_REAL、CS_IMAGE、 CS_INT、 CS_MONEY、 CS_MONEY4、 CS_NUMERIC、CS_RETCODE、 CS_SMALLINT、 CS_TEXT、 CS_TINYINT、CS_VARBINARY、 CS_VARCHAR、 CS_VOID。
為了便于識別主變量,當(dāng)嵌入式SQL語句中出現(xiàn)主變量時(shí),必須在變量名稱前標(biāo)上冒號(:)。冒號的作用是,告訴預(yù)編譯器,這是個(gè)主變量而不是表名或列名。不能在聲明時(shí),初始化數(shù)組變量。
由上可知,SYBASE SQL SERVER使用宿主變量傳遞數(shù)據(jù)庫中的數(shù)據(jù)和狀態(tài)信息到應(yīng)用程序,應(yīng)用程序也通過宿主變量傳遞數(shù)據(jù)到SYBASE數(shù)據(jù)庫。根據(jù)上面兩種功能,宿主變量分為輸出宿主變量和輸入宿主變量。在SELECT INTO和FETCH語句之后的宿主變量稱作“輸出宿主變量”,這是因?yàn)閺臄?shù)據(jù)庫傳遞列數(shù)據(jù)到應(yīng)用程序。如:
exec sql begin declare section;
CS_CHAR id[5];
exec sql end declare section;
exec sql select title_id into :id from titles
where pub_id = "0736" and type = "business";
除了SELECT INTO和FETCH語句外的其他SQL語句(如:INSERT、UPDATE等語句)中的宿主變量,稱為“輸入宿主變量”。這是因?yàn)閺膽?yīng)用程序向數(shù)據(jù)庫輸入值。如:
exec sql begin declare section;
CS_CHAR id[7];
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -