Pregunta SQL Oracle (Secuencias)

  • Iniciador del tema Iniciador del tema Txema5
  • Fecha de inicio Fecha de inicio

Txema5

Miembro
10.788 mensajesdesde 2002
5 agradecimientos
Necesitaria saber a traves de alguna query en Oracle, como teniendo unos registros cuyo campo clave es una secuencia, averigue si existe algún hueco en la secuencia para así aprovecharlo y no crear un código nuevo en la secuencia.

Venga, que sé que por aquí hay gente que tiene mano con el Sql :hola



Un abrazo!
 
Buenas, Txema, investigando un poco, me he encontrado una buena respuesta, donde no recomiendan hacer lo que tú comentas, pero de todas maneras, aquí te adjunto tanto el enlace (en inglés) como la select:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3225867788098

--Selects interesantes

--X es tu columna que hace de PK

--Select que saca todos los huecos
select x+1
from t
where NOT EXISTS ( select null
from t t2
where t2.x = t.x+1 )

--Select que saca sólo uno, y lo bloquea
select x+1
from t
where NOT EXISTS ( select null
from t t2
where t2.x = t.x+1 )
and rownum = 1
for update

Un saludo
 
Iba a responderte pero veo que Tofolinos lo ha hecho perfectamente. La única duda de la subquery es el NULL. ¿Seguro que así funciona y no lo toma como que no existe?

Yo lo haría así, que es casi igual:

--Select que saca todos los huecos
select x+1
from t
where NOT EXISTS ( select 1
from t t2
where t2.x = t.x+1 )
 
Acabo de encontrar un error en la Select. ¿Que pasa si hay un hueco de más de una posición? No funcionaría.

Ahora lo pienso y lo posteo.

De todos modos, ¿para qué quieres hacer eso, Chemita? No tiene utilidad y no es recomendable.
 
Última edición:
¿Te vale una función? Te la hago de memoria, espero que no la cague. :sudor

FUNCTION CHEMITA RETURN NUMBER IS

CURSOR C IS
SELECT X + 1
FROM T T1
WHERE NOT EXISTS (SELECT 1 FROM T T2 WHERE T2.X = T1.X + 1);

N NUMBER;

BEGIN

OPEN C;
FETCH C INTO N;
CLOSE C;

RETURN N;

EXCEPTION
WHEN OTHERS THEN RAISE;

END CHEMITA;

Esto te devolverá la primera ocurrencia vacía. La ocupas y si la llamas otras vez te dará el suguiente.

Si tú eres el único que lanzas el script no debes tener problemas de concurrencia o bloqueos.

¿Te vale? :|
 
Muy agradecido a ambos por la gran ayuda. Soys geniales. Me habeis dado muy buenas ideas y procuraré hoy mismo ponerlas en práctica.

Os debo una. Cualquier cosa que este en mi mano, no dudeis en pedirmelo.


Un abrazo!
 
De nada, guapetón. ;)

Llevo trabajando, a mi pesar, en el mundo Oracle desde hace ya 6 años. No dudes en preguntar lo que sea.

Cualquier cosa que este en mi mano, no dudeis en pedirmelo.
Esa cabeza de "Yo, Robot"....... :disimulo:lol
 
De nada, hombre, a mandar. ;)

macasfaj, ya somos dos, yo también llevo sobre 6 años con esto de Oracle, por suerte, ahora estoy empezando a toquetear algo de java, a ver si cambio un poco de tercio!
La web en la que estaba una de las soluciones, la verdad es que siempre me ha servido muy útil, tiene muy buenas ideas y el tal Tom es un gurú de Oracle de lo mejorcito, incluso alguna vez me ha contestado preguntas directamente, y encima dando en el clavo..

La web es esta:
http://asktom.oracle.com/

saludillos oraclienses!
 
Yo también tengo que ir pasando a Java, a ver.

Me apunto esa Web, no la conocía. Gracias. :)
 
Atrás
Arriba