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!
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
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