Ph n khai bỏo (DECLARE) ầ

Một phần của tài liệu Tài liệu Giáo trình Ngôn ngữ SQL docx (Trang 101)

L IM ĐU ỞẦ

3.1.3 Ph n khai bỏo (DECLARE) ầ

Đ khai bỏo nh ng bi n dựng chung, chỳng ta đ t nh ng khai bỏo c aể ữ ế ặ ữ ủ chỳng gi a hai cõu l nh SQL nhỳng:ữ ệ

………

EXEC SQL END DECLARE SECTION;

Nh ng gỡ xu t hi n gi a chỳngữ ấ ệ ữ được g i là ph n khai bỏo. D ng c aọ ầ ạ ủ nh ng khai bỏo bi n trong ph n khai bỏo là t t c m i th mà ngụn ngữ ế ầ ấ ả ọ ứ ữ ch yờu c u. H n n a, nú ch cú nghĩa đ i v i khai bỏo cỏc bi n cú ki uủ ầ ơ ữ ỉ ố ớ ế ể mà c ngụn ng ch và SQL cú th giao ti p, ch ng h n nh s nguyờn,ả ữ ủ ể ế ẳ ạ ư ố s th c, và xõu ký t ho c m ng.ố ự ự ặ ả

Vớ d 3.1ụ : Nh ng cõu l nh sau đõy cú th xu t hi n trong m t hàm Cữ ệ ể ấ ệ ộ c p nh t quan h Đ NV :ậ ậ ệ Ơ Ị

EXEC SQL BEGIN DECLARE SECTION; INT Mós INT, CHAR Tờn[15];ố char SQLSTATE[6];

EXEC SQL END DECLARE SECTION;

Cỏc dũng l nh đ u và cu i là quy đ nh đ b t đ u và k t thỳc ph nệ ầ ố ị ể ắ ầ ế ầ khai bỏo. gi a là m t dũng l nh khai bỏo hai bi n Mós và Tờn. ChỳngỞ ữ ộ ệ ế ố là m t s nguyờn và m t m ng ký t và, nh chỳng ta s th y, chỳng cúộ ố ộ ả ự ư ẽ ấ th để ượ ử ục s d ng đ l u gi m t mó s và tờn c a m t đ n v để ư ữ ộ ố ủ ộ ơ ị ược đ aư vào trong m t b và độ ộ ược chốn vào trong quan h Đ NV . Dũng l nh thệ Ơ Ị ệ ứ ba khai bỏo SQLSTATE là m t m ng sỏu ký t .ộ ả ự

3.1.4 S d ng cỏc bi n dựng chung.ử ụ ế

M t bi n dựng chung cú th độ ế ể ược s d ng trong cỏc cõu l nh SQL ử ụ ệ ở nh ng v trớ chỳng ta mu n ho c đữ ị ố ặ ược phộp đ t m t h ng. Nh c l i r ngặ ộ ằ ắ ạ ằ nh ng bi n dựng chung cú m t d u hai ch m đ t trữ ế ộ ấ ấ ặ ước nú khi s d ng.ử ụ Đõy là m t vớ d trong đú chỳng ta s d ng cỏc bi n c a Vớ d 3.1 nh làộ ụ ử ụ ế ủ ụ ư nh ng thành ph n c a m t b đữ ầ ủ ộ ộ ược chốn vào trong quan h Đ NV .ệ Ơ Ị

Vớ d 3.2ụ : Trong Hỡnh 3.2 là m t minh h a c a m t hàm C getDonviộ ọ ủ ộ nh c ngắ ười dựng cho mós và tờn c a m t đ n v , đ c tr l i và chốn bố ủ ộ ơ ị ọ ả ờ ộ thớch h p vào Đ NV . Dũng (1) đ n dũng (4) là nh ng khai bỏo chỳng taợ Ơ Ị ế ữ đó được h c trong Vớ d 3.1. Chỳng ta b qua cỏc l nh c a C yờu c u đ aọ ụ ỏ ệ ủ ầ ư cỏc giỏ tr vào hai bi n Mós và Tờn. Sau đú, trong cỏc dũng (5) và (6) làị ế ố

