Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Cách đọc và diễn giải lỗi SQL

Mã lỗi trong SQL được tạo bởi máy chủ để cung cấp thông tin về những gì đã xảy ra. Chúng có các ý nghĩa khác nhau tùy thuộc vào phiên bản SQL mà bạn đang sử dụng, nhưng chúng thường cho biết không có khả năng thực hiện một thao tác được yêu cầu.

Cách dễ nhất để khám phá nó là ngôn ngữ lập trình đơn giản nhất có tên là BASIC và các chương trình của nó như “Hello world”. Nhập thông tin sau vào giao diện:

PRINT "Hello, World!"

Nếu bạn nhập PRINT là PRRRR, bạn sẽ nhận được thông báo lỗi (tương tự trong đời thực sẽ có người bảo bạn lái xe ở bên phải đường, ví dụ:tuân thủ các quy tắc).

Điều đó tương đối dễ dàng khi nói đến các hoạt động đơn giản, nhưng đối với các hệ thống phức tạp hơn thì sao? Chúng tôi cũng bao gồm các ví dụ về mã SQL ở đây. Hãy tận hưởng!

Đoạn mã sau nhập các chức năng cần thiết từ thư viện tiêu chuẩn, sau đó tạo một bảng điều khiển, nhận một con trỏ đến luồng đầu ra tiêu chuẩn của nó và in thông báo tới luồng này và giải phóng các đối tượng đang được sử dụng:

Option Explicit

    Declare Function AllocConsole Lib "kernel32" () As Long
    Declare Function FreeConsole Lib "kernel32" () As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
    Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
           (ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal _
           nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, _
           lpReserved As Any) As Long
    Declare Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Long

Private Sub Main()
    'create a console instance
    AllocConsole
    'get handle of console output
    Dim hOut As Long
    hOut = GetStdHandle(-11&)
    'output string to console output
    Dim s As String
    s = "Hello, World!" & vbCrLf
    WriteConsole hOut, ByVal s, Len(s), vbNull, vbNull
    'make a pause to look at the output
    Sleep 2000
    'close the handle and destroy the console
    CloseHandle hOut
    FreeConsole
End Sub

Nếu bạn mắc lỗi trong mã này, bạn phải mất một lúc để tìm ra nó, đặc biệt nếu bạn có 500 trang mã như thế này. Vì vậy, máy tính sẽ tìm ra lỗi và chỉ cho bạn vị trí của chúng.

Mã lỗi SQL là gì và chúng hoạt động như thế nào?

Tính hữu ích của mã lỗi SQL là phần mềm tìm thấy mã của bạn và trỏ đến mã đó (ví dụ). Bạn không phải tự mình kiểm tra hàng nghìn dòng mã theo cách thủ công. Hãy tưởng tượng bạn chỉ nhận được một mã lỗi (“Chúc may mắn lần sau, kẻ thua cuộc!” Hoặc “Ai đã dạy bạn cách viết mã, một con ngựa?”) Và phải xem lại toàn bộ dự án!

Theo một nghĩa nào đó, mã lỗi là những người trợ giúp tuyệt vời của ông già Noel:rõ ràng, hữu ích và tiết kiệm rất nhiều thời gian. Bạn chỉ cần làm quen với họ.

Bắt đầu từ cấp độ cơ bản, cơ sở dữ liệu là tập hợp thông tin được tập hợp lại với nhau và được phân loại. Loại chúng tôi quan tâm là cơ sở dữ liệu quan hệ, nghĩa là có mối quan hệ giữa các ô mà dữ liệu được lưu trữ trong đó.

Ví dụ:bạn có thể có cả một nhóm sinh viên trong một trường đại học và muốn trao giải thưởng cho những người đạt hơn 90% trong các kỳ thi của họ. Bạn có thể viết thủ công tên, giới tính, địa chỉ, số tài khoản ngân hàng của họ (tất cả đều có liên quan, do đó là cơ sở dữ liệu quan hệ), điểm và sau đó chọn thủ công những người có điểm cao.

Cổ xưa? Có, nhưng bạn sẽ ngạc nhiên khi biết có bao nhiêu công ty vẫn kinh doanh theo cách này trong thế kỷ 21. Có thể mất hàng tháng để hoàn thành các hoạt động mà máy tính sẽ mất vài giây để thực hiện. Đặc biệt nếu chúng ta đang nói về hàng trăm hoặc hàng nghìn sinh viên.

Bây giờ, đặt tất cả những sinh viên này vào một cơ sở dữ liệu, bạn có thể sử dụng một ngôn ngữ như SQL:

SELECT * FROM Student WHERE Percentage>=90;

