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

Paquete de pruebas SQL

Estas en el tema de Paquete de pruebas SQL en el foro de Oracle en Foros del Web. Hola, tengo un problema con un paquete de pruebas que he creado y no me termina de compilar porque me da este error. Error(4,11): PLS-00323: ...
  #1 (permalink)  
Antiguo 08/01/2014, 11:27
 
Fecha de Ingreso: noviembre-2012
Ubicación: Spain
Mensajes: 28
Antigüedad: 12 años, 1 mes
Puntos: 0
Paquete de pruebas SQL

Hola, tengo un problema con un paquete de pruebas que he creado y no me termina de compilar porque me da este error.

Error(4,11): PLS-00323: subprogram or cursor 'INSERTAR' is declared in a package specification and must be defined in the package body.

El codigo completo es este.
Código SQL:
Ver original
  1. /*prueba empleado*/
  2.  
  3. CREATE OR REPLACE
  4. PACKAGE pruebas_empleado AS
  5.  
  6. PROCEDURE inicializar;
  7. PROCEDURE insertar (prueba_insertar_empleado IN VARCHAR,
  8. wPuesto IN puestos.oid_pue%TYPE,
  9.   wNombre IN empleados.nombre%TYPE,
  10.   wApellidos IN empleados.apellidos%TYPE,
  11.   wSexo IN empleados.sexo%TYPE,
  12.   wNIF IN empleados.nif%TYPE,
  13.   wFNac IN empleados.fnac%TYPE,
  14.   wSalario IN empleados.salario%TYPE,
  15.   wFInicioContrato IN empleados.finiciocontrato%TYPE,
  16.   wFFinContrato IN empleados.ffincontrato%TYPE,
  17.   w_Cuota IN clientes.cuota%TYPE,
  18.   salidaEsperada IN BOOLEAN);
  19. PROCEDURE eliminar (prueba_eliminar_empleado IN VARCHAR,
  20. wPuesto IN puestos.oid_pue%TYPE,
  21.   wNombre IN empleados.nombre%TYPE,
  22.   wApellidos IN empleados.apellidos%TYPE,
  23.   wSexo IN empleados.sexo%TYPE,
  24.   wNIF IN empleados.nif%TYPE,
  25.   wFNac IN empleados.fnac%TYPE,
  26.   wSalario IN empleados.salario%TYPE,
  27.   wFInicioContrato IN empleados.finiciocontrato%TYPE,
  28.   wFFinContrato IN empleados.ffincontrato%TYPE,
  29.   salidaEsperada BOOLEAN);
  30. PROCEDURE actualizar (prueba_actualizar_empleado IN VARCHAR,
  31. wPuesto IN puestos.oid_pue%TYPE,
  32.   wNombre IN empleados.nombre%TYPE,
  33.   wApellidos IN empleados.apellidos%TYPE,
  34.   wSexo IN empleados.sexo%TYPE,
  35.   wNIF IN empleados.nif%TYPE,
  36.   wFNac IN empleados.fnac%TYPE,
  37.   wSalario IN empleados.salario%TYPE,
  38.   wFInicioContrato IN empleados.finiciocontrato%TYPE,
  39.   wFFinContrato IN empleados.ffincontrato%TYPE,
  40.   salidaEsperada BOOLEAN);
  41.  
  42. END pruebas_empleado;
  43.  
  44. /
  45.  
  46. ------- HASTA AQUI TODO SALE BIEN Y NO DA ERROR ----------
  47.  
  48. CREATE OR REPLACE
  49. PACKAGE BODY pruebas_empleado AS
  50.   /*inicializacion*/
  51.   PROCEDURE inicializar AS
  52.   BEGIN
  53.     DELETE FROM EMPLEADOS;
  54.   END inicializar;
  55.  
  56.   /*insertar*/
  57.   PROCEDURE insertar (
  58.   prueba_insertar_empleado VARCHAR,
  59.   wPuesto IN puestos.oid_pue%TYPE,
  60.   wNombre IN empleados.nombre%TYPE,
  61.   wApellidos IN empleados.apellidos%TYPE,
  62.   wSexo IN empleados.sexo%TYPE,
  63.   wNIF IN empleados.nif%TYPE,
  64.   wFNac IN empleados.fnac%TYPE,
  65.   wSalario IN empleados.salario%TYPE,
  66.   wFInicioContrato IN empleados.finiciocontrato%TYPE,
  67.   wFFinContrato IN empleados.ffincontrato%TYPE,
  68.   salidaEsperada BOOLEAN
  69.   ) IS
  70.     salida BOOLEAN := TRUE;
  71.     num PLS_INTEGER;
  72.   BEGIN
  73.     num := 0;
  74.     /*insertar empleado*/
  75.     CREAR_EMPLEADO(wPuesto,wNombre,wApellidos,wSexo,wNIF,wFNac,wSalario,wFInicioContrato);
  76.     /*seleccionar empleado para ver si se ha insertado correctamente*/
  77.  
  78.     SELECT COUNT(*) INTO num FROM EMPLEADOS WHERE NIF=wNIF;
  79.    
  80.     IF (num < 1) THEN
  81.     salida := FALSE;
  82.     END IF;
  83.     COMMIT WORK;
  84.    
  85.     DBMS_OUTPUT.put_line (prueba_insertar_empleado || ':' || ASSERT_EQUALS(salida, salidaEsperada));
  86.     EXCEPTION
  87.     WHEN OTHERS THEN
  88.     DBMS_OUTPUT.put_line(prueba_insertar_empleado || ':' || ASSERT_EQUALS(FALSE, salidaEsperada));
  89.     ROLLBACK;
  90.    
  91.   END insertar;
  92.  
  93.   /*actualizar*/
  94.   PROCEDURE actualizar ( prueba_actualizar_empleado VARCHAR,
  95. wPuesto IN puestos.oid_pue%TYPE,
  96.   wNombre IN empleados.nombre%TYPE,
  97.   wApellidos IN empleados.apellidos%TYPE,
  98.   wSexo IN empleados.sexo%TYPE,
  99.   wNIF IN empleados.nif%TYPE,
  100.   wFNac IN empleados.fnac%TYPE,
  101.   wSalario IN empleados.salario%TYPE,
  102.   wFInicioContrato IN empleados.finiciocontrato%TYPE,
  103.   wFFinContrato IN empleados.ffincontrato%TYPE,
  104.   salidaEsperada BOOLEAN) IS
  105.    
  106.     num PLS_INTEGER;
  107.     salida BOOLEAN := TRUE;
  108.     EMPLEADOS_row EMPLEADOS%ROWTYPE;
  109.    
  110.   BEGIN
  111.       num := 0;
  112.    
  113.     /*Actualizar cliente*/
  114.     UPDATE EMPLEADOS SET FFinContrato =  wFFinContrato WHERE NIF=wnif;
  115.     SELECT * INTO EMPLEADOS_row FROM EMPLEADOS WHERE NIF=wnif;
  116.     IF (EMPLEADOS_row.FFinContrato<> wFFinContrato) THEN
  117.     salida := FALSE;
  118.     END IF;
  119.     COMMIT WORK;
  120.    
  121.    
  122.     DBMS_OUTPUT.put_line(prueba_actualizar_empleado || ':' || ASSERT_EQUALS (salida, salidaEsperada));
  123.     EXCEPTION
  124.     WHEN OTHERS THEN
  125.     DBMS_OUTPUT.put_line(prueba_actualizar_empleado || ':' || ASSERT_EQUALS (FALSE, salidaEsperada));
  126.     ROLLBACK;
  127.    
  128.   END actualizar;
  129.  
  130.   /*eliminar*/
  131. PROCEDURE eliminar ( prueba_eliminar_empleado VARCHAR,
  132.   wPuesto IN puestos.oid_pue%TYPE,
  133.   wNombre IN empleados.nombre%TYPE,
  134.   wApellidos IN empleados.apellidos%TYPE,
  135.   wSexo IN empleados.sexo%TYPE,
  136.   wNIF IN empleados.nif%TYPE,
  137.   wFNac IN empleados.fnac%TYPE,
  138.   wSalario IN empleados.salario%TYPE,
  139.   wFInicioContrato IN empleados.finiciocontrato%TYPE,
  140.   wFFinContrato IN empleados.ffincontrato%TYPE,
  141.   salidaEsperada BOOLEAN) IS
  142.  
  143. salida BOOLEAN := FALSE;
  144. num PLS_INTEGER;
  145.  
  146. BEGIN
  147.   num := 0;
  148.   /*eliminar empleado*/
  149.   DELETE FROM EMPLEADOS WHERE  NIF=wNIF;
  150.  
  151. SELECT COUNT (*) INTO num FROM EMPLEADOS WHERE NIF=wNIF;
  152. IF (num < 1) THEN
  153. salida := FALSE;
  154. ELSE
  155. salida := TRUE;
  156. END IF;
  157. COMMIT WORK;
  158.  
  159. DBMS_OUTPUT.put_line (prueba_eliminar_empleado || ':' || ASSERT_EQUALS (salida, salidaEsperada));
  160. EXCEPTION
  161. WHEN OTHERS THEN
  162. DBMS_OUTPUT.put_line (prueba_eliminar_empleado || ':' || ASSERT_EQUALS (FALSE, salidaEsperada));
  163. ROLLBACK;
  164.  
  165. END eliminar;
  166. END;
  167. /
  168. /*funcion auxiliar ASSERT_EQUALS*/
  169. CREATE OR REPLACE
  170. FUNCTION ASSERT_EQUALS (salida BOOLEAN, salidaEsperada BOOLEAN) RETURN varchar2 AS
  171. BEGIN
  172. IF (salida=salidaEsperada) THEN
  173. RETURN 'exito';
  174. ELSE
  175. RETURN 'fallo';
  176. END IF;
  177. END ASSERT_EQUALS;
