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 列的数据类型)。
我正在尝试使用 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 列的数据类型)。