ORA-00917: Powershell 中缺少逗号

ORA-00917 missing comma in Powershell

我正在尝试使用 Powershell 脚本向 Oracle 数据库执行插入操作。这种方法适用于 select 查询,但对于插入它会出错。我阅读了很多 Stack Overflow 帖子和其他各种网站,并尝试了各种方法,但 none 有效。

我该如何调试它?我不是 Powershell 方面的专家。我很确定 SQL.

有问题
Add-Type -Path "P:\Home\Full Oracle\ora11g_x86\odp.net\bin.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()

我无法在查询中看到连接字符串。 $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

如果仍然有问题,请 post 错误。 如评论中所述,您无权访问 64 位并且希望仅使用 Oracle.DataAccess.dll,那么您可以这样尝试:

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

或如评论中所述,使用添加类型:

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

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

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

希望对您有所帮助。

打印出正在执行的最终 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

对我来说,服务器似乎不喜欢您的变量中的空格。如果不向变量添加引号,它看起来不像 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-04-20 14:14:00 将是 '2017-04-20 14:14:00' 在 INSERT 语句中,服务器将清楚在何处分隔值。

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