Tôi có hai câu hỏi về Tuyên bố Hợp chất và Giao dịch trong MySQL.BẮT ĐẦU GIAO DỊCH bên trong BEGIN ... Ngữ cảnh END hoặc bên ngoài và cú pháp LOOP
FIRST:
Có hai ghi chú trong MySQL Manual:
Note
Trong tất cả các chương trình lưu trữ, xử lý phân tích cú pháp BEGIN [WORK] như khởi đầu của một BEGIN .. Khối END. Để bắt đầu giao dịch trong ngữ cảnh này, hãy sử dụng START TRANSACTION thay thế.
Note
Trong tất cả các chương trình lưu trữ (lưu trữ thủ tục và hàm, gây nên, và các sự kiện), các xử lý phân tích cú pháp BEGIN [WORK] là sự khởi đầu của một BEGIN ... khối END. Bắt đầu giao dịch trong ngữ cảnh này với START GIAO DỊCH thay thế.
Tôi không thể hiểu chính xác ý nghĩa của nó. Có nghĩa là tôi phải đặt START TRANSACTION
thay vì BEGIN
hoặc ngay sau BEGIN
?
// 1st variant:
BEGIN
START TRANSACTION
COMMIT
END
// 2nd variant:
START TRANSACTION
COMMIT
END
Cách nào đúng, biến thể thứ nhất hoặc biến thể thứ 2?
SECOND:
Tôi không muốn tạo Thủ tục hoặc chức năng được lưu trữ. Tôi chỉ muốn tạo Khối đối chiếu-Tuyên bố với một vòng lặp bên trong nó trong luồng chung, như sau:
USE 'someDb';
START TRANSACTION
... create table statement
... insert statement
// now I want to implement some insert/select statements using loop, I do as follows:
DELIMITER $
BEGIN
SET @n = 1, @m = 2;
lab1: LOOP
... some insert, select statements here
END LOOP lab1;
END $
DELIMITER ;
END
COMMIT
Có thể loại cấu trúc như vậy không? Bởi vì tôi đã một lỗi ném:
Query: BEGIN SET @n = 1, @m = 2; lab1: LOOP SELECT ...
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @n = 1, @m = 2;
lab1: LOOP SELECT ...
Câu hỏi của tôi là:
- Có được phép sử dụng
BEGIN...END
chỉ trong dòng chảy chung mà không cần tạo và sử dụng thủ tục lưu trữ hoặc chức năng? Được phép sử dụng
BEGIN...END
bên trongSTART TRANSACTION...COMMIT
hoặc tôi phải đặtSTART TRANSACTION...COMMIT
bên trongBEGIN...END
?BEGIN START TRANSACTION COMMIT END // vs. START TRANSACTION BEGIN END COMMIT
Đỗ tôi bằng mọi cách phải sử dụng
BEGIN...END
nếu tôi muốn sử dụng chỉLOOP
? Tôi có thể sử dụng cú phápLOOP
mà không cần bắt đầuBEGIN...END
không? Ví dụ duy nhất trong cuốn hướng dẫn choLOOP
là thế này:CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP ...
Tại sao vòng lặp chỉ tồn tại trong một proc được lưu trữ? Có vẻ chậm phát triển phải tạo một tệp lưu trữ tạm thời chỉ để thực hiện chèn vòng lặp đơn giản ..... – Pacerier
@Pacerier: bởi vì đó là logic nghiệp vụ thuộc về mã ứng dụng của bạn, không phải lớp cơ sở dữ liệu. – eggyal
@eggyal trong khi tôi hoàn toàn đồng ý với bạn Pacerier có một điểm rất hợp lệ, tại sao mysql hoạt động khác với các chương trình được lưu trữ so với truy vấn chuẩn –