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

Oracle Discussion :

[PL/SQL] fonction et alter session


Sujet :

Oracle

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut [PL/SQL] fonction et alter session
    Bonjour à tous,

    je cherche à faire un alter session à l'interieur d'une fonction PL/SQL.

    Cela marche très bien dans une procédure, mais dans une fonction, je me prends une ORA-14552.
    A noter, que je ne suis pas du tout dans une transaction.

    Quelqu'un comprends pourquoi?

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Désolé, mais il fallait bien lire le post.

    Poser un alter session dans une procédure marche très bien. Je l'ai testé.

    C'est dans une fonction que j'ai des problèmes.

    Sinon, j'oubliai, je travaille en 9.2.0.4

  3. #3
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Je me suis rendu compte de mon erreur, mais trop tard !

    Sinon, l'appel dans un bloc PL/SQL DECLARE BEGIN END ne pose pas de problèmes, c'est seulement dans un appel en select que l'erreur se produit ? c'est cela ?

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    ne serait-ce pas plus simple avec la commande en question

    je pense à une altération interdite en PL/SQL par exemple

  5. #5
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Si l'utilisation par affection := dans un BEGIN/END n'est pas possible, je crains qu'il ne faille déclarer la fonction en automous transaction...

    Les restrict references WNPS, WNDS, RNPS, RNDS n'ont malheureusement pas eu d'impact !

    Soit la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE FUNCTION SCOTT.func_test_sess
    return number  AS
       Result number;
       v_qry varchar2(2000);   
    BEGIN
       v_qry := 'ALTER SESSION SET NLS_SORT=FRENCH';
       execute immediate (v_qry);  
       result := 0; 
       RETURN (result);
    END;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE
      i NUMBER;
    BEGIN
      i := SCOTT.func_test_sess;
    END;
    /
    fonctionne alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SCOTT.func_test_sess FROM DUAL;
    renvoie l'exception.

    On est ok sur le contexte ?

  6. #6
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bonjour,


    Aline, quel est le msg d'erreur renvoyé ? Je suis sous 10g, j'ai fais le petit test de Léo et le msg d'erreur est clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ERROR at line 1:
    ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML
    ORA-06512: at "SCOTT.F", line 3

    Laly.

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Ce qui nous renvoie toujours à la même chose : sans code ni erreur, point de salut

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Bonjour à tous,

    Merci tout d'abord pour votre aide.
    L'exception declarée est bien celle que vous avez vu (ora-14552).
    Notez que cela aussi je l'avais posté dans mon message de départ.
    J'ai exactement le même message que Leo et dans les même conition.

    C'est à dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SCOTT.func_test_sess FROM DUAL;
    me renvoie bien l'exception.



    Et il est vrai que je n'avis pas remarqué que:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE
      i NUMBER;
    BEGIN
      i := SCOTT.func_test_sess;
    END;
    /
    fonctionnait.

  9. #9
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    La nuit portant conseil, ce fonctionnement me semble tout à fait normal !

    En effet, non seulement ça serait gênant, mais en plus, ça n'aurais pas grand sens je trouve qu'un simple select (si ça se trouve fait à travers une vue) puisse comme ça, sans prévenir, changer des paramètres de la session...

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Peux être est-ce normal en effet.
    Mais il y a un truc qui ne me parait pas normal dans le fonctionnement d'Oralce que je cherchai à résoudre par cette méthode.

    En effet, quelqu'un peux m'expliquer pourquoi certaines requêtes ne renvoient un résultat différent en fonction du client qui interroge?

    Essayez par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select to_char(sysdate'D') from dual;
    et bien, cette simple requête renvoie le jour de la semaine en fonction des paramêtres régionnaux du client.
    Donc si vous avez des paramêtres américain par exemple, le premier jour de la semaine est dimanche, vous aurez donc 4 comme reponse à votre requête si on est mercredi.

    Si vos lacal setting sont française ou anglaise, la même requête renverra 3.

    Je cherchai donc dans une fonction qui fait cette requête à mettre les mêmes paramêtre que sur le serveur afin que c'importe quel client utilisant ce code trouve le même résultat.

    Mais peut etre que la solution est de faire un trihgger after logon qui force ce setting.

  11. #11
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    En effet, quelqu'un peux m'expliquer pourquoi certaines requêtes ne renvoient un résultat différent en fonction du client qui interroge?
    C'est la définition même des Local Settings, il me semble... c'est justement la possibilité de s'adapter aux particularités locals, non ?

    Plutôt que de forcer brutalement le NLS des clients, sans leur laisser le choix, je préfèrerais me faire ma fonction à moi qui retourne le n° du jour dans la semaine et qui, selon le NLS du client, ajoute 1 ou non...

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

Discussions similaires

  1. [T-SQL] exécuter un ALTER TABLE/COLUM multiple
    Par elderion dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/10/2005, 16h06
  2. Réponses: 4
    Dernier message: 18/08/2005, 16h11
  3. Réponses: 5
    Dernier message: 13/07/2005, 10h03
  4. [PL/SQL] Fonction qui retourne plusieurs valeurs
    Par Loko dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2004, 09h43
  5. Alter Session : question de TimeOut
    Par Filippo dans le forum Administration
    Réponses: 4
    Dernier message: 13/05/2004, 17h42

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