Oracle PL / SQL'deki bir değişkende birden çok sütun içeren eksi sorgunun sonucunu saklayın

Aug 18 2020

Ben TABLE_TWO kıyasla TABLE_ONE ekstra Proje Kimlikleri hediye almak için kodunun altına kullanıyorum (kaynak Oracle PL bir değişken eksi sorgusu (varchars listesi) Mağaza sonucu / SQL )

DECLARE 
  l_missing_id_list SYS.ODCINUMBERLIST;
BEGIN
  SELECT project_id
  BULK COLLECT INTO l_missing_id_list
  FROM 
    (
    SELECT t1.project_id FROM table_one t1
    MINUS
    SELECT t2.project_id FROM table_two t2 );
    
  FORALL i IN l_missing_id_list.FIRST..l_missing_id_list.LAST
    INSERT INTO table_two VALUES ( l_missing_id_list(i) );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_id_list to add to your email.
END;

Şimdi ikinci tabloya da karşılık gelen Proje Adlarını eklemek istiyorum. TABLE_TWO ile karşılaştırıldığında TABLE_ONE'da bulunan ekstra proje kimlikleri, karşılık gelen Proje Adlarıyla birlikte TABLE_TWO'ya eklenmelidir. Nasıl yapılır? Sonuçla birden fazla adım gerçekleştireceğim için eksi sorgu sonucunu bir değişkende saklamam gerektiğini lütfen unutmayın.

Yanıtlar

1 MatthewMcPeak Aug 18 2020 at 21:11

SYS.ODCINUMBERLISTher kaydın tek bir numaraya sahip olduğu bir listedir. Her satırdaki birden çok alanı depolamak için yeni bir kayıt türü kullanmanız gerekir.

Yerine kullanmak için bir kayıt türü tanımlayabilirsiniz SYS.ODCINUMBERLIST. Ancak SELECT, imleç olarak yeni bir türü tanımlayabilmeniz için ifadeyi açık bir imleç olacak şekilde hareket ettirme eğilimindeyim %ROWTYPE. Bu şekilde, kayıt türünüz ve select deyimi her zaman tutarlıdır, ancak kodunuzun yapısını biraz değiştirir.

İşte bu yaklaşım:

DECLARE 

  CURSOR c_select IS
      SELECT project_id, project_name
      FROM 
        (
          SELECT t1.project_id, t1.project_name FROM table_one t1
          MINUS
          SELECT t2.project_id, t2.project_name FROM table_two t2 );

  TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
  l_missing_row_list l_missing_row_list_typ;
  
BEGIN
  OPEN c_select;
  FETCH c_select BULK COLLECT INTO l_missing_row_list;
  CLOSE c_select;
  
  FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
    INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
END;

BULK COLLECT(Hem burada hem de orijinal gönderinizde) hakkında bir not - toplu olarak topladığınız veriler PGA belleğinde saklanır. Öyleyse, bu kodu bir değişiklik varmış gibi kullanmayın, yeni kayıtların sayısı mantıksız olacaktır (belki birkaç binden fazla).