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] procédure: fin de fichier sur canal de com...


Sujet :

Oracle

  1. #1
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut [PL/SQL] procédure: fin de fichier sur canal de com...
    Bonjour!

    Ce que j'ai: une table dont la pk est autoincrémentée grâce à une séquence
    Ce que je veux: lorsque la clé max de ma table est à 99, par exemple, et que ma séquence n'à pas été incrémentée (qu'elle est toujours à 10, encore par exemple), c'est mettre ma séquence à cette valeur.
    Alors, pour ce faire, j'ai créer une petit procédure qui fonctionne sous cette forme:
    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
    CREATE OR REPLACE PROCEDURE pr_sequence (nom_sq IN VARCHAR2, nom_tb IN VARCHAR2, nom_pk IN VARCHAR2) AS
    	pk_max NUMBER(6);
    	sq_courante NUMBER(6);
    	ldd VARCHAR2(500);
    	utilisateur VARCHAR2(30):=USER;
    BEGIN
    	ldd:='DROP SEQUENCE '||nom_sq;
    	EXECUTE IMMEDIATE ldd;
    	EXECUTE IMMEDIATE 'DROP SEQUENCE sq_temporaire';
    	EXECUTE IMMEDIATE 'CREATE SEQUENCE sq_temporaire';
    	ldd:='SELECT MAX('||nom_pk||') FROM '||nom_tb;
    	EXECUTE IMMEDIATE ldd INTO pk_max;
    	LOOP
    		SELECT sq_temporaire.NEXTVAL INTO sq_courante FROM DUAL;
    		EXIT WHEN sq_courante=pk_max;
    	END LOOP;
    	/*ldd:='RENAME sq_temporaire TO '||nom_sq;
    	EXECUTE IMMEDIATE ldd;*/
    END;
    /
    Mais, lorsque j'enlève les paramètres de mes deux dernière lignes (qui servent à renommer ma séquence temporaire sous le nom de la séquence finale), j'obtiens l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-03113: fin de fichier sur canal de communication
    Alors là, je me tate... Ce que je me suis dit, c'est de tester:
    Lorsque je lance ma procédure sous cette forme là (renommage en paramètre, donc pas exécuté), la procédure fonctionne, ma séquence est correctement incrémentée, mais lorsque je veux la renommer, manuellement, même erreure ! Et je n'ai cette erreur uniquement si je lance ma procédure. Lorsque je me logue sur le serveur en sysdba, je peux renommer ma séquence, pas de problèmes, mais lorsque je lance ma procédure, impossible de la renommer...

    Quelqu'un aurrait une idée, parce que je sèche, là...

    Merci d'avance!
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

  2. #2
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut
    Trouvé une autre solution: même pas besoin de passer par une séquence intermédiaire:
    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
    CREATE OR REPLACE PROCEDURE pr_sequence (nom_sq IN VARCHAR2, nom_tb IN VARCHAR2, nom_pk IN VARCHAR2) AS
    	pk_max NUMBER(6);
    	sq_courante NUMBER(6);
    	ldd VARCHAR2(500);
    	utilisateur VARCHAR2(30):=USER;
    BEGIN
    	ldd:='DROP SEQUENCE '||nom_sq;
    	EXECUTE IMMEDIATE ldd;
    	ldd:='CREATE SEQUENCE '||nom_sq;
    	EXECUTE IMMEDIATE ldd;
    	ldd:='SELECT MAX('||nom_pk||') FROM '||nom_tb;
    	EXECUTE IMMEDIATE ldd INTO pk_max;
    	LOOP
    		ldd:='SELECT '||nom_sq||'.NEXTVAL FROM DUAL';
    		EXECUTE IMMEDIATE ldd INTO sq_courante;
    		EXIT WHEN sq_courante=pk_max;
    	END LOOP;
    END;
    /
    Mais je me demande pourquoi j'avais cette erreure... Si quelqu'un à des infos, merci de me les communiquer!
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    j'comprends pas bien l'intérêt de la séquence là

  4. #4
    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
    Cerberes,


    Pourquoi ne fais tu pas un drop sequence pour la recréer avec la bonne valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SQL> create sequence seq_test start with 20;
     
    Sequence created.
     
    SQL> select seq_test.nextVal from dual;
     
       NEXTVAL
    ----------
            20

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  5. #5
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par lalystar
    Pourquoi ne fais tu pas un drop sequence pour la recréer avec la bonne valeur
    Je dois avouer que je n'y avais même pas pensé...

    Merci

    [EDIT] Procédure épurée (pour ceux que ça intéresse )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE PROCEDURE pr_sequence (nom_sq IN VARCHAR2, nom_tb IN VARCHAR2, nom_pk IN VARCHAR2) AS
    	pk_max NUMBER(6);
    	ldd VARCHAR2(500);
    BEGIN
    	ldd:='DROP SEQUENCE '||nom_sq;
    	EXECUTE IMMEDIATE ldd;
    	ldd:='SELECT MAX('||nom_pk||') FROM '||nom_tb;
    	EXECUTE IMMEDIATE ldd INTO pk_max;
    	ldd:='CREATE SEQUENCE '||nom_sq||' START WITH '||pk_max||' INCREMENT BY 1';
    	EXECUTE IMMEDIATE ldd;
    END;
    /
    Mais je me pose tout de même la question: Qu'est-ce qui peut générer cette erreur (fin de fichier sur canal de communication) ???
    [/EDIT]
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

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

Discussions similaires

  1. fin de fichier sur canal de communication
    Par olap_2001 dans le forum Administration
    Réponses: 4
    Dernier message: 16/08/2011, 19h25
  2. ORA-03113: fin de fichier sur canal de communication
    Par franet dans le forum Administration
    Réponses: 6
    Dernier message: 18/04/2011, 18h28
  3. Réponses: 1
    Dernier message: 17/07/2008, 17h31
  4. Réponses: 1
    Dernier message: 05/09/2007, 11h56
  5. ORA-03113: fin de fichier sur canal de communication
    Par damiano84 dans le forum Administration
    Réponses: 7
    Dernier message: 30/04/2007, 17h34

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