Chương 3 trình bày những kiến thức về lập trình với cơ sở dữ liệu. Thông qua chương này người học sẽ tìm hiểu về: Biến cục bộ, biến hệ thống, các câu lệnh truy vấn dữ liệu, các hàm thường dùng, cấu trúc điều khiển, cấu trúc lặp, biến kiểu dữ liệu cursor. Mời các bạn cùng tham khảo.
10/03/2015 TRƢỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN THÀNH PHỐ HỒ CHÍ MINH CHƢƠNG LẬP TRÌNH VỚI CƠ SỞ DỮ LIỆU GV: Lê Thị Minh Nguyện Email: leminhnguyen@itc.edu.vn NỘI DUNG Biến cục Biến hệ thống Các câu lệnh truy vấn liệu Các hàm thường dùng Cấu trúc điều khiển Cấu trúc lặp Biến kiểu liệu cursor 10/03/2015 1.Biến cục Biến cục bộ: dùng để lưu trữ giá trị tạm thời q trình tính tốn xử lý sau khỏi chương trình tắt máy giá trị biến khơng nhớ Cú pháp: DECLARE @Tên_biến kiểu_dữ_liệu[,…] Ví dụ: DECLARE @ten_ncc varchar(50), @ngayxh DATETIME Gán giá trị cho biến: Dùng SET SELECT với phép gán (= ) 1.Biến cục Ví dụ 1: để gán giá trị ngày 25/3/2002 vào biến ngày xuất hàng DECLARE @ngayxh DATETIME SET @ngayxh = „25-3-2014‟ Ví dụ 2: DECLARE @TongSLDat int SELECT @TongSLDat = SUM(SLDAT) FROM CTDH Ví dụ 3: DECLARE @MinSLDat int, @MaxSLDat int SELECT @MinSLDat = MIN(SLDAT), @MaxSLDat = MAX(SLDAT), FROM CTDH 10/03/2015 1.Biến cục Xem giá trị hành biến Cú pháp: PRINT @Tên_biến | Biểu_thức_chuỗi Ví dụ: DECLARE @MinSLDat int, @MaxSLDat int SELECT @MinSLDat = MIN(SLDAT), @MaxSLDat = MAX(SLDAT), FROM CTHDON PRINT „Số lượng đặt thấp là:‟ PRINT @MinSLDat PRINT „Số lượng đặt cao là:‟ PRINT @MaxSLDat 1.Biến cục Phạm vi hoạt động biến Trong Transaction-SQL phạm vi hoạt động biến nằm thủ tục nội (stored procedure) lô (batch) chứa câu lệnh mà biến khai báo bên Lơ xem nhóm tập hợp nhiều câu lệnh Transaction-SQL biên dịch đồng thời lúc SQL Server Một từ khoá GO định kết thúc lô 10/03/2015 1.Biến cục Do câu lệnh lô biên dịch SQL Server có lệnh bên lơ có lỗi cú pháp lúc biên dịch hệ thống khơng có lệnh thực thi bên lơ Ví dụ: SELECT * FROM NHACC ORDER BY TenNhaCC INSERT INTO NHACC („C01‟, „Nguyen Van A‟, ‟87 Ly Tu Trong‟,„0903.123456‟) SELECT * FROM VATTU ORDER BY Tenvtu DESC GO (thiếu từ khố VALUES) lệnh SELECT bên lơ không thực 1.Biến cục Đối với lỗi thực (run-time) bên lô trường hợp lỗi vi phạm ràng buộc toàn vẹn liệu hệ thống SQL Server ngưng lại câu lệnh gây lỗi thực tiếp lệnh bên lơ (mặc dù vi phạm ràng buộc tồn vẹn Ví dụ: SELECT * FROM NHACC ORDER BY TenNhaCC INSERT (giả sử trùng khố cột MaNCC) lệnh SELECT bên lô thực bình thường INSERT INTO NHACC VALUES („C01‟, „Nguyen Van A‟, ‟87 Ly Tu Trong‟,„0903.123456‟) SELECT * FROM VATTU ORDER BY Tenvtu DESC GO 10/03/2015 1.Biến cục Ví dụ: DECLARE @NgayDH datetime SELECT @NgayDH = MAX(NGAYDH) FROM DONDH GO PRINT “ngay dat hang gan nhat: ” + convert(char(12), @ngaydh) HT báo lỗi có thêm từ khoá GO GO lệnh SELECT PRINT Bởi lệnh chia làm lô lô thứ hai không hiểu biến @ngaydh khai báo lô thứ 2.Biến hệ thống Các biến hệ thống SQL Server bắt đầu chữ @@ Giá trị mà lưu trữ hệ thống SQL cung cấp Người lập trình khơng can thiệp trực tiếp để gán giá trị vào biến hệ thống 10 10/03/2015 2.Biến hệ thống Tên biến kiểu trả Dùng để trả connections số nguyên Tổng số kết nối vào SQL Server từ khởi động Error số nguyên số mã lỗi câu lệnh thực gần Khi lệnh thực thành cơng biến có giá trị Language chuỗi Tên ngôn ngữ mà hệ thống SQL đag sử dụng Mặc định US_English RowCount số nguyên Tổng số mẩu tin tác động vào câu lệnh truy vấn gần ServerName chuỗi Tên máy tính cục cài đặt SQL Server ServiceName chuỗi Tên dịch vụ kèm theo bên SQL Server Fetch_Status số nguyên Trạng thái việc đọc liệu bảng theo chế dòng mẩu tin (cursor) Khi liệu đọc mẩu tin thành cơng biến có giá trị Version chuỗi Phiên bản, ngày phẩm SQL Server loại CPU 2.Biến hệ thống Ví dụ: SELECT * FROM NHACC SELECT @@ROWCOUNT (Trả tổng số mẩu tin có bảng NHACC ) Ví dụ: UPDATE SET WHERE SELECT SANPHAM PHATRAM = PHANTRAM + MAVTU like “TV%” @@ROWCOUNT (Trả tổng số mẩu tin có MAVTU bắt đầu chữ 12 “TV” bảng VATTU) 10/03/2015 3.Các câu lệnh truy vấn liệu Truy vấn Truy vấn lồng Hàm kết hợp Gom nhóm Điều kiện nhóm Cập nhật liệu 13 3.1.Truy vấn Gồm mệnh đề SELECT FROM WHERE • Tên cột cần hiển thị kết truy vấn • Tên bảng liên quan đến câu truy vấn • Biểu thức boolean xác định dịng rút trích • Nối biểu thức: AND, OR, NOT • Phép toán: , , , , , , LIKE BETWEEN 14 10/03/2015 Ví dụ Lấy tất cột quan hệ kết SELECT * FROM NHANVIEN WHERE PHG=5 Tên bí danh SELECT MANV, HONV, TENLOT + TENNV as HOTEN FROM NHANVIEN WHERE PHG=5 AND PHAI=„Nam‟ Mở rộng SELECT MANV, LUONG*1.1 AS „LUONG10%‟ FROM NHANVIEN WHERE PHG=5 AND PHAI=„Nam‟ 15 Ví dụ Loại bỏ dòng trùng SELECT LUONG FROM NHANVIEN WHERE PHG=5 AND PHAI=„Nam‟ SELECT DISTINCT LUONG FROM NHANVIEN WHERE PHG=5 AND PHAI=„Nam‟ LUONG 30000 25000 25000 38000 - Tốn chi phí - Người dùng muốn thấy LUONG 30000 25000 38000 16 10/03/2015 Ví dụ BETWEEN SELECT MANV, TENNV FROM NHANVIEN WHERE LUONG>=20000 AND LUONG0 BEGIN Print “Danh sách hàng hoá bán với số lượng lớn 4” SELECT CTPXUAT.MAVT, TENVT, SLXUAT FROM CTPXUAT, VATTU WHERE CTPXUAT.MaVT = VATTU.MaVT AND SLXUAT>4 END ELSE 73 Print “chưa bán hàng với số lượng lớn 4” 6.Cấu trúc lặp Cú pháp: WHILE Biểu_thức_luận_lý BEGIN Các_lệnh_lặp END 74 37 10/03/2015 6.Cấu trúc lặp Ví dụ 1: Để in 10 số nguyên dương 100 DECLARE @Songuyen INT SET @Songuyen = 100 WHILE (@Songuyen < 110) BEGIN Print “Số nguyên: ” + convert(char(3), @songuyen) SET @Songuyen = @Songuyen +1 END 75 6.Cấu trúc lặp WHILE BEGIN Biểu_thức_luận_lý Các_lệnh_nhóm_lặp_1 [IF Biểu_thức_lặp_Tiếp CONTINUE ] [IF Biểu_thức_thốt BREAK ] Các_lệnh_nhóm_lặp_2 END Các_lệnh_khác 76 38 10/03/2015 6.Cấu trúc lặp Từ khoá BREAK lồng vào cấu trúc WHILE để kết thúc việc lặp lệnh bên vòng lặp DECLARE @Songuyen int SET @Songuyen = 100 WHILE (@Songuyen < 110) BEGIN Print „So nguyen: ‟ + Convert(char(3), @songuyen) IF @Songuyen = 105 Break SET @Songuyen = @Songuyen +1 END 77 6.Cấu trúc lặp Thực giống ví dụ trước, muốn in sót số nguyên 105 Chúng ta sử dụng cấu trúc lặp WHILE sau: DECLARE @Songuyen int SET @Songuyen = 99 WHILE (@Songuyen < 110) BEGIN SET @Songuyen = @Songuyen + IF @Songuyen = 105 CONTINUE Print ‘Số nguyên: ’ + Convert(char(3), @songuyen) END 78 39 10/03/2015 7.Kiểu liệu cursor Giới thiệu Các bước sử dụng kiểu liệu cursor Ví dụ 79 7.1.Giới thiệu CSDL quan hệ thường làm việc liệu nhiều dòng mẩu tin – gọi mẩu tin Lệnh SELECT kết trả nhiều mẩu tin mẩu tin Tuy nhiên thực tế, có trường hợp cần xử lý vấn đề mẩu tin nhiều mẩu tin thời gian với hình thức tính tốn khác Để đáp ứng yêu cầu SQL Server tạo kiểu liệu kiểu cursor 80 40 10/03/2015 7.2.Các bước sử dụng kiểu cursor Biến kiểu cursor: định nghĩa biến kiểu cursor lệnh DECLARE Mở Cursor : sử dụng lệnh OPEN để mở cursor định nghĩa trước Đọc xử lý dịng liệu bên cursor Đóng cursor: DEALLOCATE lệnh CLOSE 81 7.2.1 Biến kiểu cursor Cú pháp DECLARE Tên_cursor CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | DYNAMIC | KEYSET] [READ_ONLY | SCROLL_LOCK] FOR Câu_lệnh SELECT [FOR UPDATE [OF danh_sách_cột_n]] Trong đó: Tên cursor: tên biến kiểu cursor LOCAL | GLOBAL: phạm vi hoạt động biến cursor 82 FORWARD_ONLY: đọc liệu cursor theo chiều tới duyệt từ đầu mẫu tin đến mẫu tin cuối 41 10/03/2015 7.2.1 Biến kiểu cursor STATIC: đọc liệu bên cursor tĩnh Khi người dùng khác có thay đổi bên liệu gốc thay đổi khơng cập nhật tự động liệu cursor Bởi liệu cursor liệu bảng tạm hệ thống chép lưu trữ CSDL tempdb hệ thống định nghĩa cursor DYNAMIC: dùng định liệu cursor động Khi việc cập nhật liệu bảng sở người dùng khác cập nhật tự động liệu cursor có kiểu DYNAMIC 83 7.2.1 Biến kiểu cursor KEYSET: hoạt động giống với kiểu DYNAMIC, thay đổi liệu cột khơng khố bảng sở người dùng khác cập nhật liệu cursor Tuy nhiên mẩu tin vừa thêm mẩu tin bị huỷ bỏ người dùng khác không hiển thị liệu cursor có kiểu KEYSET READ_ONLY: định liệu cursor đọc nhằm hạn chế việc sửa đổi liệu bên cursor 84 Khi khai báo cursor với kiểu liệu tĩnh (STATIC) liệu cursor xem đọc 42 10/03/2015 7.2.1.Biến kiểu cursor SCROLL_LOCK: định hệ thống SQL Server tự động khố dịng mẩu tin cần phải thay đổi giá trị huỷ bỏ bên bảng nhằm bảo đảm hành động cập nhật thành công SELECT: dùng để đến cột bên bảng mà cần đọc liệu Danh sách cột cập nhật: định danh sách tên cột phép thay đổi giá trị cursor 85 7.2.1 Biến kiểu cursor Ví dụ 1: để định nghĩa biến cursor chứa toàn dòng liệu bên bảng MAT_HANG, dòng liệu cursor cho phép cập nhật DECLARE Cur_MAT_HANG CURSOR DYNAMIC FOR SELECT * FROM MATHANG Ví dụ 2: Định nghĩa biến cursor chứa toàn dòng liệu bên bảng NHACC, liệu cursor phép đọc việc đọc liệu cursor theo chiều tới DECLARE Cur_NhaCC CURSOR FORWARD_ONLY STATIC 86 READ_ONLY FOR SELECT * FROM NHACC 43 10/03/2015 7.2.2 Mở Cursor Cú pháp: OPEN Tên_cursor Trong đó: Tên cursor: tên biến cursor định nghĩa trước lệnh DECLARE Ví dụ: Mở cursor định nghĩa ví dụ Chúng ta sử dụng lệnh OPEN sau: OPEN cur_MAT_HANG 87 7.2.3.Đọc xử lý liệu cursor FETCH [Next | Prior | First | Last |Absolute n | Relative n] FROM Tên_cursor [INTO danh_sách_biến] Trong đó: Next, Prior, First, Last: dùng để đọc liệu kế tiếp, trước, đầu, sau Absolute: liệu xác thứ n cursor N>0 định việc đọc liệu dòng thứ n đếm từ dòng đầu tiên, n