2014-07-10 39 views
7

Próbuję zalogować się do Oracle DB przy użyciu PowerShell i uruchomić skrypt o nazwie "C: \ Users \ Administrator \ Desktop \ oracle \ OracleCleanTest.sql", Po uruchomieniu PS nic się nie dzieje.Jak uruchomić skrypt SQL Plus w PowerShell

Oto, co mam.

$adminLogon = "sys as sysdba/[email protected]" 
$logon = "sqlplus\sql/[email protected]" 


$mydata = Invoke-SqlPlus -inputfile  "@C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql" $logon 

Próbowałem również.

$database = "ORCL"; 
$user = "sys as sysdba"; 
$pw = "manager"; 

sqlplus.exe -d $database -U $user -P $pw -I "@C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql" 

Próbowałem tego.

& 'C:\app\Administrator\product\11.2.0\client_1\BIN\sqlplus.exe' 'QE-JDBC-1/[email protected] sys as sysdba' '@C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql' 

pojawia się błąd "&. Moduł 'SQLPLUS' nie można załadować Aby uzyskać więcej informacji, uruchom 'Import-Module SQLPLUS' Na linii. 5 char: 3 + & $ mydata Invoke-SqlPlus -inputfile "@C: \ Users \ Administrator \ Desktop \ oracle \ Orac ... + ~~~~~~~ + CategoryInfo: ObjectNotFound: (sqlplus \ sql/manager @ ORCL: String) [] , ParentContainsErrorRecordException + FullyQualifiedErrorId: CouldNotAutoLoadModule "

+0

Have spojrzałeś na "Jak uruchomić exe w grze powershell z parametrami ze spacjami i cudzysłowami", http://stackoverflow.com/questions/1673967/how-to-run-exe-in-powershell-with-parame ters-with-spaces-and-quotes. Odpowiedź Keitha Hilla działa dla mnie. –

+0

Hej, na wszelki wypadek, jeśli nadal chcesz uruchomić SQL * Plus na PowerShell, spójrz na ten moduł: https://www.powershellgallery.com/packages/JS.OracleDatabase –

Odpowiedz

9

Używam operatora połączenia, &, jak zasugerował Keith Hill z pytaniem, How to run an EXE file in PowerShell with parameters with spaces and quotes.

& 'path\sqlplus.exe' 'system/[email protected] as sysdba' 

Umieściłem nazwę użytkownika, hasło w cudzysłowach ze względu na spacje.

Aby uruchomić skrypt, dodaję inny parametr w następujący sposób:

& 'path\sqlplus.exe' 'system/[email protected] as sysdba' '@my_script.sql' 

Jeśli otrzymujesz błąd ORA-12154, a wiesz, że inni użytkownicy mają ustanowione połączenia (co oznacza, że ​​słuchacz bazy poprawnie działa ); Chciałbym wtedy sprawdzić, czy SQL * Plus może znaleźć mój plik tnsname.

Moim pierwszym zadaniem byłoby zobaczyć, czy mogę tnsping następująco Windows cmd.exe:

tnsping orcl 

To potwierdzi, że połączenie może (lub nie można ustalić).

Jeśli nie, sprawdziłbym, czy ustawiono zmienną środowiskową ORACLE_HOME, . SQL * Plus używa tego do znalezienia pliku tnsname.ora.

Jeśli nie jest ustawiona, chciałbym wykonać to oświadczenie w PowerShell (do ustalenia tę zmienną):

[Environment]::SetEnvironmentVariable("ORACLE_HOME", "C:\app\Administrator\product\11.2.0\client_1" , "User") 

Następnie chciałbym ponowić do tnsping (zidentyfikowane powyżej).

Po udanej próbie ponownie spróbuję wykonać powyższe polecenie skryptu.

+0

Otrzymuję ten błąd "ERROR: ORA -12154: TNS: nie można rozwiązać identyfikatora połączenia określonego ", gdy używam" i "C: \ app \ Administrator \ produkt \ 11.2.0 \ client_1 \ BIN \ sqlplus.exe" "system/manager @ ORCL jako sysdba '' @C: \ Users \ Administrator \ Desktop \ oracle \ OracleCleanTest.sql '". – user3826435

+0

Czy ustawiłeś zmienną środowiskową ORACLE_HOME? Czy możesz połączyć się w trybie Windows cmd.exe (np. Czy możesz tnsping orcl)? –

+0

Czy zostawiam "[Środowisko] :: SetEnvironmentVariable (" ORACLE_HOME "," oracle_home_path "," User ")" tak jak jest, czy muszę go zmienić? Jeśli zmienię to, do czego należy zmienić każdego z nich? – user3826435

1

W wierszu polecenia programu Windows PowerShell kod nie wymaga ustawienia zmiennej ani niczego nadzwyczajnego.Wystarczy to zrobić:

sqlplus ElBankoUser\SupaSecretyPass "@C:\Users\ElBankoUser\Documents\MaFancySckrp.sql"

0

Używam tego:

$cmd = "cmd.exe" 
$args = ("/c sqlplus {0}/{1}@{2}:{3}/{4} @{5} {6}" -f $userName, $password, $tnsAlias, $port, $dbInstance, $sqlScript, $outputFileName) 
&$cmd $args 
0

Można użyć .NET Oracle library DLL, tylko upewnij się, że masz odpowiedni plik DLL w folderze lib

Add-Type -Path "lib\Oracle.ManagedDataAccess.dll" 

$query = "select 1 as Col1, 2 as Col2, 3 as Col3 from dual 
      union 
      select 4 as Col1, 5 as Col2, 6 as Col3 from dual 
      union 
      select 7 as Col1, 8 as Col2, 9 as Col3 from dual" 

$cn = New-Object Oracle.ManagedDataAccess.Client.OracleConnection -ArgumentList "TNS-ConnectionString-Here" 
$cmd = New-Object Oracle.ManagedDataAccess.Client.OracleCommand -ArgumentList $query 

$cmd.Connection = $cn 

try { 
    $cn.Open() 

    $reader = $cmd.ExecuteReader() 

    while ($reader.Read()) { 
     $col1 = $reader["Col1"] 
     $col2 = $reader["Col2"] 
     $col3 = $reader["Col3"] 

     Write-Host $col1, $col2, $col3 
    } 

} catch { 
    Write-Error $_.Exception.Message 
} finally { 
    $cmd.Dispose() 
    $cn.Dispose() 
} 
Powiązane problemy