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

Điền một mảng liên kết bên trong một bảng lồng nhau

Trong câu trả lời cho câu hỏi trước của bạn, tôi đã đề cập rằng việc điền bộ sưu tập sẽ khó hơn với %rowtype đồng ruộng. Theo như tôi được biết, trừ khi bạn khai báo kiểu đối tượng cấp SQL thay vì kiểu bản ghi, bạn không thể sử dụng bulk collect cho điều này (mặc dù nó đáng để kiểm tra nếu điều đó đã thay đổi trong 12c có lẽ).

Tôi tin rằng bạn đang gặp khó khăn với việc sử dụng một vòng lặp con trỏ đơn giản hơn để tạo hai trường trong loại của bạn (tức là %rowtype trường con và rowid trường) riêng biệt, và sau đó tạo tập hợp một dòng tại một thời điểm:

create or replace package body dat_pkg is

    procedure transform_dat (p_batch_name data_test.batch_name%type)
    is

        cursor cur_dat is
        select rowid, a.*
        from   data_test a
        where  batch_name = p_batch_name;

        l_dat_tst typ_dat_tst;
        l_rec data_test%rowtype;

    begin

        for rec_dat in cur_dat loop
            l_rec.data_id := rec_dat.data_id;
            l_rec.data_value := rec_dat.data_value;
            l_rec.batch_name := rec_dat.batch_name;
            -- or use a counter you increment for this...
            l_dat_tst(l_dat_tst.count + 1).data_rec := l_rec;
            l_dat_tst(l_dat_tst.count).data_rowid := rec_dat.rowid;
        end loop;

        -- Do the Transformation here. Example --            

        for i in 1..l_dat_tst.count loop
            if l_dat_tst(i).data_rec.data_value = 'hello' then
                l_dat_tst(i).data_rec.data_value := 'was hello';
            else            
                l_dat_tst(i).data_rec.data_value := 'was not hello';
            end if;
        end loop;

        -- update the table            
        proc_test (p_dat => l_dat_tst);

    end transform_dat;

    procedure proc_test (p_dat  typ_dat_tst)
    is
    begin

        for i in 1..p_dat.count loop

            update  data_test        
            set     data_value  = p_dat(i).data_rec.data_value  
            where   data_id     = p_dat(i).data_rec.data_id
            and     rowid       = p_dat(i).data_rowid;

        end loop;

    end proc_test;

end dat_pkg;
/    

Như đã thảo luận trước đây, các tham chiếu đến các trường của bản ghi trường con phải đủ tiêu chuẩn, vì vậy tôi đã chèn .data_rec trong các tài liệu tham khảo trong cả hai quy trình. Tôi đã thay đổi chuyển đổi giả để sửa đổi giá trị thay vì ID, vì điều đó có nghĩa là sẽ không có cập nhật nào xảy ra.

Demo với một số dữ liệu giả:

insert into data_test values (1, 'hello', 'test');
insert into data_test values (2, 'hello', 'test');
insert into data_test values (3, 'hello', 'exclude');
insert into data_test values (4, 'goodbye', 'test');


exec dat_pkg.transform_dat('test');

select * from data_test;

   DATA_ID DATA_VALUE           BATCH_NAME          
---------- -------------------- --------------------
         1 was hello            test                
         2 was hello            test                
         3 hello                exclude             
         4 was not hello        test                



  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 cách nào để sao chép hoặc cập nhật các chỉ mục và ràng buộc của bảng từ các cơ sở dữ liệu khác nhau?

  2. Có cần CAM KẾT sau mỗi lần THI CÔNG NGAY LẬP TỨC không?

  3. Có thể loại bỏ một truy vấn duy nhất trong oracle mà không giết phiên không?

  4. EM 12c Điều chỉnh Giá trị Ngưỡng

  5. Pl / SQL- Lấy tên cột từ một truy vấn