m t cõu l nh SQL nhỳng, đú là m t cõu l nh INSERT thụng thộ ệ ộ ệ ường. L nhệ này cú t khúa EXEC SQL đi trừ ước đ ch ra r ng nú qu th c là m t cõuể ỉ ằ ả ự ộ l nh SQL nhỳng ch khụng ph i là m t cõu l nh C sai ng phỏp. B ti nệ ứ ả ộ ệ ữ ộ ề x lý đử ược đ ngh trong Hỡnh 3.1 s tỡm ki m EXEC SQL đ phỏt hi nề ị ẽ ế ể ệ nh ng cõu l nh ph i đữ ệ ả ược ti n x lý.ề ử

Nh ng giỏ tr đữ ị ược cỏc dũng (5) và (6) chốn vào khụng ph i là cỏc h ngả ằ rừ ràng. Nh ng giỏ tr xu t hi n trong dũng (6) là nh ng bi n dựng chungữ ị ấ ệ ữ ế mà giỏ tr hi n th i c a chỳng tr thành nh ng thành ph n c a b đị ệ ờ ủ ở ữ ầ ủ ộ ược chốn.

Cựng v i cõu l nh INSERT cũn cú nhi u ki u cõu l nh SQL khỏc cúớ ệ ề ể ệ th để ược nhỳng vào trong m t ngụn ng ch , chỳng s d ng nh ng bi nộ ữ ủ ử ụ ữ ế dựng chung nh m t giao di n. M i cõu l nh nhỳng SQL cú cỏc t khúaư ộ ệ ỗ ệ ừ EXEC SQL đi trước trong chương trỡnh ngụn ng ch và cú th thamữ ủ ể chi u đ n cỏc bi n dựng chung trong v trớ c a cỏc h ng. Cõu l nh SQLế ế ế ị ủ ằ ệ b t kỳ khụng tr v m t k t qu (t c là, khụng ph i là m t truy v n) cúấ ả ề ộ ế ả ứ ả ộ ấ th để ược nhỳng. Nh ng vớ d v nh ng cõu l nh SQL cú th nhỳng đữ ụ ề ữ ệ ể ược bao g m nh ng cõu l nh xúa và c p nh t và nh ng cõu l nh đ t o, s a,ồ ữ ệ ậ ậ ữ ệ ể ạ ử ho c xúa nh ng thành ph n lặ ữ ầ ược đ ch ng h n nh cỏc b ng và cỏcồ ẳ ạ ư ả khung nhỡn.

Void getDONVI() {

1) EXEC SQL BEGIN DECLARE SECTION; 2) INT Mós INT, CHAR Tờn[15];ố 3) char SQLSTATE[6];

4) EXEC SQL END DECLARE SECTION;

/* Cỏc cõu l nh C yờu c u nh p d li u cho Mós và Tờn */ệ ầ ậ ữ ệ ố 5) EXEC SQL INSERT INTO Đ NV (Mós ĐV, TờnĐV)Ơ Ị ố 6) VALUES(:Mó s ,:Tờn) }ố

Hỡnh 3.2: Minh h a vớ d 3.2ọ ụ

h p”. Cỏc truy v n đ a ra k t qu là nh ng t p h p cỏc b , trong khiợ ấ ư ế ả ữ ậ ợ ộ khụng cú m t ngụn ng ch nào h tr ki u d li u t p h p m t cỏchộ ữ ủ ỗ ợ ể ữ ệ ậ ợ ộ tr c ti p. Do v y, SQL nhỳng ph i s d ng m t trong hai k thu t đ k tự ế ậ ả ử ụ ộ ỹ ậ ể ế n i k t qu c a cỏc truy v n v i m t chố ế ả ủ ấ ớ ộ ương trỡnh ngụn ng ch .ữ ủ

1. M t truy v n đ a ra m t b đ n cú th cú b đú độ ấ ư ộ ộ ơ ể ộ ượ ưc l u tr trongữ cỏc bi n dựng chung, m t bi n cho m i thành ph n c a b . Đ làm nhế ộ ế ỗ ầ ủ ộ ể ư v y, chỳng ta s d ng m t d ng s a đ i c a cõu l nh select-from-whereậ ử ụ ộ ạ ử ổ ủ ệ được g i là m t select đ n-hàng (single-row select).ọ ộ ơ

