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 avec état invalide [11g]


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 43
    Points
    43
    Par défaut Fonction avec état invalide
    Bonjour,

    Je ne suis pas un habitué d'Oracle, et je ne comprends pas pourquoi ma fonction ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION uppercase_fields_name()
    BEGIN
      FOR r IN ( SELECT owner, table_name, column_name
                 FROM   ALL_TAB_COLUMNS
                 WHERE  owner IN ( 'URBA' )
                 AND    column_name <> UPPER( column_name )
               )
      LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE "' || r.owner || '"."' || r.table_name
                || '" RENAME COLUMN "' || r.column_name || '" TO ' || r.column_name;
      END LOOP;
    END;
    /
    Quand je souhaite l''exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select uppercase_fields_name() FROM DUAL;
    J'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Error: ORA-06575: Package or function UPPERCASE_FIELDS_NAME is in an invalid state
     
    SQLState:  65000
    ErrorCode: 6575
    Position: 40
    D'où cela peut venir ?

    Merci.

  2. #2
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Hello,
    elle est en statut invalide car il y a une erreur de syntaxe : ou est le return ?
    Que va valoir ce return code ? Il faut lui affecter une valeur.
    Sinon il faut écrire une procédure à la place d'une fonction.

    Le code sans erreur (mais sans return code) est :
    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
     
    CREATE OR REPLACE FUNCTION uppercase_fields_name
    return number
    is
    BEGIN
      FOR r IN ( SELECT owner, table_name, column_name
                 FROM   ALL_TAB_COLUMNS
                 WHERE  owner IN ( 'URBA' )
                 AND    column_name <> UPPER( column_name )
               )
      LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE "' || r.owner || '"."' || r.table_name
                || '" RENAME COLUMN "' || r.column_name || '" TO ' || r.column_name;
      END LOOP;
    END;
    /

  3. #3
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 43
    Points
    43
    Par défaut
    Ok, merci. Le retour m'importe peu, du moment que la fonction/procédure est exécutée.

    Par contre, quand j'exécute votre code, j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Error: ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML 
    ORA-06512: at "SYSTEM.UPPERCASE_FIELDS_NAME", line 10
     
    SQLState:  72000
    ErrorCode: 14552
    Position: 40

  4. #4
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Une fonction ne peut réaliser que des requêtes. Pour votre opération, il faut passer par une procédure.

    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
     
    CREATE OR REPLACE PROCEDURE uppercase_fields_name
    is
    BEGIN
      FOR r IN ( SELECT owner, table_name, column_name
                 FROM   ALL_TAB_COLUMNS
                 WHERE  owner IN ( 'URBA' )
                 AND    column_name <> UPPER( column_name )
               )
      LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE "' || r.owner || '"."' || r.table_name
                || '" RENAME COLUMN "' || r.column_name || '" TO ' || UPPER(r.column_name);
      END LOOP;
    END;
    /
    Au passage, j'ai rajouté un UPPER après le 'TO'.

    Et l'appel devient alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN
      UPPERCASE_FIELDS_NAME();
    END;

  5. #5
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Pour info, après modification d'une table, par exemple, je vérifie que les dépendances (packages, triggers) sont valides avec cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM user_objects
    WHERE status = 'INVALID'
    ORDER BY object_type, object_name

  6. #6
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 43
    Points
    43
    Par défaut
    Merci Cincinnatus.

    La procédure est bien "valid", mais quand je l'appel avec


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BEGIN
      UPPERCASE_FIELDS_NAME();
    END;
    /
    J'ai un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Error: ORA-01031: insufficient privileges
    ORA-06512: at "SYSTEM.UPPERCASE_FIELDS_NAME", line 10
    ORA-06512: at line 2
     
    SQLState:  42000
    ErrorCode: 1031
    Position: 39
    Hors je suis connecté en "system" et a priori, j'ai tous les droits :/

    EDIT : C'est ok. Je me suis crée un utilisateur ! Ça fonctionne ! Merci tout le monde.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 3
    Dernier message: 05/09/2006, 00h47
  3. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  4. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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