2017-05-02 71 views
1

我正尝试使用Powershell脚本对Oracle数据库执行插入操作。这种方法适用于选择查询,但是对于插入它会给出错误。我阅读了很多Stack Overflow帖子和各种其他网站,并尝试过各种方法,但没有一个能够工作。ORA-00917在Powershell中缺少逗号

我该如何调试?我不是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() 

回答

0

对我来说,它看起来像服务器不喜欢变量中的空格。无需向变量添加引号,它将看起来不像SQL语句中的连接字符串。尝试定义这样的变量:

$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`'" 

因此,例如2017年4月20日14点14分00秒“2017年4月20日14点14分00秒”在INSERT语句和服务器在哪里分离值是很明确的。

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

+0

非常感谢。这解决了这个问题。我认为Oracle必须写出更好的错误。我在这方面挣扎如此之多。只有在随机测试后,我才意识到问题在于传递的数据。尽管我在某处传递字符串,但是通过在其下面明确添加它的工作,它被错误地自动铸造。 '$ finishtime = $参数[6]' '$ finishtime =''$ finishtime'“' –

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() 

你不必做那一部分,那就是为什么我已经注释掉了。 请参阅博客以获取更多信息: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 -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() 

希望能帮助到你。

+0

嗨Ranadip,感谢您的评论。 –

+0

嗨Ranadip,感谢您的评论。我正在使用下面的DLL,我没有管理访问权限,我使用的是Oracle 11g 32位,在我的办公室我只能访问这个DLL,所以请告诉你是否知道这个语法。 (我已经编辑了主要查询中的连接细节) –

+0

通过链接,我已经展示了如何使用add类型添加dll。这样做,然后使用上述语法 –

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

+0

嗨Divya,感谢您的评论。在我的情况下,我输入所有的数据作为文本,无论日期时间使用变量,所以我不知道我怎么能使用这个 –