Muy buenas, no se si éste es el mejor sitio para hacer preguntas acerca de programación, pero como he visto varias y nadie se queja, voy para allá.
Os cuento, mi idea es hacer un procedimiento almacenado, que mediante un cursor, seleccione información de distintas tablas, y meta los datos obtenidos en otra tabla, mediante un insert.
La tabla destino se compone de 11 campos obtenidos de éste modo, más uno que se obtiene de una secuencia. Os dejo lo que he hecho para intentar solucionarlo:
------ Procedimiento para generar recibos de cada alumno matriculados end cada servicio
CREATE OR REPLACE PROCEDURE Pr_Genera_Recibos
IS
v_Alumno_id Recibos_vigentes.ALUMNO_ID%TYPE;
v_Alumno_nom Recibos_vigentes.ALUMNO_NOM%TYPE;
v_Alumno_ape Recibos_vigentes.ALUMNO_APE%TYPE;
v_Tutor_id Recibos_vigentes.TUTOR_ID%TYPE;
v_Tutor_nom Recibos_vigentes.TUTOR_NOM%TYPE;
v_Tutor_ape Recibos_vigentes.TUTOR_APE%TYPE;
v_Serv_id Recibos_vigentes.SERV_ID%TYPE;
v_Serv_nom Recibos_vigentes.SERV_NOM%TYPE;
v_Serv_Coste Recibos_vigentes.SERV_COSTE%TYPE;
v_Nro_banco Recibos_vigentes.NRO_BANCO%TYPE;
v_Nro_cuenta Recibos_vigentes.NRO_CUENTA%TYPE;
-- Cursor que selecciona los datos del recibo de todos los campos necesarios para la tabla de recibo. Con los INNER JOIN nos aseguramos de que solo recoja una ocurrencia para cada registro de la tabla Alumno_Servicio_Cuenta
CURSOR c_Matriculas IS
SELECT a.Alumno_id, a.nombre, a.Apellidos, t.Tutor_id, t.Nombre, t.apellidos, s.Servicio_id, s.Nombre, s.Precio_mes, a_s_c.Nro_banco, a_s_c.Nro_cuenta
FROM Alumno_Servicio_Cuenta a_s_c INNER JOIN Alumno a ON a_s_c.Alumno_id = a.Alumno_id INNER JOIN Tutor t ON a.Tutor_id = t.Tutor_id INNER JOIN Servicio s ON a_s_c.Servicio_id = s.Servicio_id;
BEGIN
DBMS_OUTPUT.PUT_LINE("Generando recibos...");
DBMS_OUTPUT.PUT_LINE("");
OPEN c_Matriculas;
FETCH c_Matriculas INTO v_Alumno_id, v_Alumno_nom, v_Alumno_ape, v_Tutor_id, v_Tutor_nom, v_Tutor_ape, v_Serv_id, v_Serv_nom, v_Serv_Coste, v_Nro_banco, v_Nro_cuenta;
LOOP
INSERT INTO Recibos_vigentes(Recibo_id, Alumno_id, Alumno_nom, Alumno_ape, Tutor_id, Tutor_nom, Tutor_ape, Serv_id, Serv_nom, Serv_Coste, Nro_banco, Nro_cuenta)
VALUES(Id_Recibo.NEXTVAL, v_Alumno_id, v_Alumno_nom, v_Alumno_ape, v_Tutor_id, v_Tutor_nom, v_Tutor_ape, v_Serv_id, v_Serv_nom, v_Serv_Coste, v_Nro_banco, v_Nro_cuenta);
FETCH c_Matriculas INTO v_Alumno_id, v_Alumno_nom, v_Alumno_ape, v_Tutor_id, v_Tutor_nom, v_Tutor_ape, v_Serv_id, v_Serv_nom, v_Serv_Coste, v_Nro_banco, v_Nro_cuenta;
EXIT WHEN c_Matriculas%NOTFOUND;
END LOOP;
CLOSE c_Matriculas;
DBMS_OUTPUT.PUT_LINE("Recibos generados");
END;
/
Ejecuto el procedimiento él solo (con todos los demás elementos generados de antemano), y me tira el siguiente error.
00:22:27.437 DBMS GLOBAL -- Error: ORA-00604: error producido a nivel 1 de SQL recursivo
00:22:27.484 DBMS GLOBAL -- ORA-01400: no se puede realizar una inserción NULL en ("SYS"."OBJ$"."NAME"), Batch 1 Line 1 Col 1
la SELECT que usa el cursor funciona a la perfección, y al ver que decía "no se puede realizar una inserción blablabla..." he probado a comentar la sentencia INSERT completa, pero sigo obteniendo exactamente el mismo error, y tampoco se trata de un error provocado por confundirme de nombres de tablas o algo así, porque entonces no tiraría esos errores tan raros.
Además, como podéis ver, me lo suelta en la línea 1 columna 1, así que ando sin siquiera un indicio de por dónde van los tiros. Alguien tiene idea de dónde puede andar el problema?
EDITO: Parece que el ORA-01400 se produce al intetnar insertar un nulo en un campo que no los admite, pero sigue dandolo al comentar el INSERT, además... ¿Qué tabla es "SYS"."OBJ$"."NAME"?