Mở SQL & SQL gốc trong SAP ABAP
Mục tiêu của hướng dẫn này không phải là dạy bạn SQL hoặc các khái niệm về cơ sở dữ liệu nhưng để giới thiệu cho bạn về tính đa dạng của SQL trong ABAP
Trong ngôn ngữ lập trình ABAP/4, có hai loại SQL được sử dụng.
- SQL GỐC
- MỞ SQL.
Open SQL cho phép bạn truy cập các bảng cơ sở dữ liệu được khai báo trong từ điển ABAP bất kể nền tảng cơ sở dữ liệu mà hệ thống R/3 đang sử dụng.
SQL gốc cho phép bạn sử dụng các câu lệnh SQL dành riêng cho cơ sở dữ liệu trong chương trình ABAP/4. Điều này có nghĩa là bạn có thể sử dụng các bảng cơ sở dữ liệu không được quản lý bởi từ điển ABAP và do đó tích hợp dữ liệu không thuộc hệ thống R/3.
Open SQL bao gồm một tập hợp các câu lệnh ABAP thực hiện các thao tác trên cơ sở dữ liệu trung tâm trong hệ thống R/3. Kết quả của các thao tác và bất kỳ thông báo lỗi nào đều độc lập với hệ thống cơ sở dữ liệu đang sử dụng. Do đó, Open SQL cung cấp cú pháp và ngữ nghĩa thống nhất cho tất cả các hệ thống cơ sở dữ liệu được hỗ trợ bởi SAP. Các chương trình ABAP chỉ sử dụng các câu lệnh Open SQL sẽ hoạt động trong bất kỳ hệ thống R/3 nào, bất kể hệ thống cơ sở dữ liệu nào đang sử dụng. Các câu lệnh Open SQL chỉ có thể hoạt động với các bảng cơ sở dữ liệu đã được tạo trong từ điển ABAP.
Các lệnh SQL mở cơ bản
- CHỌN
- CHÈN
- CẬP NHẬT
- SỬA ĐỔI
- DELETE
- MỞ CON TRỎ, FETCH, ĐÓNG CON TRỎ
Ví dụ
TABLES SBOOK. DATA C TYPE CURSOR, WA LIKE SBOOK. OPEN CURSOR C FOR SELECT * FROM SBOOK WHERE CARRID = 'LH ' AND CONNID = '0400' AND FLDATE = '19950228' ORDER BY PRIMARY KEY. DO. FETCH NEXT CURSOR C INTO WA. IF SY-SUBRC <> 0. CLOSE CURSOR C. EXIT. ENDIF. WRITE: / WA-BOOKID, WA-CUSTOMID, WA-CUSTTYPE, WA-SMOKER, WA-LUGGWEIGHT, WA-WUNIT, WA-INVOICE. ENDDO.
Xuất danh sách hành khách chuyến bay Lufthansa 0400 ngày 28-02.1995:
Mở mã trả về SQL
Tất cả các câu lệnh Open SQL đều điền mã trả về vào hai trường hệ thống sau.
SY-SUBRC
Sau mỗi câu lệnh Open SQL, trường hệ thống SY-SUBRC chứa giá trị 0 nếu thao tác thành công, giá trị khác 0 nếu không.
SY-DBCNT
Sau câu lệnh Open SQL, trường hệ thống SY-DBCNT chứa số dòng cơ sở dữ liệu được xử lý.
SQL gốc
Như đã đề cập, SQL gốc cho phép bạn sử dụng các câu lệnh SQL dành riêng cho cơ sở dữ liệu theo cách chương trình ABAP.
Để sử dụng câu lệnh SQL gốc, bạn phải đặt trước câu lệnh SQL EXEC và theo sau nó là câu lệnh ENDEXEC.
cú pháp
EXEC SQL [PERFORMING <form>]. <Native SQL statement> ENDEXEC.
Không có dấu chấm sau câu lệnh SQL gốc. Hơn nữa, việc sử dụng dấu phẩy đảo ngược (“) hoặc dấu hoa thị (*) ở đầu dòng trong câu lệnh SQL gốc sẽ không đưa ra nhận xét như trong cú pháp ABAP thông thường. Bạn cần biết liệu tên bảng và trường có phân biệt chữ hoa chữ thường trong lựa chọn của bạn hay không cơ sở dữ liệu.
Trong câu lệnh SQL gốc, dữ liệu được vận chuyển giữa bảng cơ sở dữ liệu và chương trình ABAP bằng cách sử dụng các biến máy chủ. Những giá trị này được khai báo trong chương trình ABAP và đứng trước câu lệnh SQL gốc bằng dấu hai chấm (:). Bạn có thể sử dụng các cấu trúc cơ bản làm biến chủ. Ngoại lệ, các cấu trúc trong mệnh đề INTO được xử lý như thể tất cả các trường của chúng được liệt kê riêng lẻ.
Giống như trong Open SQL, sau câu lệnh ENDEXEC, SY-DBCNT chứa số dòng được xử lý. Trong hầu hết các trường hợp, SY-SUBRC chứa giá trị 0 sau câu lệnh ENDEXEC.
SQL mở - Quy tắc hiệu suất
Để cải thiện hiệu suất của SQL và của chương trình ABAP, người ta nên lưu ý các quy tắc sau:
Giữ tập hợp kết quả nhỏ
- Sử dụng mệnh đề Where
- Nếu cơ sở dữ liệu chỉ yêu cầu một bản ghi, hãy sử dụng SELECT SINGLE bất cứ khi nào có thể.
Giảm thiểu lượng dữ liệu được truyền
- Hạn chế số lượng dòng
- Nếu chỉ có một số trường nhất định được yêu cầu từ một bảng, hãy sử dụng CHỌN VÀO … tuyên bố
- Hạn chế số cột
- Sử dụng các hàm tổng hợp
Giảm thiểu số lần truyền dữ liệu
- Tránh các vòng chọn lồng nhau
- Một tùy chọn thay thế là sử dụng câu lệnh SELECT .. FOR ALL ENTRIES. Câu lệnh này thường có thể hiệu quả hơn nhiều so với việc thực hiện một số lượng lớn câu lệnh SELECT hoặc SELECT SINGLE trong LOOP của một bảng nội bộ.
- Sử dụng chế độ xem từ điển
- Sử dụng Joins trong mệnh đề FROM
- Sử dụng truy vấn con trong mệnh đề Where
Giảm thiểu chi phí tìm kiếm
- Sử dụng các trường chỉ mục trong mệnh đề Where
- Khi truy cập cơ sở dữ liệu, luôn đảm bảo rằng chỉ mục chính xác đang được sử dụng.
Giảm tải cơ sở dữ liệu
- Buffering
- Cơ sở dữ liệu logic
- Tránh truy cập cơ sở dữ liệu nhiều lần
Sử dụng bảng nội bộ để Buffer Hồ sơ
- Để tránh thực hiện cùng một CHỌN nhiều lần (và do đó có các lựa chọn trùng lặp), một bảng nội bộ thuộc loại HASHED có thể được sử dụng để cải thiện hiệu suất.