2017-05-02 1 views
1

J'essaye d'effectuer une insertion dans la base de données Oracle en utilisant le script Powershell. Cette approche fonctionne bien pour une requête de sélection, mais pour insérer, elle donne une erreur. J'ai lu beaucoup de messages de Stack Overflow et de divers autres sites et essayé diverses méthodes, mais aucune d'elles ne fonctionne.ORA-00917 virgule manquante dans Powershell

Comment puis-je le déboguer? Je ne suis pas un expert de Powershell. Je suis tout à fait sûr qu'il y a un problème avec le 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() 

Répondre

0

Pour moi, il semble que le serveur n'aime pas les espaces dans vos variables. Sans ajouter de guillemets aux variables, il ne ressemblera pas à une chaîne connectée dans l'instruction SQL. Essayez de définir vos variables comme ceci:

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

Ainsi, par exemple 2017-04-20 14:14:00 sera dans l'instruction INSERT '20/04/2017 14:14:00' et il sera clair pour le serveur où séparer les valeurs. Gardez à l'esprit que cela gèrera toutes les variables comme des chaînes (je ne connais pas les types de données de vos colonnes de table).

+0

merci beaucoup. Cela a résolu le problème. Je pense qu'Oracle doit écrire une meilleure erreur. Je me débattais tellement avec ça. Ce n'est qu'après des tests aléatoires que j'ai réalisé que le problème venait des données transmises. Même si je passais de la corde quelque part, il a été mal lancé automatiquement en ajoutant explicitement ci-dessous cela a fonctionné. '$ finishtime = $ Args [6]' '$ finishtime =" '$ finishtime' "' –

0

Je ne parviens pas à voir la chaîne de connexion dans la requête. Où est créé le $ oraConn?

Je considère que vous avez les détails db.

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

Vous n'avez pas à faire la partie while, c'est pourquoi j'ai commenté. Référez-vous au blog pour plus d'informations: Oracle Database Query From Powershell

Si le problème persiste, veuillez également publier l'erreur. Comme mentionné dans le commentaire que vous n'avez pas accès à 64 bits et que vous souhaitez utiliser uniquement Oracle.DataAccess.dll, alors vous pouvez essayer comme ceci:

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

OU comme mentionné dans le commentaire, utiliser Add-type:

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

Je crois que vous devriez être en mesure de créer la chaîne de connexion comme ceci:

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

J'espère que cela aide.

+0

Salut Ranadip, merci pour le commentaire. –

+0

Salut Ranadip, merci pour le commentaire. Je suis en utilisant dll ci-dessous, je n'ai pas géré l'accès, j'utilise oracle 11g 32 bits, Dans mon bureau, j'ai accès uniquement à cette DLL, s'il vous plaît aviser si vous connaissez la syntaxe pour cela. (J'ai modifié les détails de connexion dans la requête principale) –

+0

Passez par le lien, là j'ai montré comment ajouter la DLL en utilisant le type d'ajout.Faites cela, puis utilisez la syntaxe ci-dessus –

0

Impression de la requête SQL final qui est en cours d'exécution, je vois cela -

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) 

Vous devez insérer correctement les propriétés de date et heure. Voir this.

+0

Salut Divya, merci pour le commentaire. Dans mon cas, je saisis toutes les données sous forme de texte indépendamment de la date et de l'heure en utilisant les variables, donc je ne suis pas sûr de savoir comment je peux utiliser ce –