如何在 PowerShell 中运行 SQL Plus 脚本
Posted
技术标签:
【中文标题】如何在 PowerShell 中运行 SQL Plus 脚本【英文标题】:How to run a SQL Plus script in PowerShell 【发布时间】:2014-09-01 04:16:19 【问题描述】:我正在尝试使用 PowerShell 登录 Oracle DB 并运行一个名为“C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql”的脚本,当我执行 PS 时没有任何反应。
这就是我所拥有的。
$adminLogon = "sys as sysdba/manager@ORCL"
$logon = "sqlplus\sql/manager@ORCL"
$mydata = Invoke-SqlPlus -inputfile "@C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql" $logon
我也试过这个。
$database = "ORCL";
$user = "sys as sysdba";
$pw = "manager";
sqlplus.exe -d $database -U $user -P $pw -I "@C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql"
我试过了。
& 'C:\app\Administrator\product\11.2.0\client_1\BIN\sqlplus.exe' 'QE-JDBC-1/manager@ORCL sys as sysdba' '@C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql'
我收到错误消息“&:无法加载模块‘sqlplus’。有关更多信息,请运行‘Import-Module sqlplus’。 在行:5 字符:3 + & $mydata Invoke-SqlPlus -inputfile "@C:\Users\Administrator\Desktop\oracle\Orac ... + ~~~~~~~ + CategoryInfo : ObjectNotFound: (sqlplus\sql/manager@ORCL:String) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : CouldNotAutoLoadModule"
【问题讨论】:
你看过“如何在 powershell 中使用带空格和引号的参数运行 exe”,***.com/questions/1673967/…。 Keith Hill 的回答对我有用。 嘿,如果您仍想在 PowerShell 上运行 SQL*Plus,请查看此模块:powershellgallery.com/packages/JS.OracleDatabase 【参考方案1】:我使用呼叫接线员 &
,正如 Keith Hill 建议的问题 How to run an EXE file in PowerShell with parameters with spaces and quotes。
& 'path\sqlplus.exe' 'system/password@dbase as sysdba'
由于空格,我将用户名、密码放在引号中。
要启动一个脚本,我添加另一个参数如下:
& 'path\sqlplus.exe' 'system/password@dbase as sysdba' '@my_script.sql'
如果您收到 ORA-12154 错误,并且您知道其他用户有 已建立的连接(这意味着数据库侦听器正在运行 适当地);然后我会检查 SQL*Plus 是否可以找到我的 tnsname 文件。
我的第一个任务是看看我是否可以在 Windows cmd.exe 中按如下方式进行 tnsping:
tnsping orcl
它将确认连接可以(或不能建立)。
如果不能,我会检查环境变量 ORACLE_HOME, 已设置。 SQL*Plus 使用它来查找 tnsname.ora 文件。
如果未设置,我将在 PowerShell 中执行此语句(以建立 这个环境变量):
[Environment]::SetEnvironmentVariable("ORACLE_HOME", "C:\app\Administrator\product\11.2.0\client_1" , "User")
接下来,我将重试 tnsping(如上所示)。
一旦成功,我会重新尝试执行上面的脚本运行命令。
【讨论】:
我收到此错误,“错误:ORA-12154:TNS:无法解析指定的连接标识符”,当我使用时,“& 'C:\app\Administrator\product\11.2.0 \client_1\BIN\sqlplus.exe' 'system/manager@ORCL as sysdba' '@C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql'"。 您是否设置了 ORACLE_HOME 环境变量?你可以在 Windows cmd.exe 模式下连接吗(例如你可以 tnsping orcl)吗? 我是保留“[Environment]::SetEnvironmentVariable("ORACLE_HOME", "oracle_home_path" , "User")" 还是需要更改它?如果我确实要更改它,应该将每个更改为什么? 我运行环境更改并重新启动并再次尝试,我仍然得到相同的结果。我应该保持“用户”不变还是改变它?我将其保留为“用户”。 windows cmd.exe模式下,可以tnsping orcl吗?如果不能,则意味着 SQL*Plus 的配置存在问题。您在 tnsname.ora 文件中是否有 orcl 的条目?【参考方案2】:我用这个:
$cmd = "cmd.exe"
$args = ("/c sqlplus 0/1@2:3/4 @5 6" -f $userName, $password, $tnsAlias, $port, $dbInstance, $sqlScript, $outputFileName)
&$cmd $args
【讨论】:
【参考方案3】:在您的 Windows PowerShell 命令提示符中,代码不需要变量设置或任何花哨的东西。只需这样做:
sqlplus ElBankoUser\SupaSecretyPass "@C:\Users\ElBankoUser\Documents\MaFancySckrp.sql"
【讨论】:
【参考方案4】:您可以使用.NET Oracle library DLL,只要确保lib
文件夹下有所需的DLL 文件
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()
【讨论】:
【参考方案5】:为什么不用这个?
sqlplus -s $adminLogin "@C:\Users\Administrator\Desktop\oracle\OracleCleanTest.sql"
-s 只是抑制 sqlplus 横幅。
【讨论】:
以上是关于如何在 PowerShell 中运行 SQL Plus 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Plus/SQL-PL 中使用迭代或作为函数运行查询?
如何在调用之前检查 Java Web 服务是不是已在 PL/SQL 中启动并运行