2. Cỏc truy v n t o ra nhi u h n m t b cú th đấ ạ ề ơ ộ ộ ể ược th c hi n n uự ệ ế chỳng ta khai bỏo m t con tr cho truy v n.Con tr duy t qua t t c cỏcộ ỏ ấ ỏ ệ ấ ả b trong quan h tr l i, và m i b cú th l n lộ ệ ả ờ ỗ ộ ể ầ ượ ượt đ c đ t vào trongặ nh ng bi n dựng chung và đữ ế ược x lý b i chử ở ương trỡnh ngụn ng ch .ữ ủ

Chỳng ta s xem xột l n lẽ ầ ượ ừt t ng k thu t m t.ỹ ậ ộ

3.1.5 Cỏc cõu l nh Select đ n hàngệ ơ

Khuụn m u c a m t select đ n hàng cũng gi ng nh m t cõu l nhẫ ủ ộ ơ ố ư ộ ệ select-from-where bỡnh thường, ngo i tr r ng theo sau m nh đ SELECTạ ừ ằ ệ ề là t khúa INTO và m t danh sỏch cỏc bi n dựng chung. Nh ng bi n dựngừ ộ ế ữ ế chung cú cỏc d u hai ch m đi trấ ấ ước, nh là trư ường h p cho t t c nh ngợ ấ ả ữ bi n dựng chung trong m t cõu l nh SQL. N u k t qu c a truy v n làế ộ ệ ế ế ả ủ ấ m t b đ n, cỏc thành ph n c a b này s tr thành cỏc giỏ tr c a nh ngộ ộ ơ ầ ủ ộ ẽ ở ị ủ ữ bi n dựng chung. N u k t qu ho c là khụng cú b ho c cú nhi u h nế ế ế ả ặ ộ ặ ề ơ m t b , thỡ s khụng cú phộp gỏn nào cho cỏc bi n dựng chung độ ộ ẽ ế ược th cự hi n, và m t mó l i thớch h p đệ ộ ỗ ợ ược ghi vào bi n SQLSTATE.ế

Vớ d 3.3:ụ Chỳng ta s vi t m t hàm C đ đ c tờn c a m t đ n v và inẽ ế ộ ể ọ ủ ộ ơ ị ra lương c a ngủ ười qu n lý đ n v . M t phỏc h a c a hàm này đả ơ ị ộ ọ ủ ược thể hi n trong Hỡnh 3.3. Nú b t đ u v i m t ph n khai bỏo, dũng (1) đ n dũngệ ắ ầ ớ ộ ầ ế (5), cho nh ng bi n chỳng ta s c n đ n. Ti p theo là cỏc cõu l nh C yờuữ ế ẽ ầ ế ế ệ c u nh p vào Tờnđ nv (cỏc l nh này khụng đầ ậ ơ ị ệ ược vi t rừ).ế

Dũng (6) đ n (9) là cõu l nh select đ n hàng. Nú hoàn toàn tế ệ ơ ương t cỏcự truy v n chỳng ta đó đấ ược bi t. Hai đi u khỏc bi t đú là giỏ tr c a bi nế ề ệ ị ủ ế

Tờnđ nv đơ ị ượ ử ục s d ng thay cho m t h ng xõu trong đi u ki n c a dũngộ ằ ề ệ ủ (9), và cú m t m nh đ INTO dũng (7) cho chỳng ta bi t n i đ t k tộ ệ ề ở ế ơ ặ ế qu c a truy v n. Trong trả ủ ấ ường h p này, chỳng ta mong đ i m t b đ n,ợ ợ ộ ộ ơ và cỏc tuple ch cú m t thành ph n cho thu c tớnh Lỉ ộ ầ ộ ương. Giỏ tr c a m tị ủ ộ thành ph n này c a m t b đầ ủ ộ ộ ược l u tr trong bi n chia dựng chungư ữ ế LuongNQL.

void printLuong() {

1) EXEC SQL BEGIN DECLARE SECTION; 2) char Tendonvi[15];

3) int LuongNQL; 4) char SQLSTATE[6];

5) EXEC SQL END DECLARE SECTION;

/* Cỏc l nh C yờu c u nh p giỏ tr cho Tendonvi */ ệ ầ ậ ị 6) EXEC SQL SELECT Lương

7) INTO:LuongNQL 8) FROM NHÂNVIấN, Đ NVƠ Ị

