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

Sql*Plus Oracle Discussion :

alter sequence increment by (select..) nombre non valid!?


Sujet :

Sql*Plus Oracle

  1. #1
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut alter sequence increment by (select..) nombre non valid!?
    salut ,

    voila j'ai créé une séquence démarrant avec 1 tout ce qui ya de plus basique.
    mais , comme je voudrais que la séquence se réinitialise (genre reset séquence)
    j'ai sus qu'il fallait utiliser la clause InCrement by -(la valeur courante) pour avoir le nextval a 1(puis remettre increment by 1).
    mais , quand c'est pour réinitialiser suite a un contrôle .
    je doit rendre le dynamique.

    genre même si je ne connais pas la valeur courante .
    et après quelque essais , je patine au niveau syntaxe j'arrive pas a valider la valeur courante en tant que nombre d'incrementation.

    exemple (grossier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter seqeunce seqtest increment by -(select seqtest.currval from dual)
    alors pourriez vous m'orienter justement sur une façon qui me permettrait de faire ça ENCORE MERCI

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    pourquoi ne pas simplement effacer et recréer la séquence?

  3. #3
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut euh..
    ben,
    ce code doit etre implementé sur forms ?a vrais dire.

    il participe a un code articulé ("mmyy"-seqtest).

    donc dans mon apli je doit verifier tout le temp quel moi en est et au changement du moi la sequence se reinitialise .

    mais si , je doit recreer la sequence chaque mois , je devrais le faire depuis sqplus alors , pas depuis forms remarque !

    est ce que recreer ca ne consome pas plus de temp que de reinitialiser ?
    merci de m'eclairer

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    je ne vois pas l'avantage de faire alter plutôt que drop/create...

    Forms permets le "alter" et pas le "create"? bizarre...

  5. #5
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut hihi
    ben ,
    non j'ai pas dit ça (du tout) .forms permet peut être de faire des ddl avec la clause form_ddl(..);
    mais , selon toi (vous) , recréer vaut autant que l'alter ,ou?.
    je voulais juste savoir, si ça ne coûtais pas plus de temps l'exécution(que d'alterer).

    ROGGER

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    La différence doit être minime. Cela ne doit donc pas être un critère.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    perso je trouve le drop/create plus simple, à toi de voir

  8. #8
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut
    donc ,
    elle sera drop créer chaque mois !
    entre autre , pourriez vous m'orienter syntaxiquement.
    je vais donc comparer (a l'aid d'un triger)sous forms chaque ouverture .
    le mois actuel et celui du code articulé .
    en gros :
    if (to_char(sysdate,'mm')<>T) --T est un parametre ou est stocké la précédente valeur (a l'ouverture) de sysdate
    then ""clause ddl ('drop sequence seq_test ; create sequence seqtest;')
    else T:=to_char(sysdate,'mm')
    Au faite create or replace est il faisable sur les séquences!?

    En prime , je voudrais savoir quand on a une séquence sur une colonne !
    si ça serait possible de mettre un trigger de base de donnée

    INSTEAD OF INSERT pour faire qu'a chaque insertion l'identifiant s'insère depuis la séquence !
    si c'est pas le cas conseilliez moi!

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    je ne connais pas la syntaxe forms, mais dans plsql, tu fais qqchose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate 'drop sequence s'; execute immediate 'create sequence s';

    quant au trigger, c'est possible, mais ce n'est pas un INSTEAD OF trigger. Les instead of, c'est sur des vues.

    http://oracle.developpez.com/faq/?pa...#autoincrement

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    si tu as une version récente tu peux aussi faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BEGIN
       :NEW.macolonne_PK := MaSequence.NEXTVAL
    END;
    /
    à l'avenir, merci de préciser ta version

  11. #11
    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
    plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BEGIN
       SELECT MaSequence.NEXTVAL INTO :NEW.macolonne_PK  
         FROM DUAL;
    END;
    /

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    une version récente = 11g

    http://download.oracle.com/docs/cd/B...c.htm#BABDDFGI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      seq_value := employees_seq.NEXTVAL;

  13. #13
    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'aurais dû deviner

  14. #14
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut euh ..?
    Premièrement,
    je tient a m'excuser pour la version (c'est vrai ).
    c'est la version 9.2 i (et 10g pour le developper).
    donc pas une version récente (10g )
    si je comprend bien pour la premiere question : je fait

    la commande exécute imediate dans ma clause ddl "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate 'drop sequence s'; execute immediate 'create sequence s';"
    je vais aussi donner ce privilège (execute)!

    et pour la séquence simple :je fait comme fred:
    CREATE SEQUENCE MaSequence
    CREATE TRIGGER MonTrigger
    BEFORE INSERT
    ON MaTable
    FOR EACH ROW
    BEGIN
    SELECT MaSequence.NEXTVAL
    INTO :NEW.macolonne_PK
    FROM DUAL;
    END;
    /
    au faite la 2eme question c'est pour une séquence qui se réinitialise pas .
    si cetait le cas au moment du "drop seqtest" , le trigger ne péterait pas par hasard !

  15. #15
    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
    non, soit tu recrées soit tu incrémentes de nextval après avoir changer le pas d'incrément comme ça :

    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
    CREATE PROCEDURE reinit_Masequence
    ln$nextval number;
    BEGIN
    SELECT MaSequence.NEXTVAL
    INTO ln$nextval 
    FROM DUAL;
     
    execute immediate 'alter sequence Masequence increment by -' || ln$nextval ;
     
    SELECT MaSequence.NEXTVAL
    INTO ln$nextval 
    FROM DUAL;
     
    execute immediate 'alter sequence Masequence increment by 1'
     
    END;
    /

  16. #16
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    c'est une bonne remarque, mais il pêterait aussi avec alter (en tout cas dans vos versions préhistoriques...)

    en fait, il est invalidé, mais au prochaine insert il sera recompilé.

    pour que ça soit plus propre, tu peux ajouter après drop sequence / create sequence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER TRIGGER tontrigger COMPILE;

  17. #17
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    SQL> create table t (x number,y number);
     
    Table created.
     
    SQL> create sequence s;
     
    Sequence created.
     
    SQL> create or replace trigger tr before insert on t for each row
      2  begin select s.nextval into :new.x from dual; end;
      3  /
     
    Trigger created.
     
    SQL> insert into t(y) values (1);
     
    1 row created.
     
    SQL> select * from t;
     
             X          Y
    ---------- ----------
             1          1
     
    SQL> drop sequence s;
     
    Sequence dropped.
     
    SQL> create sequence s;
     
    Sequence created.
     
    SQL> select status from user_objects where object_name='TR';
     
    STATUS
    -------
    INVALID
     
    SQL> insert into t(y) values (2);
     
    1 row created.
     
    SQL> select * from t;
     
             X          Y
    ---------- ----------
             1          1
             1          2
     
    SQL> select status from user_objects where object_name='TR';
     
    STATUS
    -------
    VALID
     
    SQL> commit;
     
    Commit complete.

  18. #18
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut
    donc ,
    j'ai l'embarras du choix , et franchement vous êtes top gentils (merci pour le code , qui plus est a été exécute).
    J'utilise seulement l'un des codes sis dessus(soit drop soit alter).



    PS:j'ai mon script de création de base de donnés(ma base)!
    Et comme je suis presque seul a continuer mon projet(ni prof ni binôme ) .


    serait ce possible de le joindre dans ce topic ,ou un autre :

    pour me conseiller sur les type ou format de données des identifiant
    (a qui mettre une séquence ?etc..)
    (doc et conception dispo bien sure !au cas ou!) "codification".

    parce que pour l'instant j'ai mis des (number,varchar) un peut partout
    Fichiers attachés Fichiers attachés

  19. #19
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut :)?
    bonjour ,
    merci pour vos code ca marche impec , j'ai finalement choisit l'alter au lieu du drop (a tester sur forms) qui marche sur sqlplus*.
    mais , comme mon apetit grandit :

    j'ai donc une question:
    supposons que j'ai des client de concessionnaire repartie sur 3service(vente,pièce détache , SAV).

    serait il possible (j'ai essayé en vain).de mettre un trigger
    BEFOR INSERT qui rajoutera un caractère
    if la colonne service =vente then
    insert into :new.num_cli 'V'||seq_cli.nextval from dual
    if la colonne =piece then insert into ..'P'||seq_cli.nextval
    etc...
    A Vous les gars !
    Merci molto molto

  20. #20
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut
    salut ,
    sauf , si j'abondone
    ALORS PAS D'idée sur la question .
    Même pas une
    allez !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. ORA-01722: Nombre non valide + sqlloader
    Par damiano84 dans le forum SQL*Loader
    Réponses: 9
    Dernier message: 20/05/2022, 20h09
  2. ORA-01722: Nombre non valide
    Par misa dans le forum Oracle
    Réponses: 4
    Dernier message: 18/12/2007, 15h23
  3. Oracle - Nombre non valide
    Par pado_83 dans le forum JDBC
    Réponses: 2
    Dernier message: 28/09/2006, 15h11
  4. [SQLLDR]ORA-01722: Nombre non valide
    Par syl2095 dans le forum Oracle
    Réponses: 5
    Dernier message: 22/05/2006, 15h42
  5. Réponses: 7
    Dernier message: 07/03/2006, 09h34

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