2016-03-31 31 views
1

INSERT/UPDATE değerlerine bir tabloya komut dosyası oluşturmak istiyorum. Bakım uğruna, bir dizi oluşturmak (muhtemelen çok boyutlu) ve kayıtlarını eklemek için içinden geçiyorum.Oracle komut dosyalarındaki dizileri kullanma

TABLO ADI: REF_PROPERTY

REF_PROPERTY_ID Number PK 
PACKAGE_ID Number FK 
PROPERTY_NAME VarChar 
PROPERTY_VALUE VarChar 
OVERRIDE_VALUE Number 

TABLO ADI: PAKETLERİ

PACKAGE_ID Number PK 
PACKAGE_NAME VarChar 
PACKAGE_VERSION VarChar 

Biz birkaç paket (10-15) sahiptir ve her paket kendi vardır İşte tablo sütunları vardır kendi özellik kümeleri (40 - 50 özellik); bazıları aynıdır. Her biri için ayrı komut dosyaları yerine, bu paketlerin tümü için tek bir komut dosyası istiyorum. yaparak

V_MYARR VARRAY; 
myArr[1] = ['v2|v3|v4', 'property1', 'propertyValue1', 1]; 
myArr[2] = ['v1|v2|v3|v4', 'property2', 'propertyValue2', 0]; 
myArr[3] = ['v2|v3|v4|v5', 'property3', 'propertyValue3', 1]; 

: bir dizi değişkeni bildirin: Yapmak istediğim ne

böyle bir şey (bu sigara PL/SQL formatında çeşit ve bir kodlama şekilde daha yazmaya) 'dir yukarıda, komut dosyalarındaki özellikleri ve değerlerini koruyabilirim. Herhangi bir paket sürümü için yeni bir özellik eklediğimizde, onu buraya koyar ve komut dosyasını çalıştırırız.

Diyelim ki, paket sürümü v2 için komut dosyasını çalıştırmak istiyorum. versiyon v2 orada var olup olmadıklarını, | Şimdi

V_PKG_NAME VarChar := 'Package1' 
V_PKG_VERSION VarChar := 'v2'; 
V_PKG_ID Number; 
SELECT PACKAGE_ID INTO V_PKG_ID WHERE PACKAGE_NAME = V_PKG_NAME AND PACKAGE_VERSION = V_PKG_VERSION; 

, ben boru sınırlayıcı tarafından ilk elemanını bölmek, diziye içinde döngü istiyorum(): paket adı ve sürümü için değişkenleri bildir ve paket kimliğini almak ve eğer öyleyse, tablodaki değerleri ekleyin/güncelleyin. Ben paket sürümü v3 için komut dosyasını çalıştırmak istediğinizde

for int arrRow in myArr 
    --split the first element of myArr[arrRow][0] by | and store in a new array variable splitArr 
    --loop through splitArr 
    --if V_PKG_VERSION == splitArr[I] then insert. 
v2 exists in myArr[arrRow][0] so the insert would be (check if value exists before insert): 
INSERT INTO REF_PROPERTY VALUES (REF_PROP_SEQ.nextval, V_PKG_ID, myArr[arrRow][1], myArr[arrRow][2], myArr[arrRow][3]); 

end loop; 

Benzer şekilde, ben v3 için paket versiyonu ayarlayın ve sonra komut dosyasını çalıştırın.

V_PKG_VERSION VarChar := 'v3'; 

Bu komut dosyası sayısını minimalize etmek iyi bir yaklaşım ise, bunu yapmak için ne arıyorum iyi bir fikir verir ve umut. Son olarak, bunun gibi bir şey Oracle PL/SQL'de yapılabilir.

Şimdiden teşekkürler!

+0

Bu bana aşırı ses gibi geliyor. Bir yerlerde, eklenecek değerleri belirtmeniz gerekir; Neden bir ekleme ifadesinin parçası olarak yapmıyorsunuz? Örneğin. ref_property (....) 'ye eklemek gibi bir şey' bazı val1a ',' bazı val2a ', ...' yi seçin, ikili sendikadan tüm 'bazı val1b', 'bazı val2b', ... çift sendikadan seçin. . – Boneist