[/CODE]


Gracias de antemano y Feliz Año.

Última edición por gnzsoloyo; 08/01/2014 a las 11:48
  #2 (permalink)  
Antiguo 08/01/2014, 11:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Paquete de pruebas SQL

Cita:
Error(4,11): PLS-00323: subprogram or cursor 'INSERTAR' is declared in a package specification and must be defined in the package body.
¿Y cuál es la duda?
El mensaje es bien claro: Ese cursor tiene que ser declarado en el SPEC del package. Obviamente no lo estás haciendo .
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 08/01/2014, 12:32
 
Fecha de Ingreso: noviembre-2012
Ubicación: Spain
Mensajes: 28
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Paquete de pruebas SQL

Si pudieras solucionarmelo sobre el codigo, me solucionarias el problema. Si me dices eso, yo tambien se inglés y se lo que pone.
  #4 (permalink)  
Antiguo 08/01/2014, 13:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Paquete de pruebas SQL

¿Y cuál es la duda?
Pon la definición de ese cursor antes de las que corresponden a los SP y las SF y listo.
No es mucho más que eso.

Vamos a lo central: Todo objeto de uso global en el package, y todos los objetos que serán accedidos en forma pública en un package deben estar en la especificación.
En el caso de un CURSOR es un TYPE que declaras, que luego usas al momento de instanciarlo en el SP o SF donde lo requieras.

