Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Mit der PowerShell Oracle SQL*Plus aufrufen und Daten aus der Oracle Datenbank auslesen
03.2014 Update 12.2017
In Unix kann über Backtick und Pipe nach SQL*Plus ein Kommando in SQL*Plus abgesetzt werden und das Ergebnis in einem Skript verarbeitet werden.
Beispiel für Linux Bash Skript:
#check Version of Database # Workaround for the $ in DB View Names VERVIEW=\$version #Call SQL*Plus ISENTERISE=`echo "set pagesize 0 set feedback off select count(*) from v_${VERVIEW} where banner like '%Enterprise%'; quit"|${ORACLE_HOME}/bin/sqlplus -s / as sysdba` echo "check DB Version - Get 1 for EE and 0 for SE - Result is ${ISENTERISE}" # oder alternativ wenn keine Rückgabe notwendig ist ${ORACLE_HOME}/bin/sqlplus / as sysdba << EOScipt CREATE pfile='${BACKUP_DEST}/${ORACLE_DBNAME}/init_${ORACLE_DBNAME}_${DAY_OF_WEEK}.ora' FROM spfile; exit; EOScipt
Ähnlich kann dies auch in der PowerShell erfolgen:
$isenterprise=@' set pagesize 0 set feedback off select count(*) from v_$version where banner like '%Enterprise%'; quit '@| & "$env:ORACLE_HOME/bin/sqlplus" -s / as sysdba $isenterprise=$isenterprise.Trim() write-host "Info -- check DB Version - Get 1 for EE and 0 for SE - Result is ::" $isenterprise
Der Trick liegt in den @' '@ String Konstrukt und dem & zum Aufruf von SQL*Plus mit Pfad über die Umgebungsvariable ORACLE_HOME. Die Ausgabe von SQL*Plus steht dann in der Variablen isenterprise, Leerzeichen mit der Methode trim entfernen.
!Achtung: Sollen Variablen innerhalb der @' '@ String Konstrukt ausgewertet werden muss mit @““@ für die String Ersetzung gearbeitet werden.
SQL*Plus mehrfach für eine Umgebung über eine Schleife aufrufen
Gelegentlich soll über eine ganze Umgebung von Datenbanken das gleiche Skript aufgerufen werden.
Da in dieser Umgebung das Passwort ein Dollar Zeichen enthält muss dieser Dollar extra „geschützt“ werden. Dazu wird die Variable mit dem einfachen hoch Komma definiert, dann wird das $ nicht im String ausgewertet.
Beispiel:
- callMulit.ps1
$DBS = @("GPIDB1","GPIDB2","GPIDB3","GPIDB4","GPIDB5"); # # use ' to escape the Dollar sign! # $PWD='PASSWORD_MIT_$_SIGN' $COMMAND="database.sql" foreach ($element in $DBS) { $ARGUMENTS="system/$PWD@$element @$COMMAND" echo "-- Info -- Start sqlplus with this $ARGUMENTS" ; start-Process -FilePath sqlplus -ArgumentList "$ARGUMENTS" ; }
Daten als CSV Datei schreiben und wieder einlesen
Auslesen
Variante 12c R2 SQL*Plus mit der „set markup csv“ Formatierung:
#============================================================================== # Desc: write data to the oracle database with sqlplus # Date: 01.12.2017 #============================================================================== <# .NOTES Created: 01.2017 : .SYNOPSIS write data to the oracle database with sqlplus .DESCRIPTION write data to the oracle database with sqlplus .COMPONENT Oracle PS Helper Scripts #> #============================================================================== # Enviroment #============================================================================== Set-Variable CONFIG_VERSION "0.2" -option constant # Set enviroment $oracle_home="C:\oracle\instantclient_12_2" $sql_connect_string="gpi/gpi@gpidb" $data_csv="C:\s-akaby\userPWDImport.csv" #set Oracle HOME variable try { set-item -path env:ORACLE_HOME -value $oracle_home } catch { new-item -path env: -name ORACLE_HOME -value $oracle_home } #read input $input_csv = Get-Content "$data_csv" # loop over each line foreach( $line in $input_csv ) { write-host $line $line="'$line'" write-host $line #Write the data with sqlplus 12c R2! (set markup csv on quote off!) # for all other use the older format settings! $writeData=@" set pagesize 0 set feedback off set markup csv on quote off set heading off select $line as val1, sysdate as val2 from dual; quit "@| & "$env:ORACLE_HOME\sqlplus" -s "$sql_connect_string" $writeData=$writeData.trim() #DEBUG write-host $writeData } #write to file #$readData | Out-File -FilePath "$data_csv" -Append #============================= End of File ====================================
Das Password sollte natürlich hier nicht in Klarschrift in einem produktiven Skript stehen!
Einlesen
- powershell
#============================================================================== # Desc: write data to the oracle database with sqlplus # Date: 01.12.2017 #============================================================================== <# .NOTES Created: 01.2017 : .SYNOPSIS write data to the oracle database with sqlplus .DESCRIPTION write data to the oracle database with sqlplus .COMPONENT Oracle PS Helper Scripts #> #============================================================================== # Environment #============================================================================== Set-Variable CONFIG_VERSION "0.2" -option constant # Set environment $oracle_home="C:\oracle\products\12.2.0.1\client_64" $sql_connect_string="gpi/gpi@gpidb" $data_csv="d:\temp\userDataImport.csv" #set the Oracle HOME variable try { set-item -path env:ORACLE_HOME -value $oracle_home } catch { new-item -path env: -name ORACLE_HOME -value $oracle_home } #read the data input $input_csv = Get-Content "$data_csv" # loop over each line of the data input foreach( $line in $input_csv ) { #debug #write-host $line #split the csv $val1,$val2,$val3 = $line.split(' ') #debug $val1="'$val1'" write-host $val1 $val2="'$val2'" write-host $val2 $val3="'$val3'" write-host $val3 $command="select $val1 as val1, $val2 as val2, $val3 as val3 from dual;" #Write the data with sqlplus $writeData=@" set pagesize 0 set feedback off $command commit; quit "@| & "$env:ORACLE_HOME\sqlplus" -s "$sql_connect_string" try { $writeData=$writeData.trim() } catch { write-host "Object is empty - check your code" } #DEBUG write-host $writeData } #============================= End of File ====================================
Das Password sollte natürlich hier nicht in Klarschrift in einem produktiven Skript stehen!