+0

Teşekkürler. Bunun için SQL'in ayrıntılı bir örneğini verir misiniz? Bunu çok takdir ediyorum. Yapmaya çalıştığım şeyin overkill olduğunun farkındayım. Gerçekten tek bir dosyada tüm paketler için özellik isimlerini ve değerlerini korumak/belirtmek istiyorum, bu yüzden gelecekte değerleri bertaraf etmeyiz ve tam olarak neyi kastettiğimizi biliyoruz. Şu anda, paket sürümlerinin her biri için yaklaşık 12 komut dosyası sahibim ve özellikle de başkalarının kendi komut dosyalarını eklemeye başladıklarında bakım bir kabusa dönüştü. – user1100221

cevap

2

Yerinde olsaydım, ekleme/güncelleştirmeleri işleyen bir ek veya birleştirme deyimi kurardım. gibi

şey:

merge into packages tgt 
using (select 'Package1' package_name, 'v1' package_version from dual union all 
     select 'Package1' package_name, 'v2' package_version from dual union all 
     select 'Package1' package_name, 'v3' package_version from dual union all 
     select 'Package1' package_name, 'v4' package_version from dual union all 
     select 'Package2' package_name, 'v1' package_version from dual union all 
     select 'Package2' package_name, 'v2' package_version from dual) src 
    on (tgt.package_name = src.package_name and tgt.package_version = src.package_version) 
when not matched then 
    insert (tgt.package_id, tgt.package_name, tgt.package_version) 
    values (packages_seq.nextval, src.package_name, src.package_version); 

merge into ref_property tgt 
using (select pkg.package_id, 
       property_name, 
       property_value, 
       override_value 
     from packages pkg 
       inner join (select 'Package1' package_name, 'v1' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all 
          select 'Package1' package_name, 'v2' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all 
          select 'Package1' package_name, 'v2' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all 
          select 'Package1' package_name, 'v2' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all 
          select 'Package1' package_name, 'v3' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all 
          select 'Package1' package_name, 'v3' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all 
          select 'Package1' package_name, 'v3' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all 
          select 'Package1' package_name, 'v4' package_version, 'property1' property_name, 'propertyValue1' property_value, 1 override_value from dual union all 
          select 'Package1' package_name, 'v4' package_version, 'property2' property_name, 'propertyValue2' property_value, 0 override_value from dual union all 
          select 'Package1' package_name, 'v4' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all 
          select 'Package1' package_name, 'v5' package_version, 'property3' property_name, 'propertyValue3' property_value, 1 override_value from dual union all 
          select 'Package1' package_name, 'v1' package_version, 'property1' property_name, 'propertyValue2' property_value, 0 override_value from dual union all 
          select 'Package1' package_name, 'v1' package_version, 'property4' property_name, 'propertyValue4' property_value, 1 override_value from dual union all 
          select 'Package1' package_name, 'v2' package_version, 'property4' property_name, 'propertyValue5' property_value, 0 override_value from dual) prop 
       on (pkg.package_name = prop.package_name and pkg.package_version = prop.package_version)) 
    on (tgt.package_id = src.package_id and tgt.property_name = src.property_name) 
when not matched then 
    insert (tgt.package_id, tgt.property_name, tgt.property_value, tgt.override_value) 
    values (src.package_id, src.property_name, src.property_value, src.override_value) 
--optional: 
when matched then 
    update set tgt.property_value = src.property_value, 
      tgt.override_value = src.override_value; 

bunu böyle yapmanın avantajı durumunda paketin sürümleri arasındaki değişiklikler vardır, her bir özellik için farklı değerler ayarlayabilirsiniz olmasıdır.

MERGE'u kullanarak, komut dosyanızın bir şeyler karıştırmadan yeniden çalıştırılabilir. Daha önce ayarlanmış olan değerleri güncellemeyi istiyorsanız, ikinci cümlede güncelleme maddesine ekledim.

+0

Bunun için çok teşekkür ederim. Şimdi deneyeceğim. Yardımı takdir et! :) – user1100221

+0

Sorun yok * {:-) – Boneist