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 :

Erreur avec un length


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut Erreur avec un length
    Bonjour,

    Je viens ici en désespoir de cause, je n'arrive rien à trouver ni à comprendre pourquoi ça ne marche pas. J'utilise une base de données Oracle 10gR2. J'essaye d'exécuter une procédure pour masquer des informations (basculement d'une base de production à une base de test). Cette procédure doit remplacer les 4 premiers caractères du nom d'une organisation par 'TEST'. Je vérifie donc si le nom de l'organisation fait au moins 4 caractères avant de le remplacer, mais Oracle ne veut pas faire de length sur la ligne renvoyé par mon curseur.

    Je laisse mon code parler de lui-même (je suis un bon gros débutant)

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SET serveroutput ON size 1000000
    
    DECLARE
    my_DB global_name.global_name%Type;
    
    CURSOR current_company IS
    SELECT organization_name FROM company_organization;
    
    BEGIN
    SELECT global_name INTO my_DB FROM global_name;
    
    IF my_DB = 'ORADEMO' THEN
    	DBMS_OUTPUT.put_line('Vous etes connecte à ORADEMO ! Effacement des donnees confidentielles en cours');
    
    	DELETE FROM mes_tables_confidentielles
    	
    	FOR temp IN current_company LOOP
    	  IF LENGTH(temp) > 4 THEN
    	    UPDATE company_organization SET organization_name = CONCAT ('TEST', SUBSTR (organization_name, 5)) WHERE organization_name = temp;
    	  ELSE
    	    UPDATE company_organization SET organization_name = 'TEST' WHERE organization_name = temp;
    	  END IF;
    	END LOOP;
    
    	commit;
    	
    ELSE 
    	DBMS_OUTPUT.put_line('Attention !! Vous n etes pas connecte à ORADEMO !!!');
    
    END IF;
    END;
    et voici ce que j'ai lors de l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
              IF LENGTH(temp) > 4 THEN
                 *
    ERREUR Ó la ligne 40 :
    ORA-06550: Ligne 40, colonne 7 :
    PLS-00306: numÚro ou types d'arguments erronÚs dans appel Ó 'LENGTH'
    ORA-06550: Ligne 40, colonne 4 :
    PL/SQL: Statement ignored
    Merci de votre aide

  2. #2
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Par défaut
    Bonjour,

    La variable temp n'est pas l'élément organization_name du curseur
    current_company.

    La boucle devrait plutot ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FOR temp IN current_company LOOP
    IF LENGTH(temp.organization_name) > 4 THEN
    	    UPDATE company_organization SET organization_name = CONCAT ('TEST', SUBSTR (organization_name, 5)) WHERE organization_name = temp.organization_name;
    	  ELSE
    	    UPDATE company_organization SET organization_name = 'TEST' WHERE organization_name = temp.organization_name;
    	  END IF;
    END LOOP;
    non?

  3. #3
    Membre averti
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Bonjour,

    Je vais tester, mais j'avoue ne pas trop comprendre...

    Lorsque j'ai défini mon curseur, je lui ai bien spécifié une seule colonne. L'opération "FOR temp IN current_company LOOP" alloue automatiquement un élément correspondant aux éléments du curseur, je me trompe ??
    Pourquoi il renverrait une sorte de table avec une colonne et une ligne par itération ??

    ---------

    Je viens de tester, et ca marche !

    J'avoue avoir du mal à comprendre cependant ...

    Merci beaucoup !! (je passe à résolu dans la journée des fois qu'on puisse m'expliquer entre-temps)

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Par défaut
    "FOR temp IN current_company LOOP" alloue automatiquement un élément correspondant aux éléments du curseur, je me trompe ??
    l'élément temp renvoyé est de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    current_company%rowtype
    (un record avec comme champs les colonnes renvoyées par le curseur current_company).

    il est donc normal pour obtenir la valeur de organization_name contenu dans temp d'utiliser .

  5. #5
    Membre averti
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Merci beaucoup Kirgiz !

    Ca me semble toujours louche comme fonctionnement mais bon, si Oracle fonctionne ainsi, je vais m'y adapter !

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

Discussions similaires

  1. Erreur avec ${fn:length}
    Par Bobette dans le forum Taglibs
    Réponses: 3
    Dernier message: 10/04/2012, 17h13
  2. Erreur avec procédure LockWorkStation ...
    Par simonseztech dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/08/2004, 15h33
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

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