ORA-30926: không thể có được một tập hợp các hàng ổn định trong các bảng nguồn


129

Tôi đang nhận được

ORA-30926: không thể có được một tập hợp các hàng ổn định trong các bảng nguồn

trong truy vấn sau:

  MERGE INTO table_1 a
      USING 
      (SELECT a.ROWID row_id, 'Y'
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

Tôi đã chạy table_1nó có dữ liệu và tôi cũng đã chạy truy vấn bên trong ( src) cũng có dữ liệu.

Tại sao lỗi này đến và làm thế nào nó có thể được giải quyết?

Câu trả lời:


202

Điều này thường được gây ra bởi các trùng lặp trong truy vấn được chỉ định trong mệnh đề USING. Điều này có thể có nghĩa là TABLE_A là bảng cha và ROWID tương tự được trả về nhiều lần.

Bạn có thể nhanh chóng giải quyết vấn đề bằng cách sử dụng DISTINCT trong truy vấn của mình (thực tế, nếu 'Y' là giá trị không đổi, bạn thậm chí không cần đặt nó vào truy vấn).

Giả sử truy vấn của bạn là chính xác (không biết bảng của bạn), bạn có thể làm điều gì đó như thế này:

  MERGE INTO table_1 a
      USING 
      (SELECT distinct ta.ROWID row_id
              FROM table_1 a ,table_2 b ,table_3 c
              WHERE a.mbr = c.mbr
              AND b.head = c.head
              AND b.type_of_action <> '6') src
              ON ( a.ROWID = src.row_id )
  WHEN MATCHED THEN UPDATE SET in_correct = 'Y';

1
Đây có lẽ là lý do tại sao các cách tiếp cận khác (đối với tôi) cũng trả lại các lỗi khác cho tôi (như 'thủ tục, chức năng, gói hoặc loại không được phép ở đây' và 'Không thể sửa đổi một cột ánh xạ tới lỗi bảng không được bảo tồn khóa trong khi cố gắng chèn vào một khung nhìn '). ~ Nếu nó giúp được bất kỳ ai khác, tôi đã gặp lỗi tương tự ngay cả sau khi thêm phân biệt cho đến khi tôi sắp xếp lại tham gia truy vấn bên trong của mình để tôi bắt đầu với bảng nhận được nhiều hơn một hàng và tham gia bên trong từ đó ... nếu điều đó có ý nghĩa.
jinglểula

40

Có lẽ bạn đang cố cập nhật cùng một hàng của bảng đích nhiều lần. Tôi chỉ gặp phải vấn đề tương tự trong một tuyên bố hợp nhất mà tôi đã phát triển. Đảm bảo rằng bản cập nhật của bạn không chạm vào cùng một bản ghi nhiều lần trong quá trình thực hiện hợp nhất.


1
+1, cảm ơn, điều này chỉ xảy ra với tôi trên bảng mục tiêu với một số lượng nhỏ các bản sao (ít nhất là dựa trên các khóa được sử dụng trong hợp nhất).
xương sống

6

Làm thế nào để khắc phục lỗi ORA-30926? (ID tài liệu 471956.1)

1) Xác định tuyên bố thất bại

thay đổi phiên thiết lập sự kiện '30926 dấu vết tên lỗi cấp 3';

hoặc là

thay đổi hệ thống thiết lập sự kiện '30926 lỗi theo dõi tên tắt';

và xem các tập tin .trc trong UDUMP khi nó xảy ra.

2) Đã tìm thấy câu lệnh SQL, kiểm tra xem nó có đúng không (có thể sử dụng gói giải thích hoặc tkprof để kiểm tra kế hoạch thực hiện truy vấn) và phân tích hoặc tính toán thống kê trên các bảng có liên quan nếu điều này gần đây chưa được thực hiện. Việc xây dựng lại (hoặc thả / tái tạo) các chỉ mục cũng có thể giúp ích.

3.1) Câu lệnh SQL có phải là MERGE không? đánh giá dữ liệu được trả về bởi mệnh đề USING để đảm bảo rằng không có giá trị trùng lặp nào trong phép nối. Sửa đổi câu lệnh hợp nhất để bao gồm một mệnh đề xác định trong đó

3.2) Đây có phải là câu lệnh CẬP NHẬT thông qua chế độ xem không? Nếu vậy, hãy thử điền kết quả khung nhìn vào một bảng và thử cập nhật bảng trực tiếp.

3.3) Có một kích hoạt trên bàn? Hãy thử vô hiệu hóa nó để xem nếu nó vẫn thất bại.

3.4) Câu lệnh có chứa chế độ xem không thể hợp nhất trong 'Truy vấn con' không? Điều này có thể dẫn đến các hàng trùng lặp được trả về nếu truy vấn có mệnh đề "FOR UPDATE". Xem lỗi 2681037

