Aufgabe:
Für die Import von Personen Bildern solle die Daten aus dem Personalsystem exportiert werden.
Lösung:
Über &1 wirde der Export Pfad übergeben!
Datei: exportPersonalBilder.sql
script
var export_path="&1"
ctx.write("Info -- export nach::"+ export_path + "\n" );
// auslesen der Bilddaten
var bind_vars = {}
var resultData = util.executeReturnList('select DATEINAME_EXPORT,BILD from v_personen where order by 1',bind_vars);
// über alle Bilder exportieren
for (i = 0 ; i < resultData.length ; i++ ) {
//ctx.write( resultData[i].DATEINAME_EXPORT + "\n" );
// Ref auf das Bild
var blobStream = resultData[i].BILD.getBinaryStream(1);
// Dateipfad zusammenstellen
var filepath = export_path + resultData[i].DATEINAME_EXPORT;
var fileptr = java.nio.file.FileSystems.getDefault().getPath(filepath);
ctx.write( "--write file " + resultData[i].DATEINAME_EXPORT + " to :: " + fileptr.toString() +"\n" );
// BLOB extrahieren
try {
java.nio.file.Files.copy(blobStream,fileptr);
}
catch (e) {
ctx.write("EXCEPTION :: "+ e);
}
}
/
exit
Da der Job für das Script unter dem system User laufen soll, muss auch das Credential Objekt für diesen User angelegt werden, das kann aber wiederum nur der das Skript aufrufende User.
D.h. es muss das Passwort zuvor über eine Datei inital übergeben werden. Nach dem ersten Lauf wird hier das Password entfernt und in dem Credential Object hinterlegt:
... $act_user_name=[System.Security.Principal.WindowsIdentity]::GetCurrent().Name if (!(test-path -path $oracle_credential)) { #check if pwd file exits if (!(test-path -path $scriptpath\clear_password.txt)) { "Ersetze diesen Text mit dem richtigen Password!" | Out-File -FilePath $scriptpath\clear_password.txt local-print -text "!! Edit the file $scriptpath\clear_password.txt to set the correct inital password and run again !!" exit } #read password from file $clear_pwd=(Get-Item -Path $scriptpath\clear_password.txt | Get-Content -Tail 1) local-print -text "Info -- Setze fuer den user $act_user_name das neue Password in $scriptpath\clear_password.txt" $user_credential = New-Object System.Management.Automation.PSCredential("$act_user_name", (ConvertTo-SecureString "$clear_pwd" -AsPlainText -Force)) # alternativ prompt for the password! # $user_credential=GET-CREDENTIAL -credential "$db_user" # unset "Ersetze diesen Text mit dem richtigen Password und loesche die Datei $oracle_credential um das Passwort neu zu setzen!" | Out-File -FilePath $scriptpath\clear_password.txt export-clixml -InputObject $user_credential -Path $oracle_credential } else { $user_credential=Import-Clixml -Path $oracle_credential } ...
siehe dazu auch Wohin nur mit den Passwörtern in Windows und Linux Skripten? - Passwörter in Skripten verschlüsselt hinterlegen.
... # set the environment set-item -path env:JAVA_HOME -value "$java_home" & $sqlcl_bin $db_user/$db_password@$database @$scriptpath\exportPersonalBilder.sql "$export_path_param" 2>&1 | foreach-object { local-print -text "IMG EXP OUT::",$_.ToString() } ...