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

Python Discussion :

executer une procédure stockée avec cx_oracle


Sujet :

Python

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut executer une procédure stockée avec cx_oracle
    Bonjour,
    J'utilise le module cx_oracle sous python 2.4.2.
    je veux executer la requete sql suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    request = "select a.AIRPORT_NAME, gmlpos.ExpLatLong(a.point_name) from airport" 
    self.db = oracledb('ops/opeope00@ACE2008B') 
    dbmsg = self.db.execute(request) 
    IF (dbmsg == "") : 
       ...A l'exécution : 
    Message = request = select a.AIRPORT_NAME, gmlpos.ExpLatLong(a.point_name) from airport, errmsg = ORA-00904: "GMLPOS"."EXPLATLONG": invalid identifier
    La requete exécutée directement sous sqlplus marche bien, donc je ne peux pas mettre en cause la syntaxe de mon ordre SQL ni la déclaration de la procedure stockée. Et sous python, toutes mes requètes fonctionnent sauf celle invoquant gmlpos.ExpLatLong()

    Merci de votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Je pense que tu auras plus de réponses sur le forum Oracle que sur le forum Python, mais au hasard: ne pourrait-il pas s'agir d'un problème de droits ? Le user utilisé pour se connecter à la BD en Python a-t-il le droit d'exécuter la procédure stockée ?

  3. #3
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Sur le forum Oracle, il n'y a pas de raison qu'il connaisse cx_oracle, c'est un freeware qui n'est connu que de la communauté Python me semble t'il. De plus à partir de python, je me connecte avec le user qui me permet de lire d'autres données ou qui me permet d'exécuter ma procédure stockée directement sous sqlplus, et vu le message obtenu, je penche plutôt pour un problème de syntaxe de la requête analysé par cx_oracle.
    Merci

  4. #4
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Je pense, comme dividee, que c'est quand même un souci de droits Oracle.

    J'ai eu plein de fois des cas où une commande fonctionnait sous SQL*Plus mais pas sous PL/SQL, je ne serais pas étonné que la même chose se produise avec les appels SQL à partir de Python.

    Par exemple les commandes DDL (ALTER, etc...) ne fonctionnent pas de base sous PL/SQL, alors qu'ils fonctionnent sous SQL*Plus. Il leur faut des droits supplémentaires.

    Le fait que le reste de ta requête fonctionne sous Python, démontre bien que le reste des droits est ok, il faut donc que tu vérifies les droits d'exécution des procédures et en particulier de gmlpos.ExpLatLong()

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    [...] et vu le message obtenu, je penche plutôt pour un problème de syntaxe de la requête analysé par cx_oracle.
    Je ne pense pas que cx_Oracle analyse la syntaxe de la requête, il la transmet certainement telle quelle au SGBD. Cela fonctionne toujours ainsi à ma connaissance. Le message d'erreur semble aussi être généré par Oracle et pas cx_oracle (il mentionne un code d'erreur standard d'Oracle).

    D'autre part tu sais que la syntaxe est correcte, vu que la requête fonctionne par ailleurs. Il se pourrait que cx_oracle encode mal la chaîne de caractères qui contient la requête, mais je n'y crois pas (il n'y a pas vraiment de caractères spéciaux dans la requête et les autres requêtes fonctionnent).

    Pourquoi un problème de droits pourrait causer ce message d'erreur ? Il se pourrait que, l'utilisateur n'ayant pas les droits sur la procédure stockée, il ne la "voit" pas, et Oracle tente d'interpréter l'appel comme une référence à une colonne, ce qui ne fonctionne pas bien sûr.

    Voilà, je dis ça, mais je n'ai jamais utilisé ni Oracle ni cx_oracle

  6. #6
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291

  7. #7
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci de votre aide.
    Mon besoin a évolué : d'abord je n'utilise pas une procédure stockée mais une fonction stockée; de plus je ne l'utilise pas dans un ordre select mais par invocation directe de la function comme suit et ça marche après quelques tatonnements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def callfunc(self, proc, arg):
                try:
            	return self.cursor.callfunc(proc, cx_Oracle.STRING, arg)
    	    except cx_Oracle.DatabaseError, oerr:
    		raise error, ['', "%s"%(oerr)]
     
    print callfunc("ops$ope.GMLPOS.ExpLatLong",['ABARI','GAIA'])
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE OR REPLACE PACKAGE gmlpos AS
    FUNCTION ExpLatLong(this_point_name IN VARCHAR2, this_airspace_env_name IN VARCHAR2) RETURN VARCHAR2;
    END gmlpos;
    /

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/05/2013, 14h29
  2. Appel d'une procédure stockée avec un curseur
    Par lapanne dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/12/2006, 16h24
  3. Executer une procédure stockée à distance
    Par vvvvv dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/11/2006, 16h12
  4. Faire une procédure stockée avec deux tables
    Par mister3957 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2006, 13h54

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