Hola azukita,
se me hace algo extraño que realmente se necesite hacer algo así (¿por qué no una campo para la secuencia y otro para el año aunque la secuencia de cada año no empiece por 1?), pero bueno, se me ha ocurrido esta manera:
- Para la secuencia de cada año tendrás un máximo en mente, supongo, de n cifras (supongamos que son 6, así podremos tener casi un millón), que en ningún caso se va a alcanzar. Entonces creas para empezar una secuencia que empiece por 2008000001:
Código:
CREATE SEQUENCE SEQ_PRUEBA START WITH 2008000001 INCREMENT BY 1;
- Por otra parte creas esta función, que será a la que vas a llamar siempre que quieras obtener un valor de la secuencia:
Código:
CREATE OR REPLACE FUNCTION FN_NEXTVAL RETURN NUMBER
IS
v_num_sec NUMBER;
v_primera NUMBER;
BEGIN
SELECT SEQ_PRUEBA.NEXTVAL INTO v_num_sec FROM DUAL;
IF(SUBSTR(TO_CHAR(v_num_sec),1,4) <> TO_CHAR(SYSDATE,'YYYY')) THEN
v_primera := TO_NUMBER(TO_CHAR(SYSDATE,'YYYY')) * POWER(10,LENGTH(v_num_sec)-4) + 1;
WHILE(v_num_sec < v_primera)
LOOP
SELECT SEQ_PRUEBA.NEXTVAL INTO v_num_sec FROM DUAL;
END LOOP;
END IF;
RETURN v_num_sec;
END FN_NEXTVAL;
/
De esta manera vas a obtener el número de secuencia adecuado en cada momento, sabiendo que los 4 primeros dígitos son el año y el resto son la secuencia para cada año.
Y si estás trabajando con Oracle 11g recuerda que no hace falta hacer una select para obtener el siguiente número de secuencia, basta con escribir 'variable := seq.NEXTVAL;'.
Un saludo.