IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Passage de script SQL vers base Oracle [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 29
    Par défaut Passage de script SQL vers base Oracle
    Bonjour à tous.

    Même si je commence à avoir quelques notions en Powershell, de nombreuses interrogations demeurent.

    Ma problématique est la suivante : envoyer un script sql (multiples instructions contenues dans un fichier) pour exécution dans une base Oracle.

    Je suis donc parti vers les différentes fonctionnalités existantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	# Déclaration de la connexion ORACLE
    	$oracleConnection = new-object System.Data.OracleClient.OracleConnection $connectionString;
    
    	# Ouverture de la connexion Oracle
    	$oracleConnection.Open();
    avec $connectionString la chaîne de connexion Oracle
    A ce point Ok.

    Afin de simplifier, je passe en arrière plan le chargement du script sql, pour ne m’intéresser qu'à mon point de blocage (du moins , je crois).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $SQLCommandText ="INSERT INTO test_job_tab ( nom_appel,column1,column2 ) VALUES ('xxx','999','111');"
    Write-Host "Préparation de l'envoi vers Oracle du script " -foregroundcolor yellow;
    Write-Host "$SQLCommandText" -foregroundcolor yellow;
    
    $SQLCommand = $oracleConnection.CreateCommand()
    $SQLCommand.CommandText = $SQLCommandText
    Write-Host "SQLCommand construite" -foregroundcolor yellow;
    
    $SQLCommand.ExecuteOracleNonQuery| out-null;
    Write-Host "Commande SQL envoyée au serveur"  -foregroundcolor yellow;
    La encore Ok, même à l'exécution, (pas même une petite exception...)
    Mais, il y a un mais... Cela ne fait rien du tout au niveau de la base...

    par contre si, je modifie le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $SQLCommandText ="INSERT INTO test_job_tab ( nom_appel,column1,column2 ) VALUES ('xxx','999','111') "
    Write-Host "Préparation de l'envoi vers Oracle du script " -foregroundcolor yellow;
    Write-Host "$SQLCommandText" -foregroundcolor yellow;
    
    $SQLCommand = $oracleConnection.CreateCommand()
    $SQLCommand.CommandText = $SQLCommandText
    Write-Host "SQLCommand construite" -foregroundcolor yellow;
    
    $SQLCommand.ExecuteNonQuery()| out-null;
    Write-Host "Commande SQL envoyée au serveur"  -foregroundcolor yellow;
    C'est à dire remplacement de ExecuteOracleNonQuery par ExecuteNonQuery() en n'oubliant surtout pas de supprimer le ; de la commande sql (autrement Exception lors de l'appel de «*ExecuteNonQuery*» avec «*0*» argument(s)*: «*ORA-00933: la commande SQL ne se termine pas correctement), je créer bien une nouvelle ligne dans la table...

    Par contre, j'obtiens un résultat identique à celui de ExecuteOracleNonQuery si j'omets de mettre les parenthèses à la suite de ExecuteNonQuery ; (pas d'erreur, mais aucune écriture dans la base) .

    Donc mon problème sur le ExecuteOracleNonQuery doit donc venir de l'absence des parenthèses.
    Mais là encore blocage, je dois déclarer en paramètre lors de l'appel une variable RowId de type OracleString Réf Msn Microsoft, mais comment fait-on cela en powershell ?

    Voilà, c'est tout comme info.

    Ha si ! Au secours !!!!

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par beretb Voir le message
    Donc mon problème sur le ExecuteOracleNonQuery doit donc venir de l'absence des parenthèses.
    Oui, sans les () PS renvoi les signatures d'une méthode.
    Citation Envoyé par beretb Voir le message
    Mais là encore blocage, je dois déclarer en paramètre lors de l'appel une variable RowId de type OracleString Réf Msn Microsoft, mais comment fait-on cela en powershell ?
    Selon la doc, c'est un paramètre Out, en PS on utilise [REF]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $RowID=$null
    $SQLCommand.ExecuteOracleNonQuery([REF]$RowID)
    Pas besoin de typer la variable PS s'en charge. Code à vérifier

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 29
    Par défaut
    Bonjour Laurent et surtout merci pour ta réponse.
    Malheureusement, même en déclarant comme tu me l'indiques, je me fais insulter :
    Exception lors de l'appel de «*ExecuteOracleNonQuery*» avec «*1*» argument(s)*: «*Impossible de convertir la valeur Null en type «*System.Data.OracleClient.OracleString*».*»

    J'ai testé avec ou sans le point virgule dans la commande, même résultat...

    Peut-être suis-je parti dans une mauvaise voie.
    La finalité de tout cela étant surtout de lire un fichier (en réalité une trentaine) contenant du code sql et de le faire assimiler par le serveur Oracle (code avec création de tables, de package, insertion de lignes, etc,
    etc
    .


  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Essaie en affectant une structure de type OracleString à $RowID ou une chaine vide.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    On doit passer l'adresse d'une structure existante créé par l'appelant et pas seulement l'adresse d'une variable.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 29
    Par défaut
    Bonjour Laurent.

    Nouveau test avec une chaîne vide lors de l'init de RowId.

    Résultat en demi teinte.

    Si on enlève le ; de la commande, le code s’exécute correctement et l'enregistrement est créé en base.

    Par contre, si on le maintient, comme cela doit être avec un ordre sql, d'autant plus si le script contient plusieurs insert (par exemple), j'ai l'erreur
    Exception lors de l'appel de «*ExecuteOracleNonQuery*» avec «*1*» argument(s)*: «*ORA-00933: la commande SQL ne se termine pas correctement

    Donc cette solution n'est pas viable, et j'ai perdu trop de temps à la tester, je vais donc me rabattre sur une autre solution à moins d'un miracle sur celle-ci.

    Bon vendredi, bon week-end et encore merci pour ton aide.

    (je me garde un délai pour la rédaction du miracle s'il existe...)

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Selon :
    ORA-00933 SQL command not properly ended

    Cause: The SQL statement ends with an inappropriate clause. For example, an ORDER BY clause may have been included in a CREATE VIEW or INSERT statement. ORDER BY cannot be used to create an ordered view or to insert in a certain order.

    Action: Correct the syntax by removing the inappropriate clauses. It may be possible to duplicate the removed clause with another SQL statement. For example, to order the rows of a view, do so when querying the view and not when creating it. This error can also occur in SQL*Forms applications if a continuation line is indented. Check for indented lines and delete these spaces.
    Il se peut que la chaine ne soit pas correctement formatée (CR/LF manquant) ou un pb d'encodage ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $SQLCommandText ="INSERT INTO test_job_tab ( nom_appel,column1,column2 ) VALUES ('xxx','999','111');"
    [byte[]][char[]]$SQLCommandText
    Maintenant est-ce Powershell ou l'assembly client qui pose pb, je n'en ai aucune idée.
    Si toutefois tu utilises la substitution, vérifie le contenue de la ligne.
    Si je me souviens bien on peut tracer ce que le client envoi au serveur, mais si tu n'as pas le temps...

    Ceci dit il semble que le point virgule ne soit pas nécessaire dans ce contexte, recherche sur Google avec :
    c# ExecuteOracleNonQuery ORA-00933
    Puis avec
    sqlplus semicolon

    Si c'est le cas, le seul pb qui pourrait poser pb à mon avis serait l'utilisation de fichiers pour un usage commun (SqlPlus et PS).

    Sur ce point tu peux demander confirmation dans le forum Oracle et/ou C#.
    Voir aussi ( recherche semicolon)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 29
    Par défaut
    Bonjour à tous,

    juste quelques lignes pour conclure sur ma problématique.
    Pas de solution trouvée par le biais de powershell.

    Finalement, je me suis tourné vers une arborescence d'appels de script sql en passant sous sqlplus.
    Avantages :
    - Pas de problème d'exécution.

    - Hyper rapide l'éxécution de 30 et quelques scripts se fait en moins d'une minute)
    Bien sûr, je n'ai pas pu comparer avec powershell...

    Inconvénients:
    - Mon choix initial portait sur Powershell afin de switcher d'une instance de base à une autre, puis d'un user à un autre sans se poser de question.
    Et là, cela pèche !
    Obligation de se positionner sur l'instance manuellement, de se connecter avec les différents user (+ saisi du mot de passe en clair ) et demande d’exécution pour chaque bd user...

    - Obligation de définir un ordonnancement de chacune des exécutions, les créations étant inter dépendantes et hiérarchique ; mais comme c'est pour faire un init (one shot), on fera un effort...
    => Ecriture d'une doc

    Voilà !

    Néanmoins, je suis toujours curieux de savoir si j'aurai pu le faire avec powershell, donc si vous trouvez un jour la solution, pensez à me la faire connaitre.


    Merci à tous ceux qui ont lu ce sujet et plus particulièrement à Laurent qui m'a réellement accompagné.

    A ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Creation script Sql de base de données et erreur NOLOCK
    Par miniquick dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/04/2009, 09h12
  2. Requete sql sur base oracle
    Par kiro4 dans le forum SQL
    Réponses: 4
    Dernier message: 18/03/2009, 08h59
  3. Importer du XML vers base Oracle 10g
    Par loul19 dans le forum Import/Export
    Réponses: 0
    Dernier message: 10/09/2008, 11h52
  4. Probleme de date dans requete SQL vers base de donnée MS Access
    Par Uren dans le forum Persistance des données
    Réponses: 1
    Dernier message: 04/08/2008, 13h06
  5. depuis un fichier texte vers base oracle
    Par foulla002 dans le forum JDBC
    Réponses: 5
    Dernier message: 27/07/2006, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo