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
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
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
tu peux n'utiliser ke du code sql avec les sequence.
ces dexu requetes sont tout a fait tolerées en langage sql
ou
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 update toto set col1= seq_test.nextval;
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 update toto set col1= seq_test.currval;
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
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:
La référence de la doc est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 update table set col1 = seq1.curval where col2 = seq2.curval
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
Peut être comme ça :
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...
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')
Quelques infos par ici : http://www.dbforums.com/oracle/10082...st_number.html
Dernière modification par Scorpi0 ; 27/01/2009 à 16h11.
Partager