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 :

Contourner l'erreur PLS-00231


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut Contourner l'erreur PLS-00231
    Bonjour

    En cherchant sur le net, j'ai appris qu'on ne pouvait pas faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Declare
    Function toto(p_in varchar2) return varchar2 is
    Begin
     return replace(p_in,.....);
    End toto;
     
    Begin
      Insert into titi values ( toto('AAA') );
    End;
    car le moteur SQL tourne dans un environnement séparé et ne trouve pas du coup la fonction toto, faute qu'elle soit déclarée dans un package public.

    Il y a t-il un moyen de contourner cela ? En effet je n'ai pas envie de déclarer un package temporaire, le compiler puis le dropper et tout le toutim juste pour un simple "script" sql.

    Le fait d'utiliser une fonction et donc du PL/SQL au lieu d'un simple code sql avec le replace dans le insert est du au fait qu'il y a en fait énormément de champs dans ma table avec à chaque fois bcp de replace identiques à effectuer sur chaque, je souhaite donc rendre l'ensemble plus lisible et plus facile à maintenir (modification ultérieure des replace).

    Merci d'avance
    Loko

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Essayez cette approche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    declare
      l_row   dept%rowtype;
      --
      Function Foo(p_in In varchar2) return Varchar2 Is
      Begin
        return Lower(p_in);
      End;
      --
    Begin
      insert into dept(deptno) values (1) returning deptno, dname, loc Into l_row;
      --
      l_row.dname := Foo('TEST');
      l_row.loc   := Foo('TOTO');
      --
      Update dept 
         Set row = l_row
      Where deptno = l_row.deptno;
    End;  
    /

  3. #3
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,

    Vous pouvez essayer d'utiliser du SQL dynamique avec des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Declare
    FUNCTION toto(p_in varchar2) RETURN varchar2 IS
    Begin
     RETURN REPLACE(p_in,.....);
    End toto;
     
    Begin
      EXECUTE IMMEDIATE 'INSERT INTO titi VALUES (:b1, :b2)'
      USING toto('AAA'), toto('BBB');
    End;

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    Merci pour vos réponses

    Je confirme qu'avec des bind variables cela fonctionne (je prefere cette syntaxe plus lisible).

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Houla, si assez simple alors nul besoin de SQL Dynamique!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Declare
      l_var varchar2(100);
      --
      FUNCTION foo(p_in varchar2) RETURN varchar2 IS
      Begin
       RETURN lower(p_in);
      End;
    -- 
    Begin
      l_var := foo('TEST');
      insert into dept values (1,'TEST',l_var);
    End;

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    oui, ca fonctionne, cependant comme je le disais j'ai énormement de champs dans ma table, donc ca me ferait autant de variable à déclarer et à affecter.

    Merci qd meme

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

Discussions similaires

  1. Objet requis: 'expXpath', contourner l'erreur
    Par totoche dans le forum ASP
    Réponses: 3
    Dernier message: 09/11/2006, 14h35
  2. Erreur PLS-00201
    Par AkA dans le forum Oracle
    Réponses: 2
    Dernier message: 14/04/2006, 12h04
  3. Erreur PLS 00103
    Par claralavraie dans le forum Oracle
    Réponses: 4
    Dernier message: 05/01/2006, 17h44
  4. Comment contourner l'erreur ?
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2005, 10h21
  5. fonction LAG et erreur PLS-00103. Oracle 8i
    Par henrirobert dans le forum Oracle
    Réponses: 7
    Dernier message: 26/05/2005, 16h03

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