9) WHERE NHÂNVIấN.Mós NV = Đ NV .Mó s NQL ố Ơ Ị ố AND TờnĐV =:Tendonvi;

/* Cỏc l nh C ki m tra xem cú ph i SQLSTATE ch a toàn s 0 hayệ ể ả ứ ố khụng. N u đỳng thỡ in ra giỏ tr c a LuongNQL */ế ị ủ }

Hỡnh 3.3: M t select đ n hàng độ ơ ược nhỳng vào m t hàm Cộ

3.1.6 Con trỏ

Cỏch linh ho t nh t đ k t n i cỏc truy v n SQL t i m t ngụn ng chạ ấ ể ế ố ấ ớ ộ ữ ủ là dựng m t con tr ch y qua cỏc b c a m t quan h . Quan h này cú thộ ỏ ạ ộ ủ ộ ệ ệ ể là m t b ng độ ả ượ ưc l u tr , ho c nú cú th là m t b ng do m t truy v nữ ặ ể ộ ả ộ ấ sinh ra. Đ t o và s d ng m t con tr , chỳng ta c n nh ng cõu l nh sauể ạ ử ụ ộ ỏ ầ ữ ệ đõy:

1. M t khai bỏo con tr . Hỡnh th c đ n gi n nh t c a m t khai bỏo conộ ỏ ứ ơ ả ấ ủ ộ tr bao g m:ỏ ồ

(a) M t m đ u EXEC SQL, gi ng nh t t c nh ng cõu l nh SQLộ ở ầ ố ư ấ ả ữ ệ nhỳng.

(b) T khúa DECLARE.ừ (c) Tờn c a con tr .ủ ỏ

(d) Cỏc t khúa CURSOR FOR.ừ

(e) M t bi u th c nh m t tờn quan h ho c m t bi u th c select-ộ ể ứ ư ộ ệ ặ ộ ể ứ from-where mà giỏ tr c a nú là m t quan h . Con tr đị ủ ộ ệ ỏ ược khai bỏo duy t qua cỏc b c a quan h này; nghĩa là, con tr l n lệ ộ ủ ệ ỏ ầ ượt tham chi u t i m i b c a quan h này, nh là chỳng ta “l y ra”ế ớ ỗ ộ ủ ệ ư ấ b ng vi c s d ng con tr .ằ ệ ử ụ ỏ

T ng quỏt, d ng c a m t khai bỏo con tr là:ổ ạ ủ ộ ỏ

EXEC SQL DECLARE <con tr > CURSOR FOR <truy v n>ỏ ấ 2. M t cõu l nh EXEC SQL OPEN ti p theo sau là tờn con tr . Cõu l nhộ ệ ế ỏ ệ này kh i t o con tr đ n m t v trớ n i nú đó s n sàng đ l y ra b đ uở ạ ỏ ế ộ ị ơ ẵ ể ấ ộ ầ tiờn c a quan h mà con tr s đi qua trờn đú.ủ ệ ỏ ẽ

3. M t ho c nhi u s d ng c a cõu l nh FETCH. M c đớch c a m tộ ặ ề ử ụ ủ ệ ụ ủ ộ l nh FETCH là đ nh n b ti p theo c a quan h mà con tr đi qua trờnệ ể ậ ộ ế ủ ệ ỏ đú. N u cỏc b đó đế ộ ược vột c n thỡ khụng cú b nào đạ ộ ược tr v , và giỏ trả ề ị c a SQLSTATE đủ ược thi t l p thành ‘02000’, m t mó cú nghĩa là “khụngế ậ ộ tỡm th y b ”. Cõu l nh FETCH bao g m nh ng thành ph n sau đõy:ấ ộ ệ ồ ữ ầ

(a) Cỏc t khúa EXEC SQL FETCH FROM.ừ (b) Tờn c a con tr .ủ ỏ

(c) T khúa INTO.ừ

(d) M t danh sỏch cỏc bi n dựng chung, độ ế ược phõn cỏch b i cỏc d uở ấ ph y. N u cú m t b đ l y ra, thỡ nh ng thành ph n c a b nàyả ế ộ ộ ể ấ ữ ầ ủ ộ được đ t trong nh ng bi n đú, theo th t .ặ ữ ế ứ ự