Xong! Tuy nhiên, vấn đề bắt đầu khi bạn viết mã của mình.

Nói một cách dễ hiểu là nó rất phức tạp, vì vậy bạn càng viết nhiều thì khả năng mã của bạn có lỗi càng cao. Ở đây, mã lỗi sẽ hữu ích nhất. Khi nhìn thấy mã lỗi, chúng ta nên biết ơn (điều này không ngăn chúng ta chửi rủa chúng mỗi lần). Họ làm tất cả các công việc cần thiết cho bạn và tất cả những gì bạn cần làm là truy cập nguồn và khắc phục sự cố.

Cung cấp cho tôi một số thông tin cụ thể!

Khi một cơ sở dữ liệu không tạo ra kết quả mong muốn, một mã lỗi sẽ được đưa ra. Nó giúp xác định vấn đề và cách khắc phục. Mã lỗi SQL, giống như mã bên dưới, sẽ hữu ích khi khắc phục bất kỳ sự cố nào với cơ sở dữ liệu của bạn:

Thông báo lỗi Cơ sở dữ liệu Oracle9i

Bản phát hành 2 (9.2)

ORA-00904:“số hàng được chỉ định vượt quá số lượng tối đa”.

ORA-00900:“không đủ đặc quyền trên đối tượng”.

ORA-00900:“câu lệnh SQL không hợp lệ”.

ORA-00902:“kiểu dữ liệu không hợp lệ”.

Chúng ta có nhiều loại lỗi khác nhau trong SQL. Nhưng nếu bạn không định đóng khung và dán chúng lên tường, bạn cần biết cách đối phó với chúng. Điều tốt là, lỗi SQL đi kèm với một liên kết đến vị trí chính xác của lỗi trong mã và cũng cung cấp thông tin về lỗi.

Hãy bắt đầu với ví dụ lỗi đơn giản nhất:

ORA-00900:“câu lệnh SQL không hợp lệ”.

Như bạn có thể đã đoán, bạn cần viết lệnh đúng cách. Có thể có lỗi đánh máy hoặc dấu phẩy ở nơi nào đó mà nó không thuộc về. Hoặc, tùy từng trường hợp, bạn có thể cần cài đặt phần mềm bổ sung:

“Câu lệnh không được công nhận là câu lệnh SQL hợp lệ.

Lỗi này có thể xảy ra nếu Tùy chọn thủ tục không được cài đặt và một câu lệnh SQL được phát hành yêu cầu tùy chọn này (ví dụ:câu lệnh TẠO THỦ TỤC). Bạn có thể xác định xem Tùy chọn thủ tục đã được cài đặt hay chưa bằng cách khởi động SQL * Plus. Nếu biểu ngữ PL / SQL không được hiển thị, thì tùy chọn này chưa được cài đặt.

Hành động:Sửa cú pháp hoặc cài đặt Tùy chọn thủ tục ”.

Điều tương tự cũng xảy ra đối với loại định dạng hoặc đặt các loại dữ liệu sai nơi chúng không thuộc về:

ORA-00902 loại dữ liệu không hợp lệ

“Nguyên nhân:Loại dữ liệu được nhập trong câu lệnh CREATE hoặc ALTER TABLE không hợp lệ.

Hành động:Sửa cú pháp ”.

Bạn có thể tìm thêm thông tin trong tài liệu Oracle.

Mã lỗi SQL là cách phổ biến nhất để gỡ lỗi các truy vấn SQL. Bất cứ khi nào bạn truy vấn cơ sở dữ liệu và sự cố xảy ra, công cụ cơ sở dữ liệu sẽ tạo mã lỗi SQL. Các mã này đại diện cho vị trí của vấn đề trong truy vấn và cung cấp cho người lập trình thông tin về cách khắc phục hoặc cách giải thích nguyên nhân gây ra vấn đề.

Các loại lỗi chính

Lỗi định dạng

Ví dụ:khi bạn đang sử dụng CHỌN, bạn cần tuân theo nó theo một trình tự nhất định (liệt kê các cột trong bảng, trong đó có sinh viên của chúng tôi và điểm của họ), sau đó là một dấu sao. Nếu bạn không tuân theo định dạng, hãy hoán đổi dấu sao và dấu phẩy xung quanh, bạn sẽ nhận được thông báo lỗi.

“nếu có GIAO DỊCH BẮT ĐẦU, thì giao dịch đó luôn phải kết thúc bằng giao dịch CAM KẾT hoặc QUAY LẠI.”

