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

Oracle - RETURNING kết hợp với các hàm tổng hợp

Trước hết, tài liệu và chức năng thực tế hơi không đồng bộ nên "nguồn chính thức" sẽ không làm sáng tỏ chi tiết.

Sơ đồ cú pháp cho 10g R2 ( https://docs.oracle .com / cd / B19306_01 / appdev.102 / b14261 / returninto_clause.htm ) thấp hơn

Sau 11g ( https://docs.oracle.com/ cd / E11882_01 / appdev.112 / e25519 / returninto_clause.htm ) điều này được chia thành hai:static_returning_clause (để chèn, cập nhật, xóa) và dynamic_returning_clause (để thực thi ngay lập tức). Chúng tôi quan tâm đến công cụ dành cho DML.

Vì vậy, đối với 10g, có một biểu thức hàng duy nhất theo tài liệu là Biểu thức trả về một hàng duy nhất của bảng . Đó là một câu hỏi tinh tế liệu câu lệnh DML có phải ảnh hưởng đến một hàng hay một hàng đơn lẻ có thể được dẫn xuất sau khi thực hiện câu lệnh (giả sử bằng cách sử dụng các hàm tổng hợp). Tôi giả sử ý tưởng là sử dụng cú pháp này khi thao tác DML ảnh hưởng đến hàng đơn (trái ngược với bulk collect into ); không sử dụng các hàm tổng hợp trả về hàng đơn cho các hàng bị ảnh hưởng.

Vì vậy, các hàm tổng hợp trong việc trả về thành mệnh đề không được ghi chép rõ ràng. Hơn nữa, đối với 11g, chỉ có một tên cột có thể xuất hiện sau khi trả về từ khóa, vì vậy ngay cả biểu thức như abs (column_name) cũng không được phép không đề cập đến tổng hợp (column_name), mặc dù trên thực tế, nó hoạt động.

Vì vậy, nói đúng ra, chức năng này với các chức năng tổng hợp không được ghi lại, đặc biệt là đối với 11g, 12c, 18c và bạn không thể dựa vào nó.

Thay vào đó, bạn có thể sử dụng "tập hợp hàng loạt vào" (và toán tử set để có được tập hợp các phần tử riêng biệt)

SQL> create type str_tab as table of varchar2(4000)
  2  /

Type created.

SQL> set serveroutput on
SQL> declare
  2    i int;
  3    a str_tab;
  4  begin
  5    delete from t returning val bulk collect into a;
  6    dbms_output.put_line('cnt all ' || a.count || ' cnt distinct ' || set(a).count);
  7    rollback;
  8  end;
  9  /
cnt all 4 cnt distinct 2

PL/SQL procedure successfully completed.

Cũng chú ý đến thông báo lỗi. Nó nói rõ ràng

Không chỉ "khác biệt không được phép" như trong ví dụ này

SQL> select listagg(distinct val) within group (order by val) str from t;
select listagg(distinct val) within group (order by val) str from t
       *
ERROR at line 1:
ORA-30482: DISTINCT option not allowed for this function


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. bài tập về nhà - cố gắng tính toán nhiều điểm dừng chuyến bay giữa hai thành phố?

  2. Không thể kết nối với Oracle DB nhận được lỗi là java.sql.SQLException:Io ngoại lệ:Bộ điều hợp mạng không thể thiết lập kết nối

  3. Trình kích hoạt Oracle SQL để tự động đặt giá trị cột

  4. Cập nhật bằng cách sử dụng Tham gia - Đa DB / Bảng

  5. Chèn dữ liệu máy chủ SQL với Oracle® SQL * Loader