EXEC SQL FETCH FROM <con tr > INTO <danh sỏch cỏc bi n>ỏ ế

4. Cõu l nh EXEC SQL CLOSE sau đú là tờn c a con tr . Cõu l nh này đúngệ ủ ỏ ệ

con tr , bõy gi nú khụng cũn đi qua trờn cỏc b c a quan h n a. Tuy nhiờn núỏ ờ ộ ủ ệ ữ

cú th để ược kh i t o l i b i cõu l nh OPEN khỏc, trong trở ạ ạ ở ệ ường h p đú, m t l nợ ộ ầ

n a nú l i duy t qua cỏc b c a quan h này.ữ ạ ệ ộ ủ ệ

Vớd 3.4ụ : Gi s chỳng ta mong mu n đ m xem cú bao nhiờu nhõn viờnả ử ố ế cú lương g m 1 ch s , 2 ch s , 3 ch s ,.v..v ... Chỳng ta s thi t kồ ữ ố ữ ố ữ ố ẽ ế ế m t truy v n l y ra trộ ấ ấ ường Lương c a t t c cỏc b NHÂNVIấN đ a vàoủ ấ ả ộ ư m t bi n dựng chung g i là LuongNV. M t con tr độ ế ọ ộ ỏ ược g i làọ execCursor s duy t qua t t c nh ng b cú m t thành ph n đú. M i l nẽ ệ ấ ả ữ ộ ộ ầ ỗ ầ m t b độ ộ ược l y ra, chỳng ta tớnh s cỏc ch s trong bi n nguyờnấ ố ữ ố ế LuongNV và gia tăng ph n t tầ ử ương ng c a m t m ng Đ mứ ủ ộ ả ế

Hàm C H nglạ ương b t đ u trong dũng (1) c a Hỡnh 3.4. Dũng (2) khaiắ ầ ủ bỏo m t s bi n ch độ ố ế ỉ ược hàm C s d ng, SQL nhỳng khụng s d ng.ử ụ ử ụ M ng Đ m l u gi s lả ế ư ữ ố ượng cỏc nhõn viờn ; bi n Ch s đ m s lế ữ ố ế ố ượng cỏc ch s trong m t giỏ tr Lữ ố ộ ị ương, và i là m t ch s duy t qua cỏc ph nộ ỉ ố ệ ầ t c a m ng Đ m.ử ủ ả ế

1) void H nglạ ương () { 2) i, Chuso, Dem[15];

3) EXEC SQL BEGIN DECLARE SECTION; 4) int LuongNV;

5) char SQLSTATE[6];

6) EXEC SQL END DECLARE SECTION;

7) EXEC SQL DECLARE execCursor CURSOR FOR 8) SELECT Lương FROM NHÂNVIấN

9) EXEC SQL OPEN execCursor; 10) for (i=0; i<15; i++) Dem[i] = 0; 11) while (1) {

12) EXEC SQL FETCH FROM execCursor INTO:LuongNV; 13) if (NO_MORE_TUPLES) break;

14) Chuso = 1;

15) while((LuongNV /= 10) > 0) Chuso++;

16) if(Chuso <= 14) Dem[Chuso]++; } 17) EXEC SQL CLOSE execCursor ;

19) printf(“chuso = %d: so nhan vien = %d\n”, i, Dem[i]); }

Hỡnh 3.4 Đ m s nhõn viờn cú lế ố ương g m 1 ch s , 2 ch s , ….ồ ữ ố ữ ố

Dũng (3) đ n (6) là m t ph n khai bỏo SQL đú bi n dựng chung LuongNV vàế ộ ầ ở ế

SQLSTATE thường dựng được khai bỏo. Dũng (7) và (8) khai bỏo execCursor là m t con tr duy t qua nh ng giỏ tr độ ỏ ệ ữ ị ược truy v n trờn dũng (8) cung c p.Truyấ ấ

v n này đ n gi n là yờu c u nh ng thành ph n Lấ ơ ả ầ ữ ầ ương c a t t c cỏc b trongủ ấ ả ộ

NHÂNVIấN. Con tr này sau đú đỏ ược m dũng (9). Dũng (10) hoàn thi n vi cở ở ệ ệ

