ORA-00917在Powershell中缺少逗号

时间:2017-05-02 09:22:25

标签: powershell odp.net

我正在尝试使用Powershell脚本执行对Oracle数据库的插入。这种方法适用于选择查询,但对于插入,它会产生错误。我阅读了很多Stack Overflow帖子和各种其他网站,并尝试了各种方法,但没有一个工作。

我该如何调试?我不是Powershell的专家。我很确定SQL存在一些问题。

Add-Type -Path "P:\Home\Full Oracle\ora11g_x86\odp.net\bin\2.x\Oracle.DataAccess.dll"

try
{

$compConStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=**)(PORT=1552)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=**)));User Id=**;Password=**;"
$oraConn= New-Object Oracle.DataAccess.Client.OracleConnection($compConStr)

$sid = "0001"
$region = "CH"
$timestamp = "2017-04-20 14:14:00"
$dep = "17-04-2017"
$scenario = "A"
$milestone = "ASB_XREF_GLCC_LOAD_2ND_END_E"
$finishtime = "2017-04-18/11:11"

$sql = "INSERT INTO APP_PDM_MART.PDM_GEAR_KPI_REP_SNOW(ST_ID,PRIORITY,STATUS,ACTIVE,ACTIVITY_DUE,ADD_REPORTED_BY,BUSINESS_CRITICALITY) VALUES($sid,$region,$timestamp,$dep,$scenario,$milestone,$finishtime)"

$oraConn.Open()
$command = New-Object Oracle.DataAccess.Client.OracleCommand($sql,$oraConn)
$tx = $oraConn.BeginTransaction()
$command.ExecuteNonQuery()

3 个答案:

答案 0 :(得分:0)

我无法在查询中看到连接字符串。 $ oraConn 在哪里被创建。

我在考虑你确实有数据库细节。

$username = Read-Host -Prompt "Enter database username"
$password = Read-Host -Prompt "Enter database password"
$datasource = Read-Host -Prompt "Enter database TNS name"
$query = "INSERT INTO APP_PDM_MART.PDM_GEAR_KPI_REP_SNOW(ST_ID,PRIORITY,STATUS,ACTIVE,ACTIVITY_DUE,ADD_REPORTED_BY,BUSINESS_CRITICALITY) VALUES($sid,$region,$timestamp,$dep,$scenario,$milestone,$finishtime)"
$connectionString = 'User Id=' + $username + ';Password=' + $password + ';Data Source=' + $datasource
$connection = New-Object Oracle.ManagedDataAccess.Client.OracleConnection($connectionString)
$connection.open()
$command=$connection.CreateCommand()
$command.CommandText=$query
$reader=$command.ExecuteReader()
<# 
while ($reader.Read()) {
$reader.GetString(1) + ', ' + $reader.GetString(0)
}
#>
$connection.Close()

你不必做while部分,这就是为什么我已经注释掉了。 请参阅博客以获取更多信息:Oracle Database Query From Powershell

如果仍有问题,请发布错误。 正如评论中提到的那样,您无法访问64位并且您只希望使用 Oracle.DataAccess.dll ,那么您可以尝试这样:

[Reflection.Assembly]::Assembly.LoadFrom("c:\Oracle\Oracle11gClientR1\ODP.NET\bin\2.x\Oracle.DataAccess.dll")

如评论中所述,使用Add-Type:

Add-Type -AssemblyName "c:\Oracle\Oracle11gClientR1\ODP.NET\bin\2.x\Oracle.DataAccess.dll"

然后我相信你应该能够像这样创建连接字符串:

 $con = New-Object Oracle.ManagedDataAccess.Client.OracleConnection(“User Id=username;Password=password;Data Source=localhost/db1”)
 $con.open()

希望它有所帮助。

答案 1 :(得分:0)

打印出正在执行的最终SQL查询我看到了这个 -

INSERT INTO APP_PDM_MART.PDM_GEAR_KPI_REP_SNOW (ST_ID, PRIORITY, STATUS, ACTIVE, ACTIVITY_DUE, ADD_REPORTED_BY, BUSINESS_CRITICALITY) 
VALUES(0001, CH, 2017-04-20 14:14:00, 17-04-2017, A, ASB_XREF_GLCC_LOAD_2ND_END_E, 2017-04-18/11:11)

您需要正确插入日期时间属性。请参阅this

答案 2 :(得分:0)

对我而言,服务器似乎不喜欢变量中的空格。如果没有为变量添加引号,它将不会像SQL语句中的连接字符串。尝试像这样定义变量:

{{1}}

所以例如 2017-04-20 14:14:00 将在INSERT语句中'2017-04-20 14:14:00'将明确服务器在哪里分隔值。

请记住,这会将所有变量作为字符串处理(我不知道表列的数据类型)。