Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: .:UND3R:. en 25 Noviembre 2015, 21:12 pm



Título: Problema ORACLE procedimiento
Publicado por: .:UND3R:. en 25 Noviembre 2015, 21:12 pm
Hola a todos, tengo el siguiente procedimiento:

Código
  1. CREATE OR REPLACE PROCEDURE ordenarFicha
  2. IS
  3.  -- Declaracion de variables locales
  4.  CURSOR cur_ficha IS SELECT * FROM ficha;
  5.  reg_ficha ficha%ROWTYPE;
  6.  var_anio_actual NUMBER(4);
  7.  var_anio_ficha NUMBER(4);
  8.  var_diferencia_anio NUMBER(4);
  9. BEGIN
  10.  -- Sentencias
  11.  var_anio_actual := EXTRACT(YEAR FROM SYSDATE);
  12.  
  13.  OPEN cur_ficha;
  14.  
  15.  LOOP
  16. FETCH cur_ficha INTO reg_ficha;
  17. EXIT WHEN cur_ficha%NOTFOUND;
  18. var_anio_ficha := EXTRACT(YEAR FROM reg_ficha.fecha);
  19.    var_diferencia_anio := (var_anio_actual - var_anio_ficha);
  20.  
  21.    IF var_diferencia_anio > 5 THEN
  22.      EXECUTE IMMEDIATE 'CREATE TABLE FICHA_' || TO_CHAR(var_anio_ficha) || '(ID_FICHA int primary key, NOMBRE VARCHAR2(60 BYTE), APELLID VARCHAR2(60 BYTE), FECHA DATE)';
  23.    END IF;
  24.    DBMS_OUTPUT.PUT_LINE(reg_ficha.nombre);
  25. END LOOP;
  26.  
  27.  CLOSE cur_ficha;
  28.  
  29. EXCEPTION
  30.    WHEN OTHERS THEN
  31.      IF SQLCODE = -955 THEN
  32.        NULL; -- suprime la excepción ORA-00955
  33.      ELSE
  34.         RAISE;
  35.      END IF;
  36. END ordenarFicha;

El problema que me surge es que al ejecutar este, no selecciona todas las filas (SELECT *) de la tabla ficha, pero cuando comento EXECUTE INMEDIATE, si selecciona todo, me baso en la salida de DBMS_OUTPUT.PUT_LINE(reg_ficha.nombre);

espero que alguien me pueda ayudar, saludos.


Título: Re: Problema ORACLE procedimiento
Publicado por: Carloswaldo en 26 Noviembre 2015, 20:04 pm
Es solo una idea, pero según el contenido de la tabla ficha ¿no estarías ejecutando varias veces CREATE TABLEs idéndicos?

No creo que solo haya un registro por año en la tabla ficha, si hay por ejemplo 2 registros que sean del 2009 estarías ejecutando CREATE TABLE FICHA_2009 dos veces, y la 2da fallará.

No estoy seguro en ORACLE pero deberías poder hacer un CREATE TABLE IF NOT EXISTS como un workaround para esto, pero la solución verdadera estaría en replantearse cómo haces lo que intentas hacer.