2017-05-02 66 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,感謝您的評論。在我的情況下,我輸入所有的數據作爲文本,無論日期時間使用變量,所以我不知道我怎麼能使用這個 –