¿Qué duda te presenta? ¿Nunca declaraste TYPEs en un package?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 09/01/2014, 04:38
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Paquete de pruebas SQL

gnzsoloyo.

El problema ( aparte de la mala educación de Khans, que parece exigir que se lo soluciones sobre el codigo en lugar de aceptar ideas para que lo solucione el ) así a bote pronto me dá que es porque los parametros de ese procedure definidos en la especificación no coinciden con los que hay en el body.


Dale un pez a un hombre y comerá un dia, enseñale a pescar y comerá toda su vida.

Proverbio chino.
  #6 (permalink)  
Antiguo 09/01/2014, 06:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Paquete de pruebas SQL

Gracias por la nota.
La verdad, no me puse a hilar tan fino. No me voy a poner a analizar todo ese código por simples ganas (ya tengo bastante con los desastres que me hace la software factory para la empresa). Y menos aún con un mensaje de error tan evidente.
Yo lo sugeriría a @KhanS que antes que nada ordene un poco esa cosa, y se ponga a deprurar con cuidado. A fin de cuentas, el analizador sintáctico que tiene el propio Oracle Express alcanza para limpiar el package de basura.
Con un poco de esfuerzo propio debería poder lograrlo sin complicaciones.
Máxime, como dije, cuando el mensaje de error es tan claro.

VEremos que dice (espero que con mejor onda).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: cursor, funcion, paquete, pruebas, sql
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




La zona horaria es GMT -6. Ahora son las 07:44.