Viết ghi chú về xử lý lỗi mysql

Trong bài đăng này, tôi đang chia sẻ bản trình diễn đầy đủ về cách quản lý xử lý lỗi/ngoại lệ trong Thủ tục lưu trữ của MySQL

Bất cứ khi nào một ngoại lệ xảy ra trong một thủ tục được lưu trữ, điều rất quan trọng là phải xử lý nó bằng cách hiển thị các thông báo lỗi thích hợp

Nếu bạn không xử lý ngoại lệ, sẽ có khả năng ứng dụng bị lỗi với ngoại lệ nhất định trong thủ tục được lưu trữ

Nếu bạn gặp lỗi trong thủ tục lưu trữ, thay vì thoát, bạn nên tiếp tục mà không có bất kỳ thông báo lỗi nào. Điều đó có nghĩa là bạn có thể hiển thị bất kỳ mã lỗi hoặc thông báo mặc định hoặc tùy chỉnh nào cho ứng dụng/người dùng

MySQL cung cấp Handler để xử lý ngoại lệ trong thủ tục lưu trữ

Dưới đây là minh họa đầy đủ về một trình xử lý với các ví dụ

1

2

3

4

5

6

7

8

9

10

/*Tạo cơ sở dữ liệu nhân viên cho demo */

TẠO CƠ SỞ DỮ LIỆU Nhân viên;

/*Tạo bảng chi tiết nhân viên mẫu. */

TẠO BẢNG nhân viên. tbl_EmployeeChi tiết

(

SỐ LƯỢNG EmpID

,EmpName VARCHAR(50)

,Địa chỉ email VARCHAR(50)

,CONSTRAINT pk_tbl_EmployeeDetails_EmpID KHÓA CHÍNH (EmpID)

) ĐỘNG CƠ = InnoDB;

Cách khai báo handler trong thủ tục store

Cú pháp xử lý.

1

KHAI BÁO handler_action HANDLER CHO giá_trị_điều_kiện. bản tường trình

Ba loại Handler_Action

  • TIẾP TỤC
  • LỐI RA
  • HOÀN TÁC

Loại điều kiện Giá trị

  • mysql_error_code
  • sqlstate_value
  • SQLCảnh báo
  • SQLException
  • Không tìm thấy

Làm thế nào để viết trình xử lý trong thủ tục được lưu trữ?

E. g

1

2

3

4

KHAI BÁO TIẾP TỤC XỬ LÝ CHO SQLEXCEPTION SELECT 'Đã xảy ra lỗi';

KHAI BÁO TIẾP TỤC XỬ LÝ CHO SQLEXCEPTION SET IsError=1;

KHAI BÁO THOÁT XỬ LÝ CHO SQLEXCEPTION SET IsError=1;

KHAI THÁC THOÁT XỬ LÝ CHO SQLSTATE '23000' SET IsError = 1;

Trên đây là bốn ví dụ xử lý khác nhau. Bây giờ, tôi sẽ chèn một giá trị trùng lặp vào cột EmpID

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

PHÂN PHỐI //

TẠO THỦ TỤC Nhân viên. usp_InsertEmployeeChi tiết

(

InputEmpID INTEGER

,InputEmpName VARCHAR(50)

,InputEmailĐịa chỉ VARCHAR(50)

)

