2016-03-31 6 views
1

Ich möchte eine Skriptdatei zu INSERT/UPDATE Werte in einer Tabelle erstellen. Aus Gründen der Wartung möchte ich ein Array (möglicherweise mehrdimensional) erstellen und es durchlaufen, um die Datensätze einzufügen. Hier sind die Tabellenspalten:Verwenden von Arrays in Oracle-Skripts

Tabellenname: REF_PROPERTY

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

Tabellenname: PAKETE

PACKAGE_ID Number PK 
PACKAGE_NAME VarChar 
PACKAGE_VERSION VarChar 

Wir haben mehrere Pakete (10-15) und jedes Paket hat seine eigene Eigenschaften (40 - 50 Eigenschaften); manche sind gleich. Ich möchte eine Skriptdatei für alle diese Pakete haben, anstatt separate Skriptdateien für jeden dieser Pakete.

Was ich tun möchte, ist so etwas wie diese (Schreiben dieser Art von in-Format nicht-PL/SQL ist und eher eine Codierung Weise): eine Array-Variable deklarieren:

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]; 

Durch das tun oben kann ich die Eigenschaften und ihre Werte in den Skripten pflegen. Wenn wir eine neue Eigenschaft für eine Paketversion hinzufügen, legen wir sie hier ab und führen das Skript aus.

Sagen wir, ich möchte das Skript für die Paketversion v2 ausführen. Deklarieren Sie Variablen für den Paketnamen und die Version und erhalten die Paket-ID:

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; 
Jetzt

, möchte ich durch das Array in einer Schleife, spaltete das erste Element durch Rohrtrennzeichen nach oben (|), überprüfen, ob die Version v2 gibt es und wenn ja, fügen Sie die Werte in die Tabelle ein/aktualisieren Sie sie.

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; 

Ebenso, wenn ich das Skript für Paketversion v3 ausführen möchten, stelle ich die Paketversion v3 und dann das Skript ausführen.

V_PKG_VERSION VarChar := 'v3'; 

Ich hoffe, das gibt eine gute Vorstellung davon, was ich suche zu tun, und wenn dies Minimalisierung der Anzahl von Skriptdateien ist ein guter Ansatz. Und schließlich, wenn in Oracle PL/SQL so etwas möglich ist.

Vielen Dank im Voraus!

+0

Das klingt für mich nach Overkill. Irgendwo müssen Sie die Werte angeben, die eingefügt werden sollen; Warum tust du das nicht als Teil einer Insert-Anweisung? z.B. etwas wie 'in ref_property einfügen (....) wähle 'einige val1a', 'einige val2a', ... aus dualer Vereinigung alle wähle 'einige val1b', 'einige val2b', ... aus dualer Vereinigung alle .. .' – Boneist

+0

Danke. Könnten Sie bitte ein detailliertes Beispiel für das SQL dafür geben? Ich würde das sehr schätzen. Ich weiß, was ich versuche, ist Overkill. Ich möchte wirklich die Eigenschaftsnamen und ihre Werte für alle Pakete in einer einzigen Datei pflegen/spezifizieren, damit wir in Zukunft die Werte nicht durcheinander bringen und wir genau wissen, auf was sie eingestellt wurden. Derzeit habe ich etwa 12 Skriptdateien für jede der Paketversionen und die Wartung ist zu einem Alptraum geworden, besonders wenn andere daran arbeiten, ihre eigenen Skripte hinzuzufügen. – user1100221

Antwort

2

Wenn ich Sie wäre, würde ich entweder eine Einfügung oder eine Zusammenführungsanweisung einrichten, die die Einfügung/Updates handhabt.

Etwas wie:

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; 

Der Vorteil davon, wie dies zu tun ist, dass man sich unterschiedliche Werte für jede Eigenschaft, für den Fall festlegen können sind Änderungen zwischen den Versionen des Pakets.

Mithilfe von MERGE kann Ihr Skript erneut ausgeführt werden, ohne dass die Inhalte verfälscht werden. Ich habe die update-Klausel in der zweiten Anweisung hinzugefügt, nur für den Fall, dass Sie die zuvor eingestellten Werte aktualisieren möchten.

+0

Vielen Dank dafür. Ich werde es jetzt versuchen. Schätze die Hilfe! :) – user1100221

+0

Kein Problem * {:-) – Boneist

Verwandte Themen