kh i t o b ng vi c gỏn 0 cho cỏc ph n t c a m ng Dem.ở ạ ằ ệ ầ ử ủ ả

Cụng vi c chớnh đệ ược làm b i vũng l p dũng (11) đ n dũng (16). ở ặ ở ế Ở dũng (12) m t b độ ộ ượ ấc l y ra đ t vào trong bi n dựng chung LuongNV.ặ ế Khi nh ng b do truy v n c a dũng (8) tuple cung c p ch cú m t thànhữ ộ ấ ủ ấ ỉ ộ ph n, chỳng ta ch c n m t bi n dựng chung m c dự trong trầ ỉ ầ ộ ế ặ ường h pợ t ng quỏt s cú nhi u bi n nh là s thành ph n c a nh ng b tỡm đổ ẽ ề ế ư ố ầ ủ ữ ộ ược. Dũng (13) ki m tra vi c l y ra đó thành cụng ch a. đõy, chỳng ta sể ệ ấ ư Ở ử d ng m t macro NO_MORE_TUPLES. Chỳng ta cú th gi thi t macroụ ộ ể ả ế này được đ nh nghĩa b i:ị ở

#define NO_MORE_TUPLE !(strcmp(SQLSTATE, “02000”))

Nh c l i r ng “02000” là mó SQLSTATE cú nghĩa là khụng cú b nàoắ ạ ằ ộ được tỡm th y. Do v y, dũng (13) ki m tra xem cú ph i là t t c cỏc bấ ậ ể ả ấ ả ộ được truy v n tr v đó đấ ả ề ược tỡm th y trấ ước đú và khụng cú b “ti pộ ế theo” đ l y. N u đỳng, chỳng ta thoỏt kh i vũng l p và đi t i dũng (17).ể ấ ế ỏ ặ ớ

N u m t b đó đế ộ ộ ượ ấc l y ra, thỡ dũng (14) chỳng ta kh i t o s lở ở ạ ố ượng cỏc ch s trong Lữ ố ương là 1. Dũng (15) là m t vũng l p l p l i vi c chiaộ ặ ặ ạ ệ LuongNV cho 10 và tăng Chuso lờn 1. Khi LuongNV đ t t i 0 sau khi chiaạ ớ cho 10, Chuso l u gi s lư ữ ố ượng cỏc ch s trong giỏ tr c a LuongNVữ ố ị ủ đượ ấc l y ra. Cu i cựng, dũng (16) tăng ph n t tố ầ ử ương ng c a m ng Demứ ủ ả lờn 1. Chỳng ta gi s r ng s lả ử ằ ố ượng cỏc ch s khụng nhi u h n 14. Tuyữ ố ề ơ nhiờn, cú th cú m t giỏ tr Lể ộ ị ương v i 15 ch s ho c nhi u h n, dũngớ ữ ố ặ ề ơ (16) s khụng tăng b t kỳ ph n t nào c a m ng Dem, vỡ khụng cú h ngẽ ấ ầ ử ủ ả ạ

thớch h p; nghĩa là, nh ng Lợ ữ ương r t l n b v t đi và khụng nh hấ ớ ị ứ ả ưởng đ n nh ng thụng tin th ng kờ. ế ữ ố

Dũng (17) b t đ u k t thỳc hàm. Con tr đắ ầ ế ỏ ược đúng, và cỏc dũng (18) và (19) in cỏc giỏ tr trong m ng Dem.ị ả

3.1.7 C p nh t b ng con trậ ậ ằ

Khi m t con tr duy t qua cỏc b c a m t b ng c s (nghĩa là, m tộ ỏ ệ ộ ủ ộ ả ơ ở ộ quan h đệ ượ ưc l u tr trong c s d li u ch khụng ph i là m t khungữ ơ ở ữ ệ ứ ả ộ nhỡn ho c m t quan h do m t truy v n t o ra), thỡ ngặ ộ ệ ộ ấ ạ ười ta khụng ch cúỉ th đ c và x lý giỏ tr c a m i b , mà cũn cú th c p nh t ho c xúa cỏcể ọ ử ị ủ ỗ ộ ể ậ ậ ặ

Một phần của tài liệu Tài liệu Giáo trình Ngôn ngữ SQL docx (Trang 101)

Tải bản đầy đủ (PDF)

(180 trang)