Một ví dụ khác:sau FROM bạn sử dụng các toán tử như WHERE yêu cầu một điều kiện. Đó có thể là bất kỳ điều kiện nào, bao gồm cả các điều kiện trích xuất dữ liệu, ví dụ:tất cả học sinh có điểm dưới 30. Nếu bạn để trống trường này, bạn sẽ gặp lỗi định dạng.

Lỗi người vận hành

Các lệnh cần tương thích với SQL. Bạn có thể bao gồm SUM và COUNT với WHERE. Nếu không, bạn sẽ gặp lỗi.

Lỗi thủ tục

Mã thủ tục là mã được lưu trữ trên máy chủ mà bạn có thể sử dụng cho các mục đích của mình với những thay đổi nhỏ.

“Thủ tục được lưu trữ là mã SQL đã chuẩn bị sẵn mà bạn có thể lưu, vì vậy, mã có thể được sử dụng lại nhiều lần… Vì vậy, nếu bạn có một truy vấn SQL mà bạn viết đi viết lại nhiều lần, hãy lưu nó dưới dạng một thủ tục được lưu trữ, và sau đó chỉ cần gọi nó để thực thi nó. ” ( Trường W3 )

Để tạo quy trình được lưu trữ từ bảng có tên Khách hàng với tất cả các bản ghi của nó và thực thi nó, chúng tôi có mã sau:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

Nói cách khác, các thủ tục giống như các mẫu được lưu trữ trên một máy chủ mà bạn có thể lấy, sửa đổi và sử dụng khi cần.

Lỗi thủ tục ít nhiều là các loại lỗi thông thường. Sự khác biệt là, chúng không đề cập đến một dòng mã mà là toàn bộ quy trình (mẫu) mà bạn đã lấy và cố gắng thay đổi một chút.

Hãy tưởng tượng bạn có hai bảng, một trống và một đầy. Bạn áp dụng mã dưới đây cho bảng trống:

INSERT to transfer data
SELECT and WHERE to choose data

Một ví dụ về lỗi chiến lược sẽ sử dụng các toán tử như toán tử IN và NOT IN. Nó hấp dẫn nhưng chưa được tối ưu hóa tốt lắm (sử dụng JOIN là một lựa chọn chiến lược tốt hơn nhiều).

Lỗi nghiêm trọng và không nghiêm trọng

Cơ sở dữ liệu như MySQL hoặc PostgreSQL lưu trữ dữ liệu trong các bảng, được tạo thành từ các hàng và cột. Truy vấn cơ sở dữ liệu là các lệnh SQL cho cơ sở dữ liệu biết phải làm gì với dữ liệu của nó. Chúng có thể đơn giản như chọn tất cả các bản ghi từ một bảng hoặc đủ phức tạp để tạo một bảng hoàn toàn mới.

Có hai loại lỗi có thể xảy ra khi sử dụng các lệnh này:nghiêm trọng và không nghiêm trọng.

Lỗi nghiêm trọng sẽ dừng việc thực thi một câu lệnh, trong khi lỗi không nghiêm trọng thì không.

Lỗi nghiêm trọng là lỗi cơ sở dữ liệu không thể sửa được. Lỗi không nghiêm trọng là một sự cố có thể được giải quyết theo một cách nào đó, chẳng hạn như bằng cách khởi động lại dịch vụ SQL Server hoặc phiên bản của SQL Server.

Cơ sở dữ liệu có thể có cả lỗi nghiêm trọng và không nghiêm trọng tại bất kỳ thời điểm nào vì nhiều lý do. Đôi khi, nếu bạn nhận thức được vấn đề, bạn có thể giải quyết nó mà không gặp quá nhiều khó khăn. Những lần khác, không quá nhiều.

Loại lỗi phổ biến nhất là lỗi cú pháp hoặc vấn đề thời gian chạy khác với hệ thống cơ sở dữ liệu truy cập dữ liệu từ bảng SQL. Những lỗi này có thể mắc phải trong quá trình thử nghiệm trước khi chạy mã. Bạn có thể đảm bảo rằng mọi thứ hoạt động bình thường khi được thực thi trên hệ thống cơ sở dữ liệu.

Tạo mã lỗi của bạn với RAISERROR

“Có một hàm RAISERROR có thể được sử dụng để tạo các thông báo lỗi tùy chỉnh của chúng tôi, đây là một cách tuyệt vời để dịch các thông báo lỗi khó hiểu thành một thứ gì đó có ý nghĩa hơn một chút mà mọi người có thể hiểu được.”

Hàm RAISERROR là một lệnh hệ thống máy chủ SQL có thể đưa ra thông báo lỗi. Bạn có thể sử dụng nó để chỉ ra lỗi, cảnh báo hoặc thông báo cung cấp thông tin.

