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

ORA-14551:không thể thực hiện thao tác DML bên trong truy vấn

Ý nghĩa của lỗi khá rõ ràng:nếu chúng ta gọi một hàm từ câu lệnh SELECT, nó không thể thực thi các câu lệnh DML, đó là INSERT, UPDATE hoặc DELETE, hoặc thực sự là các câu lệnh DDL.

Bây giờ, đoạn mã bạn đã đăng có chứa một lệnh gọi đến PIPE ROW, vì vậy rõ ràng bạn đang gọi nó là SELECT * FROM TABLE (). Nhưng nó bao gồm các câu lệnh DELETE và INSERT nên rõ ràng nó không phù hợp với mức độ tinh khiết cần thiết cho các hàm trong câu lệnh SELECT.

Vì vậy, bạn cần loại bỏ các câu lệnh DML đó. Bạn đang sử dụng chúng để điền vào một bảng tạm thời toàn cầu, nhưng đây là một tin tốt. Bạn chưa bao gồm bất kỳ mã nào thực sự sử dụng GTT nên rất khó để chắc chắn, nhưng việc sử dụng GTT thường là không cần thiết. Với nhiều chi tiết hơn, chúng tôi có thể đề xuất các giải pháp thay thế.

Điều này có liên quan đến câu hỏi khác này của bạn ? Nếu vậy, bạn đã làm theo lời khuyên của tôi để kiểm tra câu trả lời mà tôi đã đưa ra cho một câu hỏi tương tự ?

Vì lợi ích của sự đầy đủ, có thể bao gồm các câu lệnh DML và DDL trong một hàm được gọi trong một câu lệnh SELECT. Cách giải quyết là sử dụng pragma AUTONOMOUS_TRANSACTION. Đây hiếm khi là một ý tưởng hay và chắc chắn sẽ không giúp ích được gì trong trường hợp này. Bởi vì giao dịch là tự quản nên những thay đổi mà nó thực hiện là vô hình đối với giao dịch đang gọi. Có nghĩa là trong trường hợp này, hàm không thể thấy kết quả của việc xóa hoặc chèn trong GTT.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chạy SCRIPT từ PL / SQL Block

  2. PL SQL:Cách hiển thị nano giây của TIMESTAMP

  3. Truy vấn SQL hoạt động trong PL / SQL nhưng không hoạt động trong Visual Studio

  4. 2 cách để định dạng kết quả truy vấn của bạn trong SQLcl (Oracle)

  5. Sự khác biệt chính giữa Varchar2 và char là gì