ESQL編程使用說明
ESQL編程使用說明
第一章 ESQL介紹
本章對ESQL做一概括介紹,主要討論怎麼使用ESQL、ESQL的基本的概念和定義、ESQL程序的各個部分和ESQL 程序中語句的類型.
SQL語言是非過程化語言,大部分語句的執行與其前面或後面的語句無關,而一些高級編程語言都是基於如循環,條件等結構的過程化語言,盡管SQL語言非常有力,但它卻沒有過程化能力.若把SQL語言嵌入到過程化的編程語言中,則利用這些結構,程序開發人員就能設計出更加靈活的應用系統,具有SQL語言和高級編程語言的良好特征,它將比單獨使用SQL或C語言具有更強的功能和靈活性.
COBASE RDBMS提供兩種工具在主語言中編程來存取COBASE數據庫中的數據.即高級語言預編譯程序接口(ESQL)和高級語言的函數調用接口(CCI).目前這些工具僅支持C語言.
COBASE RDBMS提供的ESQL工具把含有SQL語句的C程序轉化為可存取和操縱COBASE數據庫中數據的C程序,作為一編譯器,ESQL把輸入文件中的EXEC SQL 語句在輸出文件中轉化為適當的CCI函數調用.輸出文件則可以正常的C程序的方式被編譯、連接和執行.
1.1 ESQL中的基本概念
ESQL中的基本概念主要有:
1.嵌入的SQL語句:
嵌入的SQL語句是指在應用程序中使用的SQL語句.該應用程序稱作宿主程序,書寫該程序的語言稱作宿主語言.嵌入的SQL語句與交互式SQL語句在語法上沒有太大的差別,只是嵌入式SQL語句在個別語句上有所擴充.如嵌入式SQL中的SELECT語句增加了INTO子句,以便與宿主語言變量打交道.此外,嵌入式SQL為適合程序設計語言的要求,還增加了許多語句,如游標的定義、打開和關閉語句等等.
2.執行性SQL語句和說明性SQL語句:
嵌入的SQL語句主要有兩種類型:執行性SQL語句和說明性SQL語句.執行性SQL語句可用來連接COBASE,定義、查詢和操縱COBASE數據庫中的數據,每一執行性語句真正對數據庫進行操作 ,執行完成後,在USERCA中存放執行信息.說明性語句用來說明通訊域和SQL語句中用到的變量. 說明性語句不生成執行代碼,對USERCA不產生影響.
3.事務:
事務是邏輯上相關的一組SQL語句.COBASE把它們視作一個單元.為了保持數據庫的一
致性,一事務內的所有操作要麼都做,要麼都不做.
1.2 ESQL程序的組成和運行
在ESQL程序 中嵌入的SQL語句以EXEC作為起始標識,語句的結束以";"作為標識.在嵌入的SQL語句可以使用主語言(這時是C語言)的程序變量(即主變量),這時主變量名前加冒號(:)作為標志,以區別於字段名.
ESQL程序包括兩部分:程序首部和程序體.程序首部定義變量,為ESQL程序做准備, 程序體包括各種SQL語句來操縱COBASE數據庫中的數據.
編制並運行ESQL程序比單獨使用純C語言多一個預編譯過程,通常具有以下幾個步驟:
1.編輯ESQL程序(可利用編輯軟件如: EDLIN, WS等進行編輯).程序保後綴為.ec.
2.使用COBASE的預編譯器ETE對ESQL源程序進行預處理,該編譯器將源程序中嵌入的SQL語言翻譯成標准C語言,產生一個C語言編譯器能直接進 行編譯的文件.其文件的擴展名為.cpp。該cpp文件可以和普通的cpp文件一樣被放入一個工程中被C++編譯器編譯,連接最後運行。
對COBASE的預編譯器的使用的詳細說明見第六章.
第二章 ESQL 程序的基本結構
ESQL程序由兩部分組成:程序首部和程序體.
2.1 程序首部
每一個ESQL程序的開始,就是程序的首部,它包括以下三部分:
1.DECLARE部分:
說明特殊的主變量,這些變量區別於純C語言程序中的變量,COBASE使用這些變量與程序之間相互作用.
2.INCLUDE USERCA語句: 說明一個SQL語句的通訊域(USERCA),它提供了錯誤處理,
其功能等價於代替C語言中的#INCLUDE語句.
3.CONNECT語句: 建立程序與COBASE之間的連接.
2.1.1DECLARE部分:(描述部分)
在DECLARE SECTION (描述部分),定義所有在SQL語句中用到的主變量,定義部分是以:
EXEC SQL BEGIN DECLARE SECTION;
和 EXEC SQL END DECLARE SECTION;
開始和結束的.
在這兩個語句中,只可以定義 SQL 語句中用到的主變量,每個預編譯單元只允許一個BEGIN/END DECLARE SECTION (描述部分),但是一個程序可以包含許多獨立的預編譯單元。若一個主變量或指示變量在ESQL程序中的SQL語句中引用,但它沒有在 描述部分中定義,則程序在預編譯時就會出現錯誤信息.
在這兩個語 句中可以定義的變量有六種類型:INT,SHORT,CHAR,FLOAT,NUMBER,DATE.其中CHAR型允許定義二維數組,其它類型只允許定義一維數組,不允許有指針類型 ,在此處變量可以賦值.
例如:
EXEC SQL BEGIN DECLARE SECTION;
int sno;
char sname[11];
short snameid;
EXEC SQL END DECLARE SECTION;
(1)主變量:
就是用在SQL語句中的主語言變量.主要用於程序變量和數據庫內部交換數據之用,它們的數據類型必須是在主語言中描述部分裡定義過的,而且它們的數據類型必須和COBASE數據庫中已定義的表中的數據類型相匹配.
例如:
SELECT 姓名, 等級
FROM 供應商
INTO :sname, :status
WHERE 供應商號=:sno;
該語句表示,從供應商表中在供應商號與主變量sno一致的地方選擇供應商姓名和供應商等級,COBASE把結果傳送到主變量sname,status中.
主變量使用規則:
1.必須在描述部分明確定義.
2.必須使用與其定義相同的大小寫格式.
3.在SQL語句中使用主變量時必須在主變量前寫一個冒號":",在純C語言 語句中則不要在主變量前寫冒號.
4.不能是SQL命令的保 留字.
5.在一條語句中只能使用一次.
2.1.2 SQL通訊域
每個COBASE應用程序必須提供對錯誤 的處理,為了說明SQL通訊域(USERCA),必須在每個COBASE預編譯程序中寫上:
EXEC SQL INCLUDE USERCA;
USERCA是一結構,每一嵌入的執行性SQL語言的執行情況在其執行完成後寫入USERCA結構中的各變量中, 根據USERCA中的內容可以獲得每一嵌入SQL語句執行後的信息,編制程序時就可以做適當的處理.對其的詳細說明見第五章.
2.1.3 連接COBASE
在 存取COBASE數據之前,每一個預編譯程序必須與COBASE連接.連接時,程序必須提供用戶名和口令,由COBASE進行校驗,若口令和用戶名正確,方可登錄COBASE,獲得使用權,否則,COBASE拒絕登錄,
則程序就不能使用數據庫.缺省的用戶名為“cobase”,口令為“cobase”。 EXEC SQL CONNECT <用戶名>:<用戶口令>.
CONNECT語句必須是ESQL程序中第一條可執行的SQL語句.
2.2 程序體
程序體可以包含許多SQL語句,以查詢或處理存儲在COBASE數據庫中的數據.
在應用程序中所包含的SQL語句,可以查詢或操縱存儲在COBASE中的數據,這些語句叫
做數據操縱語言(DML),應用程序體也可以包含DDL語句,用來建立或定義數據結構,如表、視圖或索引.在用戶程序中寫入的任何有效的SQL語句都可以被執行,只需要把完整的SQL語句按嵌入式的要求寫入C語言的合適位置即可.嵌入在C語言中的SQL語句以EXEC SQL 開始,以";"為結束標志.SQL語句中可以嵌入主變量,主變量前應有":"標志.如下面例子都 是嵌入式SQL語句:
EXEC SQL UPDATE 供應商
SET 姓名=''李 紅''
WHERE 供應商號=''S1'';
/* 把供應商號是S1的供應商姓名改為 ''李 紅''*/
EXEC SQL INSERT INTO 供應商(供應商號,姓名,等級,城市)
VALUES((:sno,:sname,:status,:city));
/* 根據宿主變量值插入供應商表中 */
EXEC SQL DELETE FROM 供應商
WHERE 等級 IS NULL;
/*刪除供應商等級是空值的供應商*/
從上面例可以看出,靜態的增,刪,改語句與交互方式沒有太大的差別,對於查詢語句就沒有那麼簡單,查詢語句在下一章中介紹.
現用幾個例題程序加以說明.
例題程序1 (建立一表並向表中插入數據)
/*==============================================================================
This is a sample program which include SQL sentence about
CREATE ,INSERT a table.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
CHAR sno[10],sname[10],city[10];
INT status;
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
main()
{
int i;
EXEC SQL CONNECT "cobase:cobase" ;
EXEC SQL CREATE TABLE S_TEST /* Create a table named S_TEST */
(SNO CHAR (9),
SNAME CHAR (20),
STATUS INT ,CITY CHAR(10));
printf(" create table success,insert?");
printf(" 0 ---- no ");
printf(" 1 ---- yes ");
printf(" choice:");
scanf("%d",&i);
while(i)
{
printf("input sno:");
scanf("%s",sno);
printf("input sname:");
scanf("%s",sname);
printf("input status:");
scanf("%d",&status);
printf("input city:");
scanf("%s",city);
EXEC SQL INSERT INTO S_TEST(SNO,SNAME,STATUS,CITY)
VALUES ((:sno,:sname,:status,:city));
printf("continue?");
printf(" 0 ----terminate ");
printf(" 1 ----continue ");
printf(" choice:");
scanf("%d",&i);
}
EXEC SQL COMMIT;
EXEC SQL DISCONNECT; /*log off database*/
exit(0);
}
例題程序2 (修改和刪除表中的數據)
/*=============================================================================
This is a sample program which include SQL sentence about
UPDATE,DELETE a table.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
CHAR sno[10],sname[10],city[10];
INT status;
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
main()
{
int i;
printf("Now exec connect ...");
EXEC SQL CONNECT "COBASE:COBASE" ;
printf(" update?");
printf(" 0 ---- no ");
printf(" 1 ---- yes ");
printf(" choice:");
scanf("%d",
EXEC SQL UPDATE S_TEST SET sname=:sname,city=:city ,status=:status
WHERE sno=:sno;
printf(" continue?");
printf(" 0 ----no ");
printf(" 1 ----yes ");
printf(" choice:");
scanf("%d",&i);
}
printf(" delete?");
printf(" 0 ---- no ");
printf(" 1 ---- yes ");
printf(" choice:");
scanf("%d",&i);
while(i)
{
printf("input sno:");
scanf("%s",sno);
EXEC SQL DELETE FROM S_TEST WHERE sno=:sno;
printf(" continue?");
printf(" 0 ----no ");
printf(" 1 ----yes ");
printf(" chioce:");
scanf("%d",&i);
}
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
exit(0);
}
第三章 查 詢
在ESQL程序中,查詢可以分為兩大類型:返回一行的查詢和返回多行的查詢.對於查詢,我們不僅對其執行得成功與否感興趣,其結果更為有用.多行查詢要用到游標的概念,本章就介紹查詢語句和游標的概念和使用.
3.1 SELECT 語句
SELECT語句是用於完成查詢功能的SQL語句,查詢語句因為有返回的結果,故ESQL中的SELECT語句比SQL的SELECT語句多一INTO子句,INTO子句的主變量表對應於程序中主變量,用於存放查詢返回的結果.
SELECT語句格式如下:
EXEC SQL SELECT <列名> [,<列名>[,...]] INTO <主變量表>
FROM <表名> [,<表名>[,...]]
其中:1.檢索條件中允許有主變量和嵌套子查詢語句.
2.INTO後的主變量可以是數組.
3.主變量前要用":"標志.
執行該語句時,COBASE找出表中滿足檢索條件的行,並把結果傳送到INTO子句中所對應的主變量中.該語句的查詢結果可以是一行或多行.WHERE後的主變量叫輸入主變量,它提供了查詢所需的信息.INTO子句中的主變量叫輸出主變量,它保存SELECT語句運行後的結果.
例題程序3 (返回一行的查詢)
/*=============================================================================
This is a sample program which uses SELECT statement of Esql.
It is an example of how to do querIEs that return one row.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
INT status;
CHAR sno[10],sname[10],city[10],isno[10];
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
main()
{
EXEC SQL CONNECT "cobase:cobase" ; /* log into COBASE */
printf("input the sno for update:");
scanf("%s",sno);
EXEC SQL SELECT sno,sname,status,city
INTO :sno , :sname ,:status,:city
from S_TEST WHERE sno=:sno;
printf("sno: %s ;",sno);
printf("sname: %s ;",sname);
printf("status: %d ;",status);
printf("city: %s ;",city);
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
exit(0);
}
例題程序4 (返回多行的查詢)
/*=============================================================================
This is a sample program which uses SELECT statement of Esql.
It is an example of how to do querIEs that return more than
one row.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
INT status[10];
CHAR sno[10][10],sname[10][15],city[10][20],isno[10];
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
main()
{ int i;
EXEC SQL CONNECT "cobase:cobase" ; /* log into COBASE */
for(i=0;i<10;i++)
{
strcpy(sno[i],"ttttt");
strcpy(sname[i],"ttttt");
strcpy(city[i],
EXEC SQL SELECT sno,sname,status,city
INTO :sno , :sname ,:status,:city
from S_TEST;
printf("sno sname status city");
for(i=0;i<10;i++)
{ printf("%8s %8s %8d %8s ",sno[i],sname[i],status[i],city[i]);
getchar();
}
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
}
3.2 游標的使用
我們知道SQL語言是一種面向集合的語言,而普通的高級語言則是面向記錄的語言,要想使SQL語言能與宿主語言通訊,ESQL提供了游標操作,能把SQL的集合操作結果,按單個記錄方式取出,賦於主變量進行進一步的處理.
如果查詢結果返回多行或不知返回多少行,就可使用帶游標的SELECT語句.一個游標(CURSOR)是一個COBASE和ESQL使用的工作區域,COBASE使用這個工作區存放著一個查詢結果 .一個已命名的游標是和一條SELECT語句相關聯.一個游標必須首先定義(同一個查詢相關聯),然後用三條可運行的SQL語句使用游標,以操縱數據.四條操縱游標的命令如下:
.DECLRE CURSOR
.OPEN CURSOR
.FETCH
.CLOSE CURSOR
DECLARE CURSOR 語句用來定義一游標,此時游標處於關閉狀態.用OPEN CURSOR語句打開游標後,就可用它從相關的查詢中取出多於一行的結果.所有滿足查詢條件的行組成一個集合,叫做游標活動集.通過FETCH取操作,活動集中的每一行可以一個一個的返回,當查詢作完後,游標就可以用CLOSE CURSOR 語句關閉.
3.2.1DECLARE CURSOR 定義游標語句:
ESQL中的DECLARE CURSOR語句定義游標,賦給它一個與查詢相關的游標名.該語句的格式為:
EXEC SQL DECLARE <游標名> CURSOR FOR
<SELECT 語句> [FOR UPDATE];
其中:(1)SELECT語句應不含INTO子句.
(2)若無FOR UPDATE 則無法 執行UPDATE(定位)和DELETE(定位)語句.
定義游標的DECLARE語句必須出現在程序中對游標進行操作的所有語句之前, ESQL不能引 用沒有說明的游標,游標的定義范圍是整個程序.程序中可包含多個DECLARE語 句,這些語句定義了不同的游標,並把游標與不同的查詢聯系在一起,所以在同一個程序中的兩個DECLARE語句中不能說明同一個游標名.
3.2.2 OPEN CURSOR 打開游標語句
ESQL中OPEN CURSOR語句格式如下:
EXEC SQL OPEN <游標名>;
OPEN語句決定了滿足查詢的行的集合,游標處於打開狀態,它的活動集就是滿足WHERE子句條件的行的集合.這時,游標處在活動集的第一行的 前面.
3.2.3 FETCH CURSOR 語句
ESQL中的FETCH CURSOR語句讀出活動集中的行,並把結果送到輸出主變量,輸出主變量是在相關的FETCH語句中定義的.其 格式如下:
EXEC SQL FETCH <游標名> INTO <主變量表>;
游標必須先定義,然後再打開,只有當游標處於打開狀態時,才執行FETCH語句.在第一次運行FETCH時,游標從活動集的第一行前移到當前第一行,使這一行成為當前行.每次運行FETCH時游標在活動集中向前移,把選出的結果送到主變量表中指定的輸出主變量中.
如果游標活動集中是空的,或所有的行已經被取走,COBASE就返回一代碼.(USERCA.SQLCODE==2000).
游標只可在活動集中向前移動,COBASE無法取到已經用FETCH取過的行,要想再取這一行,就必須關閉游標,再重新打開它.
3.2.4 CLOSE CURSOR 關閉游標語句
當取完活動集中所有行後,必須關閉游標,以釋放與該游標的關的資源.其格式如下:
EXEC SQL CLOSE <游 標名>;
例題程序5 (使用游標的查詢)
/*=============================================================================
This is a sample program which uses Cursor.Include DECLARE,
OPEN,FETCH and CLOSE cursor name.
It is an example of how to do querIEs that return more than
one row.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
INT status;
CHAR sno[10],sname[15],city[20];
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
main()
{
int i;
printf("Now exec connect ...");
EXEC SQL CONNECT "cobase:cobase" ; /* log into COBASE */
printf("Now exec declare_open_fetch_close cursor ...");
/* Declare statement name ---"s1" for INSERT statement */
EXEC SQL DECLARE cursor1 CURSOR FOR SELECT * FROM S_TEST;
EXEC SQL OPEN cursor1 ;
printf("sno sname status city\n ");
do
{
EXEC SQL FETCH cursor1 INTO :sno,:sname,:status,:city ;
If (userca.sqlcode==2000) break;
printf("%8s %8s %8d %8s \n",sno,sname,status,city);
getchar();
}while(1);
EXEC SQL CLOSE cursor1 ;
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
}
3.3 定位修改和刪除語句
COBASE支持SQL格式" CURRENT OF CURSOR".這條語句將指向一個游標中最新取出的行,以用於修改和刪除操作.該語句必須在取操作之後使用 ,它等同於存儲一個ROWID,並使用它.其格式如下:
(1) EXEC SQL
UPDATE <表名>
SET <列名> = <值表達式> | NULL
[,<列名> = <值表達式> | NULL ....]
WHERE CURRENT OF <游標名> ;
(2) EXEC SQL
UPDATE <表名>
SET ( <列名表> ) = ( <子查詢> )
WHERE CURRENT OF <游標名> ;
(3) EXEC SQL DELETE FROM <表名>
WHERE CURRENT OF <游標名> ;
這些語句執行在游標名的當前行下更新或修改.其中在值表達式或子查詢中出現的主變量前應有":"標志.
例題程序6 (定位刪除)
/*==============================================================================
This is a sample program which uses DELETE STATEMENT at
CURRENT Cursor.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
INT status;
CHAR sno[10],sname[15],city[20];
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
main()
{
int i;
printf("Now exec connect ...");
EXEC SQL CONNECT "COBASE:COBASE" ;
printf("Now exec declare cursor ...");
EXEC SQL DECLARE cursor1 CURSOR FOR
SELECT sno,sname,status,city FROM S_TEST FOR UPDATE;
printf("Now exec open cursor ...");
EXEC SQL OPEN cursor1;
printf("sno sname status city\n");
for(;;)
{
printf("Now exec fetch cursor ...\n
EXEC SQL CLOSE cursor1;
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
}
例題程序7 (定位修改)
/*=============================================================================
This is a sample program which uses UPDATE STATEMENT at
CURRENT Cursor.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
INT status;
CHAR sno[10],sname[15],city[20];
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
main()
{
int i;
strcpy(sno,"ttttt");
strcpy(sname,"ttttt");
strcpy(city,"ttttt");
status=1000;
EXEC SQL CONNECT "cobase:cobase" ;
EXEC SQL DECLARE cursor1 CURSOR FOR
SELECT SNO, SNAME, STATUS,CITY FROM S_TEST FOR UPDATE;
EXEC SQL OPEN cursor1;
printf("sno sname status city\n");
for(;;)
{
EXEC SQL FETCH cursor1 INTO :sno,:sname,:status,:city;
if (userca.sqlcode==2000) break;
printf("%8s %8s %8d %8s \n",sno,sname,status,city);
/* Delete the first record that be fetched */
printf(" update current ?(0/1)");
scanf("%d",&i);
if (i==1)
{printf("input sno=");
scanf("%s",sno);
printf("\ninput sname=");
scanf("%s",sname);
printf("\ninput status=");
scanf("%d",&status);
printf("\ninput city=");
scanf("%s",city);
EXEC SQL UPDATE S_TEST SET sno=:sno,sname=:sname,status=:status,
city=:city
WHERE CURRENT of cursor1;
EXEC SQL COMMIT;
}
}
EXEC SQL CLOSE cursor1;
EXEC SQL COMMIT;
EXEC SQL DISCONNECT;
}
第四章 提交/回滾事務
本章定義一事務或叫邏輯工作單元.為了保證數據庫的一致性,在ESQL程序中,程序開發人員可以控制事務是否提交或回滾.一事務通常可以理解為一個完整程序對數據庫進行的所有操作.一個事務也可以理解為是一個邏 輯工作單元.
4.1 邏輯工作單元
一個邏輯工作單元是一組SQL語句和插入的主語言碼的集合.COBASE把它們作為一個整體來處理.
在邏輯工作單元這一級上,COBASE保證了數據的一致性,這就意味著要麼完成所有的操作,要麼每條語句都不執行.
如果在處理一個邏輯工作單元期間出現了系統或用戶程序失敗,那麼COBASE就自動把數據恢復到該邏輯工作單元開始之前的狀態,程序失敗時,COBASE檢測完錯誤就恢復數據,若系統故障,COBASE在重新啟動時恢復數據.
當遇 到第一個可執行的SQL語句(除了CONNECT)時,就隱含著一個邏輯工作單元的開始,COMMIT 和ROLLBACK語句結束一個邏輯工作單元.在ESQL程序中,說明語句並不開始一個邏輯單元.
COMMIT語句保證了當前邏輯單元上的所有操作都完整地提交給了數據庫.ROLLBACK語句取消對當邏輯工作單元所作的操作 ,把數據庫恢復到當前邏輯工作單元開始前的狀態.
4.2 COMMIT 語句
該語句結束當前邏輯工作單元,把在邏輯工作單元期們的所有變化提 交給數據庫 .其格式如下:
EXEC SQL COMMIT;
在程序結束之前,應該明確地結束它的工作單元,否則,若程序成功結束後,COBASE自動提交所有的變換,若程序非正常結束,就恢復到最近 沒有提交的邏輯工作單元.
COMMIT語句不影響主變量的內容 或主程序的控制流.
每條DDL語句的執行,自動發出COMMIT操作,這就是說 ,DDL語句跟在DML語句後面,那麼以前的DML語句就自動提交組數據庫.一個DDL語句結束當前邏輯工作單元,釋放該程序擁有的所有鎖.
4.3 ROLLBACK語 句
該語句將數據庫恢復到當前邏輯工作單元之前的狀態,結束當前的邏輯工作單元.該語
句不影響主變量的內容或主程序的控制流.其格式如下:
EXEC SQL ROLLBACK;
4.4 DISCONNECT 語句
當應用程序不再使用COBASE數據庫時,應該使用DISCONNECT語句釋放程序所有與COBASE數據庫有關的資源,並退出數據庫,脫離COBASE環境.其格式如下:
EXEC SQL DISCONNECT;
第 五 章 錯誤檢測和恢復
本章我們介紹如何使用USERCA來進行錯誤檢測和處理。
5.1 USERCA的結構
USERCA是ESQL程序用來傳送執行信息的結構,每執行完一條執行性SQL語句, COBASE都把執行信息寫入USERCA中,對於說明性SQL語句,則無執行信息.謹慎的程序員應該在每一SQL語句執行完成後,檢查USERCA結構中內容來確信語句的執行是否成功,並根據其中的信息作適當的處理.在ESQL中,USERCA的結構如下:
typedef struct
char caid[10]; /* userca ID
struct user_com_area userca;
該結構的各元素的意義描述如下:
userca.caid 通訊區標識.
userca.calen 通訊區長度.
userca.sqlcode 記錄每一SQL語句執行完成情況.其取值如下:
0 表示執行成功.
2000 表示沒有返回行或最後一行已取完.
userca.sqltype SQL語句的類型.
userca.sqlerrmlen 執行SQL語句錯誤 信息的長度.
userca.sqlerrmtext 執行SQL語句錯誤 信息的正文.
userca.sqlreturnflag
userca.sqlpl
userca.sqlcoml
uaseca.sqltotal
userca.sqlwarn
userca.sqlwarn[0] 警告檢查位;
userca.sqlwarn[1] 返回值截斷警告;
userca.sqlwarn[2] 在集函數中忽略空值警告;
userca.sqlwarn[3] SELECT_LIST 個數與 INTO 子句項
個數不符的警告;
userca.sqlwarn[4] DML操作涉及每一行的警告;
userca.sqlwarn[5] SQL語句引起事務回滾的警告;
userca.sqlwarn[6] DELETE語句對於FOR_UPDATE的行操作警告;
userca.sqlstsave
第六章 使用說明書
Cobase支持兩種方式對數據庫中的數據進行訪問—交互方式和嵌入C程序(ESQL)的方式。Cobase采用的是Client/Server結構,ClIEnt端將對數據庫的各種訪問請求發送到服務器方,交由服務器方處理。服務器對發送來的請求進行分析和處理,然後將執行結果發送回Client端。交互式(ISQL)和嵌入式C程序都是運行在ClIEnt端的進程,通過以網絡方式和服務器建立連接來進行通訊。下面簡要介紹這兩種方式的使用。
一.啟動Cobase:
無論使用這兩種方式中的哪一種,在和數據庫進行交互之前都要首先啟動Cobase的DBMS。
?;啟動Cobas的DBA進程:運行Cobase.exe將啟動Cobase的DBA,這時屏幕將出現兩個窗口,一個是控制窗口,一個是消息窗口。控制窗口用於完成對系統的控制,包括初始化系統,選擇和系統的連接方式,及斷開連接,退出系統等。以後的用戶操作都在控制窗口中進行,消息窗口只用於顯示一些系統信息。
?;初始化系統:第一次啟動Cobase需對系統初始化。選中主菜單中的File菜單項,在彈出的子菜單中選中Initialize,在彈出的對話框中選中“確定”即可完成對系統的初始化。該步驟只需在第一次進入系統時調用,或當你認為需要清除系統中已存在的所有數據,對整個系統初始化時使用。
?;選擇和Cobase DBMS的連接方式:在控制窗口的主菜單中選中File,在彈出的子菜單中選擇NetWork Share,以網絡方式和Cobase建立連接。在彈出的對話框提示DBA啟動成功後,進入下一步。
二.退出Cobase:
?;Cobase DBA Shutdown:在退出Cobase之前將DBA Shutdown。選中File菜單項,在彈出的子菜單中選擇Normal Shutdown,那麼DBA將shutdown。如果ClIEnt端的進程非正常終止,則選擇Immediate Shutdown。
三.交互式SQL(Interactive SQL)訪問
交互式SQL提供了一種交互式的方法對數據庫中的數據進行訪問。在交互式的界面中只能執行交互式的SQL語句—DDL語句,DML語句,COMMIT和ROLLBACK。並且DML語句中不能含有主變量。交互式SQL不支持游標。ISQL將輸入的SQL語句發送給服務器方執行,最後負責從服務器方將數據取回來,顯示在交互式的界面中。
?;啟動ISQL:執行SISQL.EXE,啟動ISQL。
?;登錄到Cobase:在彈出的窗口菜單中選擇FILE,然後選擇Logon子菜單項進行登錄。登錄的用戶名為cobase,口令也為cobase。
?;進入SQL命令狀態:在產生的窗口中,由三部分組成。第一部分標記為SQL data,用於對查詢結果的顯示。第二部分標記為Statistics,用於顯示對SQL語句執行結果的反饋信息。第三部分標記為SQL Command,用於輸入要求執行的SQL語句。首先在SQL Command中輸入“SQL”,要求以下進入SQL語句的執行狀態。
?;執行SQL語句:在SQL Command編輯框中輸入要求執行的SQL語句,一次一條,每個語句要求以分號結束。輸入完畢後,單擊“Execute”語句即被執行,執行結果將在SQL data或Statistics中被顯示。
?;退出ISQL:在SQL Command中輸入“logout”,即可退出ISQL,同時也將關閉服務器方的shadow進程。
四.嵌入式SQL(Enbeded SQL)編程方式
嵌入式SQL在前面的章節中已經介紹了。我們把在C語言中嵌入SQL語句的程序簡稱為EC程序。開發一個EC程序的基本步驟如下:
1.編輯ESQL程序:可以使用文本編輯器如VC的編輯器編制一個ESQL程序,以.ec作為文件的擴展名。
2.預編譯:使用COBASE的預編譯器ETE對ESQL源程序進行預處理,該編譯器將源程序中嵌入的SQL語句翻譯成C++語言形式的對Cobase庫函數的調用,生成文件的擴展名為.cpp.
啟動ETE.exe,在彈出的對話框中,輸入要進行預處理的.ec文件。(該文件本身要以.ec結尾,但在這裡輸入的文件名無須加上.ec後綴,預編譯器會自動查找以.ec結尾的同名文件。)
ETE 的調用格式為:
ETE <filename>
<filename> 為含有嵌入式SQL語句(ESQL)的C/C++語言文本文件名;
3.生成項目:創建一個相應的項目,將預編譯生成的.cpp文件加入到該項目中。
4.項目設置:選中VC的Project/setting,在彈出的對話框中選擇Link標簽。
在Object/Library Modules文本框中加入庫文件wetelib.lib,wccilib.lib;
選中Tools/Options,在彈出的對話框中選擇DirectorIEs/Library files,設置 各庫文件的路徑。
5.運行:
?;啟動Cobas:運行Cobase.exe將啟動Cobase,這時屏幕將出現兩個窗口,一個是控制窗口,一個是消息窗口。控制窗口用於完成對系統的控制,包括初始化系統,選擇和系統的連接方式,及斷開連接,退出系統等。以後的用戶操作都在控制窗口中進行,消息窗口只用於顯示一些系統信息。
?;初始化系統:第一次啟動Cobase需對系統初始化。選中主菜單中的File菜單項,在彈出的子菜單中選中Initialize,即可完成對系統的初始化。該步驟只需在第一次進入系統時調用,或當你認為需要清除系統中已存在的所有數據,對整個系統初始化時使用。
?;和Cobase建立連接:在控制窗口的主菜單中選中File,在彈出的子菜單中選擇NetWork Share,和Cobase建立連接。
?;運行你的應用程序
6.Shutdown:在應用程序終止之後,選擇File/NormalShutdown,和DBMS斷開連接。如果你應用程序非正常終止,那麼選擇File/ImmediateShutdown。重新建立連接只要再選中NetWork Share即可,無須退出Cobase。
7.退出系統:成功Shutdown之後,選擇File/Exit退出Cobase。
補充說明
本次數據庫上機實習的主要目的是熟悉關系數據庫的設計和實現的基本原理,掌握使用EC編程的基本方法。
Cobase是數據庫教研室正在研制開發的第一個國產關系數據庫管理系統,它還存在著很多不完善的地方,如果給大家的使用帶來了一定的困難,希望大家能夠諒解。把Cobase作為本次上機實習的教學軟件,我們是經過研究考慮的。Cobase雖然在很多方面不夠完善和堅固,對有些功能不能給予很好的支持,但是對於一般數據庫的基本操作還是可以完成的。對本次上機實習來說,Cobase提供的功能是完全可以滿足作業提出的所有要求的。Cobase EC提供的基本功能和使用方法在ESQL.DOC中有詳細說明,大家可以參照其中給出的例子程序編制自己的應用程序。在完成作業之余,歡迎大家對其中基本功能存在的不足提出寶貴意見。
另外有幾個問題需要大家注意:
1.在該版本中,ISQL和EC應用程序不能同時啟動;
2.用NOTEPAD編輯的文件缺省以.txt結尾,所以預編譯器找不到,請大家用VC的編輯器編輯,並存為.ec結尾的文件。
3.在Cobase初始化的時候需要申請足夠的空間,所以請大家檢查Cobase所在的盤是否有足夠的空間。
4.在運行過程中如果出現了意外操作,建議大家先將Cobase Immediate Shutdown,再重新啟動。
5.COBASE程序目錄COBASE應放在某一分區的根目錄下,並且用戶的應用程序必須與COBASE目錄在同一分區下。
6.COBASE ISQL界面中用到了一個MicroSoft的控件msflxgrd.ocx,如果目標機上沒有的話,應把該文件拷貝到系統目錄 /Windows/system32/ 下。該文件包含在cobase.zip中。
這次上機實習題目的要求都很基本,鑒於Cobase所提供功能的局限,希望大家不要把過多的精力放在優化和界面等方面。希望大家上機順利,如果有問題請多於我們聯系。我們的Email地址是 [email protected] , [email protected], [email protected] .