Cách khắc phục lỗi Ora-06512

Đọc lại thời gian câu hỏi. Lần này là một câu hỏi của Oracle và 'phải làm gì nếu bạn thấy các lỗi ora-06512'. Tôi phải thừa nhận rằng Oracle không phải là điều của tôi nhưng tôi biết một DBA thân thiện sống bên trong Oracle và sẵn sàng giúp tôi trả lời câu hỏi này để đổi lấy một tách cà phê lớn.

Oracle là một hệ thống quản lý cơ sở dữ liệu đã được khoảng bốn mươi năm trong các hình thức khác nhau. Ban đầu nó sử dụng một cái gì đó gọi là lược đồ SCOTT, được đặt tên theo một trong những nhân viên ban đầu của Oracle. Bạn thậm chí đã đăng nhập vào Oracle lần đầu tiên với tên người dùng 'scott' và mật khẩu 'tiger' được đặt tên theo con mèo của Scott. Bây giờ có một số lược đồ được sử dụng tùy thuộc vào những gì bạn sử dụng Oracle cho.

Nếu bạn muốn tìm hiểu thêm về Oracle, trang này rất hữu ích.

Sửa lỗi Ora-06512

Rõ ràng, một lỗi ora-06512 là một lỗi ngoại lệ chung cho bạn biết một cái gì đó đang đi sai, chứ không phải những gì đang xảy ra.

Ví dụ, cú pháp lỗi có thể đọc:

ORA-01422: tìm nạp chính xác trả về nhiều hơn số hàng được yêu cầu

ORA-06512: tại “DATABASE_NAME”, dòng 66

ORA-06512: tại dòng 1

Dòng đầu tiên cho bạn biết loại lỗi nào đang xảy ra, trong trường hợp này, truy vấn sẽ trả về nhiều dữ liệu hơn truy vấn mong đợi để nó không biết cách xử lý nó. Mã 'ORA-01422' là mã lỗi thực tế bạn cần phải xem xét. ORA-06512 chỉ là mã lỗi chung.

Dòng thứ hai cho bạn biết nơi xảy ra lỗi. DATABASE_NAME sẽ là bất kỳ cơ sở dữ liệu nào bạn đang làm việc tại thời điểm đó. Dòng 66 là dòng nơi xảy ra lỗi và là dòng bạn cần kiểm tra để sửa lỗi.

Dòng thứ ba trong cú pháp lỗi cho bạn biết cuộc gọi đến từ đâu. Kiểm tra một dòng và bạn sẽ thấy một cuộc gọi đến DATABASE_NAME.

Để khắc phục lỗi này, bạn cần khắc phục sự cố do ORA-01422 gây ra, đó là 'tìm nạp chính xác trả về nhiều hơn số hàng được yêu cầu' hoặc bạn cần thêm trình xử lý ngoại lệ để yêu cầu Oracle bỏ qua nó. Khi sửa chữa vấn đề cốt lõi luôn luôn là thích hợp hơn, đây là con đường để đi.

Có hai điều bạn có thể làm. Nếu bạn mong đợi truy vấn trả về nhiều hơn một hàng, bạn có thể sửa đổi nó để nó không ngạc nhiên. Nếu bạn chỉ mong đợi truy vấn trả lại một hàng, bạn cũng có thể sửa đổi nó cho điều đó.

Mong đợi nhiều hơn một hàng:

cho X trong (chọn * từ t ở đâu…)

vòng lặp

- xử lý bản ghi X tại đây

vòng lặp kết thúc;

Điều này sẽ loại bỏ lỗi trong các truy vấn cơ sở dữ liệu mà nhiều hơn một hàng sẽ được trả về.

Nếu bạn chỉ mong đợi một hàng duy nhất được trả lại, bạn có thể thử:

bắt đầu

chọn * vào….

từ t ở đâu….

quá trình….

ngoại lệ

khi NO_DATA_FOUND sau đó

mã xử lý lỗi khi không tìm thấy bản ghi

khi TOO_MANY_ROWS thì

mã xử lý lỗi khi tìm thấy quá nhiều bản ghi

kết thúc;

Phương pháp thứ hai này sẽ chỉ phân phối một hàng duy nhất mà không cần ném lên 'ORA-01422: tìm nạp chính xác trả về nhiều hơn số lỗi của các hàng được yêu cầu và do đó là lỗi ORA-06512 gốc.

Bạn cũng có thể tinh chỉnh truy vấn để nó chỉ trả về hàng đầu tiên của câu trả lời nhiều hàng. Điều này có thể làm việc nếu bạn không có toàn quyền kiểm soát cơ sở dữ liệu hoặc không muốn gây rối với những thứ quá nhiều nhưng vẫn cần câu trả lời.

khai

con trỏ c1 để chọn * từ t ở đâu…

bắt đầu

mở c1;

lấy c1 vào ..

if (c1% notfound) thì

xử lý lỗi không tìm thấy bản ghi

kết thúc nếu;

đóng c1;

kết thúc;

Tôi đã không nhận thấy điều cuối cùng trong hành động nhưng tôi đảm bảo rằng trong trường hợp có thể tìm thấy nhiều lần trả về nhưng bạn chỉ muốn trả về một hàng và không có lỗi, điều này sẽ hoạt động.

Tôi biết một chút SQL, đủ để viết một câu lệnh chọn cơ bản nhưng tôi phải thừa nhận rằng Oracle đã ném tôi. Mặc dù nó là PL / SQL như vậy là tương tự, tôi thấy mình bị mất. PL / SQL là phần mở rộng của ngôn ngữ thủ tục của Oracle đối với SQL, nó cho phép nó làm nhiều thứ thông minh hơn so với SQL vanilla. Tôi thấy câu hỏi thường gặp PL / SQL này hữu ích khi cố gắng tìm hiểu về Oracle, nó cũng có thể giúp bạn.

Như tôi đã đề cập trước đây, tôi không có DBA và biết rất ít về cơ sở dữ liệu cụ thể. Tôi đã cố gắng hết sức để truyền tải những gì mà người bạn của tôi đã giới thiệu cho tôi trong thời gian ngắn ngủi tại bàn làm việc của anh ấy và trong những email tiếp theo. Nếu tôi đã nhận được bất cứ điều gì đáng kể sai, hãy cho tôi biết trong phần ý kiến.

Xem Thêm