Lỗi có thể do lập trình viên hoặc do chính SQL Server gây ra. Nó hữu ích để cung cấp phản hồi khi có sự cố, cũng như khi có điều gì đó cần xảy ra mà không làm gián đoạn việc thực hiện các câu lệnh khác trong lô.

Sử dụng cú pháp sau:

RAISERROR ( [ error_number ] , [ message ], [ state ])

Bạn cũng có thể áp dụng RAISERROR để chấm dứt việc thực thi một câu lệnh hoặc để chuyển các lỗi do câu lệnh SQL tạo ra cho một ứng dụng khác. Ví dụ:bạn có thể đưa ra thông báo lỗi khiến việc thực thi lô hoặc câu lệnh hiện tại dừng lại, cũng như hiển thị thông báo đã chỉ định.

Cách sử dụng phổ biến nhất cho RAISERROR là tạo thông báo lỗi khi dữ liệu không đáp ứng một số tiêu chí, chẳng hạn như nhập quá nhiều ký tự vào trường chỉ cho phép 50 ký tự.

Raiserror (msg) hữu ích để xử lý các lỗi xảy ra trong quá trình xử lý và nó không yêu cầu toàn bộ giao dịch thất bại vì một lỗi riêng lẻ.

Bây giờ bạn có thể tạo ra nhiều lỗi của riêng bạn như bạn muốn. Hãy vui mừng!

Xử lý lỗi

Để đối phó với các sai sót, chúng ta phải có khả năng kiểm soát chúng và tìm hiểu tất cả các thông tin liên quan. Nó cần thiết cho bất kỳ trường hợp nào phức tạp hơn việc gõ nhầm chữ PRINT trong “Hello World”.

Một cách hữu ích để bắt lỗi là sử dụng TRY… CATCH. Công cụ này cho phép bạn lấy mã của mình và đặt nó trong một môi trường nơi nó có thể được kiểm tra và xử lý một cách an toàn. Ở đó, bạn có thể trích xuất dữ liệu từ nó. Quyết định xem bạn muốn báo cáo lỗi, tìm hiểu thêm về lỗi hoặc sửa lỗi.

Hộp cát máy chủ SQL này giống như sau:

BEGIN TRY  
 	--code to try
END TRY  
BEGIN CATCH  
 	--code to run if an error occurs
--is generated in try
END CATCH

Mã bạn muốn xem được đặt giữa BẮT ĐẦU THỬ và KẾT THÚC. Nếu sai sót xảy ra, nó sẽ được gửi đến câu lệnh CATCH. Điều này cung cấp cho chúng tôi rất nhiều chức năng hữu ích:

  • ERROR_NUMBER trả về số nội bộ của lỗi
  • ERROR_STATE trả về thông tin về nguồn
  • ERROR_SEVERITY trả về thông tin về mọi thứ, từ lỗi thông tin đến lỗi mà người dùng DBA có thể sửa, v.v.
  • ERROR_LINE trả về số dòng tại đó đã xảy ra lỗi
  • ERROR_PROCEDURE trả về tên của thủ tục hoặc hàm được lưu trữ
  • ERROR_MESSAGE trả về thông tin quan trọng nhất và đó là nội dung thông báo của lỗi.

Đây là những gì chúng ta nhận được khi cố gắng chia 1 cho 0:

USE AdventureWorks2014
GO
-- Basic example of TRY...CATCH
 
BEGIN TRY
-- Generate a divide-by-zero error  
  SELECT
    1 / 0 AS Error;
END TRY
BEGIN CATCH
  SELECT
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_STATE() AS ErrorState,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE() AS ErrorLine,
    ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

Như bạn có thể thấy, chức năng TRY… CATCH rất hữu ích.

Tóm tắt

Giờ đây, bạn đã biết chính xác mã lỗi SQL là gì, có những loại lỗi nào, tại sao chúng xảy ra, cách chúng được hộp cát hóa và nghiên cứu, cách tạo tín hiệu lỗi, v.v. Bạn không chỉ chuẩn bị sẵn sàng để đối phó với lỗi! Nếu không, hãy cho chúng tôi biết và chúng tôi sẽ phát hành thêm hướng dẫn trong tương lai. Chúc bạn thành công!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mô hình dữ liệu để giao dịch cổ phiếu, quỹ và tiền điện tử

  2. Truy vấn SQL cơ bản

  3. Bộ xử lý AMD EPYC trong Máy ảo Azure

  4. Máy chủ được liên kết của Salesforce.com và sp_columns_ex

  5. Kiến thức cơ bản về lập trình song song với Fork / Join Framework trong Java