# CSV-Import nach Oracle per Powershell



## warface (18. Juni 2020)

Hallo zusammen,
ich hoffe Ihr könnt mir weiterhelfen.
ich importiere öfters mal irgendwelche Dokumentenpfade in meine Oracle-Datenbank oder konvertiere csv's per Powershell.
Nun hab ich eine neue Kombination und zwar möchte ich den Inhalt einer CSV in meine Oracle-Datenbank importieren.
Leider klappt es nicht, das Skript läuft durch, aber in der Datenbank kommt nichts an.
Ich könnte natürlich auch per Oracle Loader die Daten importieren, aber die Datei wird täglich neu generiert und heißt immer etwas anders und soll automatisch importiert werden und das geht meiner Meinung nach per Powershell besser.



```
#connection
Add-Type -Path C:\app\client\admin\product\12.1.0\client_1\odp.net\managed\common\Oracle.ManagedDataAccess.dll
$productlist = Import-CSV C:\temp\tool\*.csv
$username = "admin"
$password = "admin"
$datasource = "oracleserver:1521/bu"
$connectionString = "User Id=$username;Password=$password;Data Source=$datasource"
$connection = New-Object Oracle.ManagedDataAccess.Client.OracleConnection("$connectionString")
$connection.open()

#Insert
Foreach($product in $productlist){
#Variablen
$Artikelnummer = $product.Artikelnummer
$Artikelname = $product.Artikelname
$query = 
"INSERT INTO fk.in_fertigungshilfsmittel (
    operation,
    fertigungshilfsmittelid,
    standortid,
    bezeichnung,
    fertigungshilfsmitteltypid,
    erstereinsatztermin,
    letztereinsatztermin,
    lsid
) VALUES (
'I',
$Artikelnummer,
'1',
$Artikelname,
'WERKZEUG_T24',
sysdate,
sysdate,
'1000000000'
);
commit;"
$command = New-Object Oracle.ManagedDataAccess.Client.OracleCommand
$command.Connection = $connection
$command.CommandText = $query
##$command.ExecuteNonQuery()
}
$connection.Close()
```


----------



## Sempervivum (18. Juni 2020)

Wenn ich versuche, das Einlesen zu testen, bekomme ich diese Fehlermeldung:


> Import-CSV : Der Vorgang kann nicht ausgeführt werden, weil der aufgelöste Pfad mehrere Dateien angibt. Dieser Befehl
> kann nicht auf mehrere Dateien angewendet werden.


Lösung:

```
Get-ChildItem -Path 'csvpath' -File *.csv | ForEach-Object {
    $productlist = Import-CSV $_.PSPath -Delimiter ','
    Write-Host $productlist
}
```
Wenn nur eine Datei vorhanden sein darf, u. U. noch ein Errorhandling hinzu fügen.

Edit: Das oben beschriebene kam dadurch zustande, dass ich beim Testen mehrere CSV-Dateien angelegt hatte. Ist es nur eine, funktioniert dies einwandfrei:

```
$productlist = Import-CSV -Path ./csvpath/*.csv -Delimiter ','
Write-Host $productlist
```
Was den Oracle-Teil betrifft, fehlen mir leider die Kenntnisse und die Testumgebung.


----------



## warface (19. Juni 2020)

@Sempervivum vielen Dank für deinen Tipp.
Ich hab's gestern Abend noch hin gekriegt ;-)

hier mal mein Code, falls jemand mal was ähnliches vor hat.


```
ForEach ($file in Get-ChildItem  C:\temp\tool\artikelliste*.csv)
{
$lines = @()

# READ
Import-Csv -Path $file -Delimiter ';' -Encoding default | %{
#Variablen
$Lieferant=$_.Lieferant
$Artikelnummer=$_.Artikelnummer
$Artikelnummer_Lieferant = $_."Artikelnummer Lieferant"
$Artikelname=$_.Artikelname
$Bezeichnung_2 = $_."Bezeichnung 2"
$Bestand = $_.Bestand

# LINE
$line =
"DECLARE
    artikelnummer_verfuegbar   VARCHAR2(1); -- Variable zur Prüfung,ob es die Artikelnummer vorhanden ist
BEGIN
    SELECT
        COUNT(*)
    INTO
        artikelnummer_verfuegbar
    FROM
        fk.in_fhm
    WHERE
        fhmid = '$Artikelnummer';

    IF artikelnummer_verfuegbar = 0 THEN
        INSERT INTO fk.in_fhm (
            operation,
            fhmid,
            standortid,
            bezeichnung,
            fhmtypid,
            erstereinsatztermin,
            letztereinsatztermin,
            lsid
        ) VALUES (
            'I',
            '$Artikelnummer',
            '1',
            '$Artikelname',
            'WERKZEUG_T24',
            '01.01.2010',
            '01.01.2010',
            '1000000000'
        );

    END IF;
commit;
END;"
$lines += $line

Add-Type -Path C:\app\client\admin\product\12.1.0\client_1\odp.net\managed\common\Oracle.ManagedDataAccess.dll

$username = "admin"
$password = "admin"
$datasource = "oracleserver:1521/bu"
$connectionString = "User Id=$username;Password=$password;Data Source=$datasource"
$connection = New-Object Oracle.ManagedDataAccess.Client.OracleConnection("$connectionString")
$connection.open()
# WRITE
$lines | %{
$query = $line
}
#EXECUTE
$command = New-Object Oracle.ManagedDataAccess.Client.OracleCommand
$command.Connection = $connection
$command.CommandText = $query
$command.ExecuteNonQuery()
$connection.Close()
}

Move-Item $file C:\temp\tool\verarbeitet
}
```


----------