3.5) Bảng có các cột không sử dụng không? Đánh rơi những thứ này có thể ngăn ngừa lỗi.

4) Nếu sửa đổi SQL không khắc phục được lỗi, vấn đề có thể xảy ra với bảng, đặc biệt là nếu có các hàng xích. 4.1) Chạy câu lệnh 'ANALYZE TABLE GIÁ TRỊ CẤU TRÚC CẤU TRÚC' trên tất cả các bảng được sử dụng trong SQL để xem liệu có bất kỳ tham nhũng nào trong bảng hoặc các chỉ mục của nó không. 4.2) Kiểm tra và loại bỏ bất kỳ ROWS nào được CHAINED hoặc di chuyển trên bàn. Có nhiều cách để giảm thiểu điều này, chẳng hạn như cài đặt chính xác của PCTFREE. Sử dụng Note 122020.1 - Chuỗi và di chuyển hàng 4.3) Nếu bảng được bổ sung Index được tổ chức, xem: Lưu ý 102932.1 - Theo dõi các chuỗi được xâu chuỗi trên IOT


5

Hôm nay đã xảy ra lỗi trên 12c và không có câu trả lời nào phù hợp (không trùng lặp, không có biểu thức không xác định trong mệnh đề WHERE). Trường hợp của tôi liên quan đến nguyên nhân có thể gây ra lỗi đó, theo văn bản thông báo của Oracle (nhấn mạnh bên dưới):

ORA-30926: không thể có được một tập hợp các hàng ổn định trong các bảng nguồn
Nguyên nhân: Không thể có được một tập hợp các hàng ổn định do hoạt động dml lớn hoặc mệnh đề where không xác định.

Việc hợp nhất là một phần của một lô lớn hơn và được thực hiện trên cơ sở dữ liệu trực tiếp với nhiều người dùng đồng thời. Không cần phải thay đổi tuyên bố. Tôi chỉ thực hiện giao dịch trước khi hợp nhất, sau đó chạy hợp nhất riêng và cam kết lại. Vì vậy, giải pháp đã được tìm thấy trong hành động được đề xuất của tin nhắn:

Hành động: Loại bỏ bất kỳ điều khoản không xác định nào trong các mệnh đề và cấp lại dml .


Tôi đã nhận được thông báo lỗi đó khi thực hiện nhập DataPump qua mạng (sử dụng NETWORK_LINKtham số kết nối trực tiếp với cơ sở dữ liệu nguồn) trong giai đoạn thu thập số liệu thống kê và ghi chú được tô sáng của bạn có thể giải thích điều đó. May mắn thay chỉ là số liệu thống kê đã bị ảnh hưởng.
Mark Stewart

1
SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 -  "unable to get a stable set of rows in the source tables"
*Cause:    A stable set of rows could not be got because of large dml
           activity or a non-deterministic where clause.
*Action:   Remove any non-deterministic where clauses and reissue the dml.

Lỗi này xảy ra với tôi vì hồ sơ trùng lặp (16K)

Tôi đã cố gắng với nó độc đáo .

nhưng một lần nữa khi tôi cố gắng hợp nhất mà không có sự tương tự duy nhất xảy ra Lần thứ hai là do cam kết

sau khi hợp nhất nếu cam kết không được thực hiện, lỗi sẽ được hiển thị.

Không có duy nhất, Truy vấn sẽ hoạt động nếu cam kết được đưa ra sau mỗi hoạt động hợp nhất.


-1

Làm rõ thêm về việc sử dụng DISTINCT để khắc phục lỗi ORA-30926 trong trường hợp chung:

Bạn cần đảm bảo rằng tập hợp dữ liệu được chỉ định bởi mệnh đề USING () không có giá trị trùng lặp của các cột nối , tức là các cột trong mệnh đề ON () .

Trong ví dụ của OP khi mệnh đề USING chỉ chọn một khóa, việc thêm DISTINCT vào mệnh đề USING là đủ. Tuy nhiên, trong trường hợp chung, mệnh đề USING có thể chọn kết hợp các cột chính để khớp với các cột thuộc tính và được sử dụng trong mệnh đề UPDATE ... SET. Do đó, trong trường hợp chung, việc thêm DISTINCT vào mệnh đề USING vẫn sẽ cho phép các hàng cập nhật khác nhau cho cùng một khóa, trong trường hợp đó bạn vẫn sẽ gặp lỗi ORA-30926.

Đây là một chi tiết về câu trả lời của DCookie và điểm 3.1 trong câu trả lời của Tagar, mà từ kinh nghiệm của tôi có thể không rõ ràng ngay lập tức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.