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

Duyệt qua vòng lặp để tìm các tên lặp lại

Không thực hiện lặp trong các vòng lặp trong PL / SQL cho điều này - sử dụng SQL để cung cấp cho bạn dữ liệu sẵn sàng để sử dụng.

Đầu tiên, chúng tôi tạo bảng của bạn với một số dữ liệu thử nghiệm (tôi đoán là các kiểu dữ liệu - bạn thay thế bằng loại dữ liệu của riêng mình):

create table product_master (
   product_no        varchar2(10)
 , product_holder    varchar2(10)
 , product_catalogue varchar2(10)
)
/

insert into product_master values ('1', 'SMITH', 'TEMP')
/
insert into product_master values ('2', 'SMITH', 'TEMP')
/
insert into product_master values ('3', 'HARRY', 'ARCH')
/
insert into product_master values ('4', 'TOM'  , 'DEPL')
/
commit
/

Những gì chúng tôi muốn gửi tới mail_send quy trình cho từng product_holder là một tập hợp (mảng) chứa product_noproduct_catalogue . Vì vậy, trước tiên, một kiểu có chứa hai yếu tố đó:

create type t_prod_cat_no as object (
   product_no        varchar2(10)
 , product_catalogue varchar2(10)
)
/

Và sau đó là một loại bảng lồng nhau (loại tập hợp) thuộc loại đó:

create type t_prod_cat_no_table as
   table of t_prod_cat_no
/

Quy trình mail_send thì phải chấp nhận product_holder và loại bộ sưu tập:

create or replace procedure mail_send (
   p_parameter        in varchar2
 , p_product_holder   in varchar2
 , p_product_cats_nos in t_prod_cat_no_table
)
is
begin
   dbms_output.put_line('-- BEGIN '||p_parameter||' --');
   dbms_output.put_line('Dear '||p_product_holder);
   dbms_output.put_line('Your products are:');
   for i in 1..p_product_cats_nos.count loop
      dbms_output.put_line(
         'Catalogue: '||p_product_cats_nos(i).product_catalogue||
         ' - No: '||p_product_cats_nos(i).product_no
      );
   end loop;
end mail_send;
/

(Tôi chỉ sử dụng dbms_output để mô phỏng việc tạo một thư.)

Sau đó, bạn có thể tạo nhóm group by product_holder trong SQL và để SQL tạo tập hợp chứa dữ liệu:

Đặt hàng
begin
   for holder in (
      select pm.product_holder
           , cast(
                collect(
                   t_prod_cat_no(pm.product_no,pm.product_catalogue)
                   order by pm.product_catalogue
                          , pm.product_no
                ) as t_prod_cat_no_table
             ) product_cats_nos 
        from product_master pm
       group by pm.product_holder
       order by pm.product_holder
   ) loop
      mail_send(
         'PRODMASTER'
       , holder.product_holder
       , holder.product_cats_nos
      );
   end loop;
end;
/

Đầu ra của khối trên sẽ là:

-- BEGIN PRODMASTER --
Dear HARRY
Your products are:
Catalogue: ARCH - No: 3
-- BEGIN PRODMASTER --
Dear SMITH
Your products are:
Catalogue: TEMP - No: 1
Catalogue: TEMP - No: 2
-- BEGIN PRODMASTER --
Dear TOM
Your products are:
Catalogue: DEPL - No: 4

Làm điều đó trong SQL với GROUP BY cung cấp cho bạn mọi thứ chỉ trong một lệnh gọi từ PL / SQL đến SQL, hiệu quả hơn rất nhiều so với một lệnh gọi đầu tiên để có được tập hợp riêng biệt của product_holder , lặp lại điều đó, sau đó gọi một lệnh cho mỗi product_holder để nhận các sản phẩm cho từng chủ sở hữu.

CẬP NHẬT:

Đã thêm order by vào collect trong đoạn mã trên để cho thấy bạn có quyền kiểm soát thứ tự dữ liệu được điền vào bộ sưu tập.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để có một khóa chính với các giá trị null bằng cách sử dụng chuỗi trống?

  2. Ngăn chặn trình kích hoạt chèn

  3. một truy vấn tổng hợp với một số lưới logic bằng Oracle SQL

  4. Chuyển đổi hàng thành cột trong SQL oracle

  5. Sử dụng toán tử 'LIKE' với một truy vấn con trả về nhiều kết quả