Hola a todos, tengo el siguiente procedimiento:
create or replace PROCEDURE ordenarFicha
IS
-- Declaracion de variables locales
CURSOR cur_ficha IS SELECT * FROM ficha;
reg_ficha ficha%ROWTYPE;
var_anio_actual NUMBER(4);
var_anio_ficha NUMBER(4);
var_diferencia_anio NUMBER(4);
BEGIN
-- Sentencias
var_anio_actual := EXTRACT(YEAR FROM SYSDATE);
OPEN cur_ficha;
LOOP
FETCH cur_ficha INTO reg_ficha;
EXIT WHEN cur_ficha%NOTFOUND;
var_anio_ficha := EXTRACT(YEAR FROM reg_ficha.fecha);
var_diferencia_anio := (var_anio_actual - var_anio_ficha);
IF var_diferencia_anio > 5 THEN
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)';
END IF;
DBMS_OUTPUT.PUT_LINE(reg_ficha.nombre);
END LOOP;
CLOSE cur_ficha;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -955 THEN
NULL; -- suprime la excepción ORA-00955
ELSE
RAISE;
END IF;
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.
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.