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

PL/SQL Oracle Discussion :

Fonction et écriture dans une base


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut Fonction et écriture dans une base
    Salut,
    je vais essayer d'expliquer ma problematique de manière simple :
    Je dois créer une vue qui va permettre d'accéder à des champs provenant de synonymes issues d'autre schéma.
    J'ai procédé de la façon suivante :
    1) création d'un type qui contient la structure de la table table_obj_type
    2) création d'un type qui table de table_obj_type
    3) création d'une fonction f_alim d'alimentation de la table créée en 2)
    4) création d'une vue qui fait un select * from table(f_alim)

    Jusque là tout va bien. Mais c'est là que ca se complique un peu. en effet, l'acces aux synonymes n'est possible qu'après avoir écrit dans une table temporaire qui ouvre l'accès pendant un laps de temps. Pour ce faire, j'ai une fonction f_available que je dois appeler.
    a) j'ai essayer de l'appeller depuis ma fonction f_alim, et là j'ai l'erreur ORA-14552 . cannot perform a DDL, commit or rollback inside a query or DML
    En effet, la fonction allant faire une mise à jour, elle fait un commit implicite.
    b)J'ai essayé également autonomous_transaction, mais apapremment l'appel de la fonction d'acces n'est pas commité du tout et je ne vois pas mes données.
    c) enfin, j'ai essayé de créer une procédure encapsulant f_available et de l'appeller depuis ma fonction f_alim. Je crois qu'il est impossible d'appeller une procedure depuis une fonction.

    Bref, je sèche un peu. Est-ce que quelqu'un aurait une petite idée pour que je puisse m'en sortir ?

    Merci d'avance

    Rikko

    PS: lorsque j'execute f_available puis ma fonction, aucun problème, mais je voudrais avoir un seul appel, car j'ai beaucoup de synonymes à gérer

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 47
    Par défaut
    Bonjour,

    a) j'ai essayer de l'appeller depuis ma fonction f_alim, et là j'ai l'erreur ORA-14552 . cannot perform a DDL, commit or rollback inside a query or DML
    En effet, la fonction allant faire une mise à jour, elle fait un commit implicite.
    Si on se fie à l'erreur, vous appeler f_available dans un ordre SQL faisant parti de votre fonction f_alim. Votre fonction f_available comportant des commandes DDL, Oralce vous informe que ce n'est pas possible d'inclure une telle fonction dans un ordre SQL. Il est donc impossible d'y faire appel dans une requête.

    b)J'ai essayé également autonomous_transaction, mais apapremment l'appel de la fonction d'acces n'est pas commité du tout et je ne vois pas mes données.
    Sans voir le code, on ne peut pas vous dire si le commit est bien placé, mais si lors d'une transaction si il y a une erreur Oracle relevée, vous n'aurez pas de commit ni de rollback implicite (à ma connaissance).

    c) enfin, j'ai essayé de créer une procédure encapsulant f_available et de l'appeller depuis ma fonction f_alim. Je crois qu'il est impossible d'appeller une procedure depuis une fonction.
    Appeler une fonction dans une procédure est possible, le contraire serait handicapant. Mais ça ne résoudra pas votre problème puisqu'au final le code de f_alim qui génère l'erreur sera toujours exécuter.

    Cordialement,

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    a) j'ai essayer de l'appeller depuis ma fonction f_alim, et là j'ai l'erreur ORA-14552 . cannot perform a DDL, commit or rollback inside a query or DML
    En effet, la fonction allant faire une mise à jour, elle fait un commit implicite.
    Si on se fie à l'erreur, vous appeler f_available dans un ordre SQL faisant parti de votre fonction f_alim. Votre fonction f_available comportant des commandes DDL, Oralce vous informe que ce n'est pas possible d'inclure une telle fonction dans un ordre SQL. Il est donc impossible d'y faire appel dans une requête.
    C'est possible de faire du DDL dans ce cas mais en Dynamique.
    Il faudrait voir le code pour en dire plus

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 47
    Par défaut
    Bonjour,

    C'est possible de faire du DDL dans ce cas mais en Dynamique.
    Il faudrait voir le code pour en dire plus
    Je travaille sous Oracle9i et ce n'est pas possible dans mon cas.

    Je prends un exemple de fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE FUNCTION F_TEST (P_DATE   DATE)
        RETURN VARCHAR2
    AS
    BEGIN
        EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_LANGUAGE = "ENGLISH"';
        RETURN TO_CHAR(P_DATE, 'DAY DD MONTH YYYY');
    END F_TEST;
    La fonction se crée correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL> select f_test(sysdate) from dual;
    select f_test(sysdate) from dual
    *
    ERREUR Ó la ligne 1 :
    ORA-14552: opÚration DDL, commande COMMIT ou ROLLBACK interdites dans une instruction DML ou une interr.
    ORA-06512: Ó "XXX.F_TEST", ligne 5
    Par contre en ajoutant la propriété PRAGMA AUTONOMOUS_TRANSACTION à la fonction l'appel fonctionne correctement.
    SQL> select f_test(sysdate) from dual;

    F_TEST(SYSDATE)
    ---------------------------------------
    TUESDAY 27 MARCH 2012
    Mais je ne vois pas par contre en quoi l'exécution d'une commande DDL à travers l'appel d'une fonction dans un ordre SQL ou une commande DML est pertinente.

    Je ne sais pas si cela résoud le problème de la discussion. Autrement il faudra exposer de façon plus clair vos objectifs, peut être que la méthode employée n'est pas adaptée.

    Cordialement,

  5. #5
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Bonjour Juda,

    c'est exactement le cas précis. Je vais faire quelques essais avec les conseils que tu m'as donné. Dans le cas ou je n'arrive pas à mes fins, je reviendrais poster ici avec des morceau de code afin de mieux exposer mon problème.

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/08/2010, 02h10
  2. [MySQL] Récupérer une variable d'une fonction et enregistrement dans une base de données
    Par Mikke dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/03/2008, 17h02
  3. lecture et écriture dans une base :o
    Par kayobil dans le forum VB.NET
    Réponses: 11
    Dernier message: 28/09/2007, 19h26
  4. [ODBC] écriture dans une base access 97
    Par menuge dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/05/2007, 13h24
  5. Réponses: 3
    Dernier message: 23/03/2007, 07h54

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