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 Oracle Discussion :

utilisation séquence dans update


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut utilisation séquence dans update
    Bonjour,

    Comment faire pour utiliser un numéro de séquence directement (currval) dans un update sans passer par une variable intermédiaire (et donc sans écrire de pl/sql).
    D'après la doc oracle c'est impossible. Connaissez-vous un astuce?

    Merci

  2. #2
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour,

    Quelle est ta version oracle ?

    de quelle doc oracle s'agit -il ?

    parce qu'on peut bien faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update  table1 set column1=ma_sequence.currval

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Par défaut
    tu peux n'utiliser ke du code sql avec les sequence.
    ces dexu requetes sont tout a fait tolerées en langage sql
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update toto set col1= seq_test.nextval;
    ou
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update toto set col1= seq_test.currval;

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Sauf que pour obtenir le currval il faut avoir appeler nextval avant :

    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
    SQL> select s.currval from dual;
    select s.currval from dual
           *
    ERREUR Ó la ligne 1 :
    ORA-08002: sÚquence S.CURRVAL pas encore dÚfinie dans cette session
     
     
    SQL> select s.nextval from dual;
     
       NEXTVAL
    ----------
             2
     
    SQL> select s.currval from dual;
     
       CURRVAL
    ----------
             2

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 117
    Par défaut
    Bonjour,

    J'utilise oracle enterprise 9.2.0.7. le message d'erreur est:
    "ORA-02287: sequence number not allowed here"
    quand j'execute le requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update table
    set col1 = seq1.curval
    where col2 = seq2.curval
    La référence de la doc est
    Oracle® Database SQL Reference
    10g Release 2 (10.2)
    Part Number B14200-02

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Restrictions on Sequence Values You cannot use CURRVAL and NEXTVAL in the following constructs:
        * A subquery in a DELETE, SELECT, or UPDATE statement
        * A query of a view or of a materialized view
        * A SELECT statement with the DISTINCT operator
        * A SELECT statement with a GROUP BY clause or ORDER BY clause
        * A SELECT statement that is combined with another SELECT statement with the UNION, INTERSECT, or MINUS set operator
        * The WHERE clause of a SELECT statement
        * The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement
        * The condition of a CHECK constraint

  6. #6
    Scorpi0
    Invité(e)
    Par défaut
    Peut être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE TABLE
    SET col1 = seq1.curval
    WHERE col2 = (select last_number - 1 from ALL_SEQUENCES where sequence_name = 'seq2')
    Edit : ne marche que si le CACHE est à 1 ou 0 (CREATE SEQUENCE MYSEQ NOCACHE), alors le last_number correspond à CURRVAL + 1. Mais bon, c'est un peu barbare de faire ça. En même temps on ne devrait jamais avoir à faire ta requête, sinon ça doit être un problème de conception...

    Quelques infos par ici : http://www.dbforums.com/oracle/10082...st_number.html
    Dernière modification par Scorpi0 ; 27/01/2009 à 16h11.

Discussions similaires

  1. Utilisation de "sql UPDATE SET" dans VB6 avec ADO
    Par hermanoah dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 26/04/2014, 18h59
  2. Utiliser Inserted ou Updated dans un Trigger
    Par olibara dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/11/2012, 11h37
  3. Utiliser WITH dans un INSERT / UPDATE
    Par GoLDoZ dans le forum SQL
    Réponses: 5
    Dernier message: 24/02/2011, 10h38
  4. Réponses: 1
    Dernier message: 28/04/2004, 19h18
  5. [CR][VB6] comment utiliser CR dans VB ?
    Par kouassi_denis dans le forum SDK
    Réponses: 2
    Dernier message: 26/01/2004, 16h20

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