Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Cursor Pl/sql

Estas en el tema de Cursor Pl/sql en el foro de Oracle en Foros del Web. Hola a todos, Quiero realizar un cursor que me haga lo siguiente: - Tiene que recoger todos los hijos que tenga un padre y el ...
  #1 (permalink)  
Antiguo 17/06/2008, 10:06
 
Fecha de Ingreso: mayo-2008
Mensajes: 10
Antigüedad: 15 años, 10 meses
Puntos: 0
Cursor Pl/sql

Hola a todos,

Quiero realizar un cursor que me haga lo siguiente:

- Tiene que recoger todos los hijos que tenga un padre y el parametro que se le pasa es el padre. Y despues ha de borrar todos los hijos por cada padre.

¿Alguien puede iluminarme?

Yo estaba intentando algo del estilo:

DECLARE
CURSOR ejemplo IS
SELECT hijos
FROM tabla
WHERE padre = '&1';

BEGIN
FOR regejemplo IN ejemplo
LOOP
XXXXXXXXXXXXXX
END LOOP;
END;

Y en XXXXXXXXXXXXXX no me aclaro con lo que tendría que poner. La tabla esta particionada por hijos.

Espero que me podáis ayudar, muchas gracias!!!!!!!!!!
  #2 (permalink)  
Antiguo 17/06/2008, 10:18
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Cursor Pl/sql

Hola,

Nunca hagas con un cursor lo que puedes hacer con una consulta SQL directa.

Código:
delete from hijos where idpadre = valor;
Saludos
  #3 (permalink)  
Antiguo 18/06/2008, 01:23
 
Fecha de Ingreso: mayo-2008
Mensajes: 10
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Cursor Pl/sql

Hola Matanga,

Gracias por contestar, pero hijos no es una tabla si no que es un campo, al igual que padre, de la tabla tabla.
  #4 (permalink)  
Antiguo 18/06/2008, 04:06
 
Fecha de Ingreso: mayo-2008
Mensajes: 10
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Cursor Pl/sql

Ahora mismo, mi cursor esta así:
DECLARE
CURSOR ejemplo IS
SELECT a
FROM txs
WHERE b = '&1';
ejemplo_rec ejemplo%ROWTYPE;
BEGIN
FOR ejemplo_rec IN ejemplo
LOOP
DELETE TXS WHERE a = ejemplo_rec.a;
END LOOP;
END;

Y realmente me hace lo que quiero, pero prefiero que en vez de realizar un delete se haga un truncate a la partición correspondiente. el nombre de la partición es txs_PXX, donde XX es el campo a. Es decir, la tabla esta particionada por el campo a y tiene valores 1, 20, 118... y las particiones son txs_P1, txs_P20, txs_P118...

Había pensado en hacer algo del estilo: ALTER TABLE txs TRUNCATE PARTITION txs_P||ejemplo_rec.a;

Pero esto anterior no me funciona, me devuelve error PLS-00103.

¿Alguna idea de como podría hacerlo para que me truncara por partición?

Muchas gracias.
  #5 (permalink)  
Antiguo 18/06/2008, 06:12
 
Fecha de Ingreso: junio-2008
Mensajes: 5
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Cursor Pl/sql

Hola,
otra opcion es con sql dinámico:

Algo así:
vdelete := 'delete from txs_PARTICION WHERE a = ejemplo_rec.a';
vdelete := replace (vdelete , PARTICION , vparticion);
EXECUTE IMMEDIATE (vdelete);

donde vparticion tendrá el valor que quieras P20 etc.


Espero que te sirva.

un saludo
  #6 (permalink)  
Antiguo 18/06/2008, 09:18
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Cursor Pl/sql

Hola ccalvofer,

Un par de comentarios

1. Para poder ejecutar sentencias DDL dentro de un bloque PL/SQL ha de ser con SQL Dinámico, por ejemplo

Código:
execute immediate 'alter table t1 add (data varchar2(38))';
2. Un particion se trunca entera y se hace referencia a su nombre, por ejemplo, si tengo la tabla t1 con las particiones p1, p2, p3 y p4, entonces el comando es

Código:
alter table t1 truncate partition p3;
Donde el nombre de la particion se define al momento de crear la tabla o bien con un alter table.

Como ultimo comentario, y a modo de consejo, no necesitas hacer un cursor para borrar los datos de la tabla.

Saludos
  #7 (permalink)  
Antiguo 19/06/2008, 00:21
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Cursor Pl/sql

Matanga, eres un crack.
Con cada aporte que haces, suelo aprender algo mas.
Saludos from Madrid
  #8 (permalink)  
Antiguo 20/06/2008, 08:51
 
Fecha de Ingreso: mayo-2008
Mensajes: 10
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Cursor Pl/sql

Hola Matanga,
Muchas gracias por tu ayuda, pero ya encontre la solución.
Además, si que necesito realizar un cursor porque el script que lo recoge recibe un parametro "A" y necesito hacerlo así para realizar el truncate a la partición de cada uno de los hijos que tiene "A".
Si fuera truncar directamente la partición del parametro "A" esta claro que no necesito realizar ningún cursor.
Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 14:35.