/***************************************************

Tên tác giả. Anvesh Patel

ngày tạo ra. 2015-05-20

Sự miêu tả. Đây là thủ tục được lưu trữ demo để

chèn bản ghi vào bảng với thích hợp

xử lý lỗi. Về cơ bản cho www. thương hiệu. độc giả com

***************************************************

BẮT ĐẦU

KHAI BÁO TIẾP TỤC XỬ LÝ CHO SQLEXCEPTION SELECT 'Đã xảy ra lỗi';

CHÈN VÀO Nhân viên. tbl_EmployeeChi tiết

(

EmpID

,EmpName

,Địa chỉ email

)

GIÁ TRỊ

(

Đầu vàoEmpID

,InputEmpName

,Đầu vàoĐịa chỉ email

);

CHỌN *TỪ nhân viên. tbl_EmployeeChi tiết;

CHẤM DỨT

// KHOẢN KHÁC ;

Trong SP ở trên, tôi đã xác định trình xử lý TIẾP TỤC với thông báo ngoại lệ tùy chỉnh của mình

Bây giờ, hãy gọi SP trên hai lần với cùng một EmpID

Lần đầu tiên, nó sẽ thực thi thành công, nhưng lần thứ hai, nó sẽ đưa ra thông báo lỗi tùy chỉnh

Như chúng tôi đã định nghĩa trình xử lý TIẾP TỤC, do đó, nó sẽ chỉ hiển thị thông báo lỗi và TIẾP TỤC sang phần tiếp theo của câu lệnh CHỌN

Hãy xem nào,

1

2

GỌI nhân viên. usp_InsertEmployeeDetails (1,'Anvesh','anvesh@gmail. com');

GỌI nhân viên. usp_InsertEmployeeDetails (1,'Roy','Roy@gmail. com');

Trên đây là hai cuộc gọi khác nhau có cùng giá trị EmpID. Cuộc gọi đầu tiên thực hiện mà không có bất kỳ thông báo lỗi nào và cuộc gọi thứ hai thực hiện với thông báo lỗi

Kết quả của cuộc gọi thứ hai

Viết ghi chú về xử lý lỗi mysql

Viết ghi chú về xử lý lỗi mysql

Như chúng tôi đã định nghĩa TIẾP TỤC, vì vậy bạn có thể tìm thấy hai kết quả trong hình trên. Một là thông báo lỗi tùy chỉnh của chúng tôi và thứ hai là kết quả của câu lệnh CHỌN đã xác định.
Việc thực thi không dừng lại do lỗi và nó tiếp tục cho một phần khác.

Bây giờ, hãy kiểm tra trình xử lý EXIT

Vui lòng sửa đổi trình xử lý của bạn và thay CONTINUE bằng EXIT

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

PHÂN PHỐI //

TẠO THỦ TỤC Nhân viên. usp_InsertEmployeeChi tiết

(

InputEmpID INTEGER

,InputEmpName VARCHAR(50)

,InputEmailĐịa chỉ VARCHAR(50)

)

/***************************************************

Tên tác giả. Anvesh Patel

ngày tạo ra. 2015-05-20

Sự miêu tả. Đây là thủ tục được lưu trữ demo để

chèn bản ghi vào bảng với thích hợp

xử lý lỗi. Về cơ bản cho www. thương hiệu. độc giả com

***************************************************

BẮT ĐẦU

KHAI BÁO THOÁT XỬ LÝ CHO SQLEXCEPTION CHỌN 'Đã xảy ra lỗi';

CHÈN VÀO Nhân viên. tbl_EmployeeChi tiết

(

EmpID

,EmpName

,Địa chỉ email

)

GIÁ TRỊ

(

Đầu vàoEmpID

,InputEmpName

,Đầu vàoĐịa chỉ email

);

CHỌN *TỪ nhân viên. tbl_EmployeeChi tiết;

CHẤM DỨT

// KHOẢN KHÁC ;

Gọi với cùng một tham số

1

GỌI nhân viên. usp_InsertEmployeeDetails (1,'Roy','Roy@gmail. com');

Kết quả là một thông báo lỗi duy nhất và bạn không thể tìm thấy hai kết quả như chúng tôi đã xác định EXIT để thoát khỏi mã khi xảy ra lỗi

Viết ghi chú về xử lý lỗi mysql

Cách tốt nhất là tạo tham số đầu ra và lưu trữ 1 nếu xảy ra lỗi

Mã ứng dụng phải kiểm tra tham số đầu ra này là NULL hay 1

1 = Lỗi

NULL = Không có lỗi

Dưới đây là một thủ tục được lưu trữ cho việc này

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

PHÂN PHỐI //

TẠO THỦ TỤC Nhân viên. usp_InsertEmployeeChi tiết

 

(

InputEmpID INTEGER

,InputEmpName VARCHAR(50)

,InputEmailĐịa chỉ VARCHAR(50)

,ra IsError INTEGER

)

/***************************************************

Tên tác giả. Anvesh Patel

ngày tạo ra. 2015-05-20

Sự miêu tả. Đây là thủ tục được lưu trữ demo để chèn

ghi vào bảng với xử lý lỗi thích hợp

Về cơ bản cho www. thương hiệu. độc giả com

***************************************************

BẮT ĐẦU

KHAI BÁO TIẾP TỤC XỬ LÝ CHO SQLEXCEPTION SET IsError=1;

 

CHÈN VÀO Nhân viên. tbl_EmployeeChi tiết

(

EmpID

,EmpName

,Địa chỉ email

)

GIÁ TRỊ

(

Đầu vàoEmpID

,InputEmpName

,Đầu vàoĐịa chỉ email

);

CHỌN *TỪ nhân viên. tbl_EmployeeChi tiết;

CHẤM DỨT

// KHOẢN KHÁC ;

Bây giờ gọi SP ở trên và chọn tham số đầu ra

1

2

GỌI nhân viên. usp_InsertEmployeeDetails (1,'Roy','Roy@gmail. com',@IsError);

CHỌN @IsError;

Bây giờ Kết quả là

Viết ghi chú về xử lý lỗi mysql

Viết ghi chú về xử lý lỗi mysql

Trên đây là minh họa đơn giản về Xử lý lỗi trong MySQL. Bạn cũng có thể sử dụng SQLSTATE hiển thị các thông báo lỗi mặc định của MySQL

Ngày 21 tháng 5 năm 2015 Anvesh Patel

Mời bạn tham khảo các bài viết liên quan khác

  • mysql. Mã lỗi 1005 Không thể tạo bảng (errno 150)
  • mysql. vai trò chính của là gì. tập tin frm?
  • mysql. Giải pháp tốt nhất để tính Tuổi từ Ngày sinh
  • Câu lệnh Insert-Update, Merge trong MySQL
  • mysql. UDF để CHỌN giá trị từ Chuỗi được phân tách bằng dấu phẩy ở bất kỳ vị trí nào
  • Thủ tục lưu trữ trong MySQL
  • mysql. Những câu hỏi và trả lời phỏng vấn thường gặp Phần 7
  • mysql. Tập lệnh tìm giá trị AUTO_INCREMENT cuối cùng cho Bảng

Cách tạo công việc trong PostgreSQL PostgreSQL XML Type

Bình luận. 20

  1. Sunil

    Tháng Một 4, 2017 lúc 9. 29 giờ sáng

    xin chào Avnesh, tôi đang gặp khó khăn với DEFINER trong quy trình được lưu trữ, bạn có thể đề xuất một số ý tưởng hay hơn không
    chẳng hạn như DEFINER là =root@% thì tôi không thể thực thi quy trình được lưu trữ này từ mysql cục bộ của mình .

    , cảm ơn trước

    • Viết ghi chú về xử lý lỗi mysql

      Anvesh Patel

      Tháng Một 4, 2017 lúc 7. 16 giờ chiều

      Gỡ bỏ nó. Mặc định của nó được thêm vào trong thủ tục được lưu trữ của bạn

  2. Shubhada Mulay

    Tháng Giêng 30, 2017 lúc 10. 43 giờ sáng

    Xin chào Anvesh,
    Tôi mới bắt đầu sử dụng MYSQL. Bạn có thể vui lòng cung cấp thêm thông tin chi tiết về Phần xử lý ngoại lệ này không? .
    Rất cám ơn trước.
    Trân trọng
    Shubhada

    • Viết ghi chú về xử lý lỗi mysql

      Anvesh Patel

      Tháng Giêng 30, 2017 lúc 6. 10 giơ tôi

      Chắc chắn, tôi sẽ cập nhật bài viết này và sẽ chia sẻ một số liên kết khác

  3. Victor R Udeshi

    Tháng Bảy 14, 2017 lúc 7. 03 giờ chiều

    Chào Anvesh,

    Tôi đang sử dụng xử lý lỗi trong proc được lưu trữ của mình và nó hoạt động tốt. kết quả chỉ hiển thị cho tôi 1 trường, lỗi

    Những gì tôi đang cố gắng làm là gọi Proc vào một phần mềm báo cáo (pentaho). khi tôi gọi proc trong pentaho, nó chỉ hiển thị cho tôi trường lỗi

    Có cách nào để tất cả các trường tôi muốn hiển thị trống và thông báo lỗi nếu có lỗi không?

    • Viết ghi chú về xử lý lỗi mysql

      Anvesh Patel

      Tháng Bảy 17, 2017 lúc 8. 14 giờ chiều

      Bạn có thể thay thế 1 bằng NULL

  4. Ravi Kumar Chandran

    Tháng Chín 25, 2017 lúc 11. 16 giờ chiều

    Anvesh,

    Đó là một bài báo được viết tốt và bạn đã giải thích được một tính năng khá phức tạp bằng các thuật ngữ đơn giản. cảm ơn. nó hữu ích với tôi

    • Viết ghi chú về xử lý lỗi mysql

      Anvesh Patel

      Tháng Chín 26, 2017 lúc 5. 02 giờ chiều

      Cảm ơn, Ravie…

  5. kaliyappan

    Tháng Mười Một 9, 2017 lúc 5. 53 giờ sáng

    HI, Truy vấn bên dưới hiển thị cho tôi “Không có dữ liệu. 1329 Không có dữ liệu – không có hàng nào được tìm nạp, chọn hoặc xử lý”. Không thể sửa nó, bạn có thể giúp tôi.
    BEGIN
    KHAI BÁO from_date DATETIME;
    KHAI BÁO to_date DATETIME;
    KHAI BÁO tên máy chủ VARCHAR(50 . tbl_health_events_csv NHÓM THEO host_name,service_name ĐẶT HÀNG THEO host_name, service_name;
    DECLARE servicename VARCHAR(50);
    DECLARE running_no INT;
    DECLARE loop_no INT;
    DECLARE value1 FLOAT;
    DECLARE value2 FLOAT;
    DECLARE value3 FLOAT;
    DECLARE state INT;
    DECLARE logdate DATETIME;
    DECLARE prev_status INT;
    DECLARE c1len INT;
    DECLARE c2len INT;
    DECLARE c2flag INT;
    DECLARE IsError INT;
    DECLARE c1 CURSOR FOR SELECT host_name as host,service_name as service FROM cmp_warehouse.tbl_health_events_csv GROUP BY host_name,service_name ORDER BY host_name, service_name;

    SET running_no = 1;
    MỞ c1;
    set c1len = (SELECT FOUND_ROWS());
    . VÒNG

    FETCH c1 VÀO tên máy chủ, tên dịch vụ;

    CHÈN VÀO cmp_warehouse. temp_event_data_4 (máy chủ, dịch vụ,conelen) GIÁ TRỊ (tên máy chủ, tên dịch vụ,c1len);
    SET loop_no=1;

    BLOCK2. BEGIN
    KHAI BÁO C2 CON TRỎ ĐỂ CHỌN val1,val2,val3,status_check làm trạng thái, event_time làm logtime TỪ cmp_warehouse. tbl_health_events_csv WHERE host_name = hostname AND service_name = servicename ĐẶT HÀNG THEO event_time ASC;
    MỞ c2;
    đặt c2len = (SELECT FOUND_ROWS());
    SET c2flag = 1;
    l_c2:LOOP
    FETCH c2 VÀO value1,value2,value3,state,logdate;
    CHÈN VÀO cmp_warehouse. temp_event_data_3 (val1, val2, val3, status, logtime,prev_sta,ctwolen,c2flg) GIÁ TRỊ (value1,value2,value3,state,logdate,prev_status,c2len,c2flag);
    IF loop_no=1 . temp_event_data_2 (row_no, host, service, val1, val2, val3, status, start_time, end_time,createdon) GIÁ TRỊ (running_no, hostname, servicename, value1, value2, value3, state, logdate, NULL,NOW());
    INSERT INTO cmp_warehouse.temp_event_data_2 (row_no, host, service, val1, val2, val3, status, start_time, end_time,createdon) VALUES (running_no, hostname, servicename, value1, value2, value3, state, logdate, NULL,NOW());
    SET loop_no = loop_no +1;
    SET prev_status = state;
    END IF;
    IF state prev_status THEN
    UPDATE cmp_warehouse.temp_event_data_2 SET end_time = logdate WHERE row_no = running_no;
    SET running_no = running_no +1;
    CHÈN VÀO cmp_warehouse. temp_event_data_2 (row_no, host, service, val1, val2, val3, status, start_time, end_time,createdon) GIÁ TRỊ (running_no, hostname, servicename, value1, value2, value3, state, logdate, NULL,NOW());
    END IF;
    SET prev_status = state;
    IF c2len = c2flag THEN
    UPDATE temp_event_data_2 SET end_time = logdate WHERE row_no = running_no;
    SET running_no = running_no + 1;
    LEAVE l_c2;
    END IF;
    SET c2flag = c2flag + 1;
    END LOOP l_c2;
    CLOSE c2;
    END BLOCK2;
    END LOOP l_c1;
    CLOSE c1;
    END

    • Viết ghi chú về xử lý lỗi mysql

      Anvesh Patel

      9 tháng 11, 2017 lúc 9. 57 giờ sáng

      Tôi nghĩ đây là logic của bạn và không liên quan đến bài đăng này, nếu bạn cần bất kỳ trợ giúp nào khác, hãy liên hệ với tôi qua trang LIÊN HỆ VỚI TÔI. tôi sẽ cố gắng giúp bạn

  6. Cải xoăn

    Tháng Một 2, 2018 lúc 7. 46 giờ sáng

    Làm cách nào để biết lỗi thời gian chạy trong quy trình lưu trữ mysql?
    Có cách nào để tôi có thể in lỗi xảy ra khi thực thi SP không?
    Kindly explain with a example.

    Cảm ơn trước

    • Viết ghi chú về xử lý lỗi mysql

      Anvesh Patel

      Tháng Một 4, 2018 tại 9. 20 giờ sáng

      Được rồi tôi sẽ gửi

      • rajesh

        Tháng Sáu 12, 2018 lúc 12. 25 giờ chiều

        Chào Anvesh,

        đây là rajesh, hãy làm rõ nghi ngờ của tôi. tôi không biết gì về Oracle và Mysql. vì vậy tôi tham gia Mysql trực tiếp

  7. nghệ thuật

    Tháng Bảy 28, 2018 lúc 10. 38 giờ sáng

    chia sẻ ví dụ tuyệt vời để xử lý lỗi mysql

  8. Ben Oakes

    Tháng Tám 16, 2018 lúc 7. 01 giờ sáng

    Khi xử lý các sự cố truy vấn SQL, những sự cố này thường dễ sửa hơn các sự cố PHP thuần túy vì bạn có thể thu hẹp vị trí của lỗi 0xc0000185

  9. Himanshu

    Tháng Tám 17, 2018 lúc 6. 40 giờ sáng

    Xin chào Aviash,

    bạn có thể vui lòng cho tôi biết, làm thế nào chúng ta có thể in ngoại lệ Thời gian chạy

  10. shivani sống sót

    Tháng Mười Một 22, 2018 lúc 10. 23 giờ sáng

    trong khi gọi SP ở trên bằng empID, tôi gặp lỗi. nói,

    Lỗi 4052 (42S22). Cột 'InputEmpID' không xác định trong 'danh sách trường'

  11. Edward_abino

    13 Tháng mười hai, 2018 tại 8. 41 giờ sáng

    MySQL cung cấp một cách dễ dàng để định nghĩa các trình xử lý xử lý từ các điều kiện chung như cảnh báo hoặc ngoại lệ đến các điều kiện cụ thể e. g. , mã lỗi cụ thể

  12. Puneet Papneja

    Tháng Sáu 15, 2019 tại 8. 00 giờ sáng

    Có cách nào để sử dụng xử lý lỗi bên trong giao dịch nhưng không sử dụng thủ tục lưu trữ không?

  13. Labonya das

    Tháng Mười Một 26, 2019 tại 4. 22 giờ sáng

    Tôi muốn nắm bắt lỗi DB thực tế chứ không phải thông báo lỗi do người dùng xác định như được viết tại đây. Theo cách chúng tôi có trong máy chủ Oracle và SQL, lỗi DB chính xác được ghi lại khi xảy ra ngoại lệ. Bất kỳ ý tưởng về điều này xin vui lòng chia sẻ và cảm ơn bạn đã gợi ý trước

    xử lý lỗi giải thích ngắn gọn là gì?

    Xử lý lỗi nghĩa là gì? . Nói cách khác, đó là quá trình bao gồm dự đoán, phát hiện và giải quyết lỗi ứng dụng, lỗi lập trình hoặc lỗi giao tiếp. the response and recovery procedures from error conditions present in a software application. In other words, it is the process comprised of anticipation, detection and resolution of application errors, programming errors or communication errors.

    Làm cách nào để khắc phục lỗi trong MySQL?

    Có 5 phương pháp bạn có thể thử để khắc phục lỗi MySQL 1064 khi gặp phải, tùy thuộc vào nguyên nhân có thể xảy ra nhất. .
    Sửa các lệnh gõ sai
    Thay thế các lệnh lỗi thời
    Chỉ định các từ dành riêng
    Bổ sung dữ liệu còn thiếu
    Chuyển cơ sở dữ liệu WordPress ở chế độ tương thích

    Trình xử lý MySQL là gì?

    Câu lệnh HANDLER cung cấp quyền truy cập trực tiếp vào các giao diện của công cụ lưu trữ bảng . Nó có sẵn cho các bảng InnoDB và MyISAM. NGƯỜI XỬ LÝ. Câu lệnh OPEN mở một bảng, làm cho nó có thể truy cập được bằng cách sử dụng BỘ XỬ LÝ tiếp theo. câu lệnh ĐỌC.

    Mã lỗi trong MySQL là gì?

    Mã lỗi MariaDB/MySQL được chia sẻ