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

[SOLUCIONADO] Problema con un Procedure

Estas en el tema de Problema con un Procedure en el foro de Oracle en Foros del Web. Buenas a todo el mundo. Estoy haciendo un trabajillo y me encuentro con el siguiente problema: tengo estas dos tablas: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver ...
  #1 (permalink)  
Antiguo 19/06/2015, 05:43
Avatar de blueMuffin010  
Fecha de Ingreso: mayo-2015
Ubicación: Sevilla
Mensajes: 19
Antigüedad: 9 años, 6 meses
Puntos: 0
Pregunta Problema con un Procedure

Buenas a todo el mundo. Estoy haciendo un trabajillo y me encuentro con el siguiente problema:

tengo estas dos tablas:
Código SQL:
Ver original
  1. DROP TABLE TRABAJADOR CASCADE CONSTRAINTS;
  2. DROP TABLE CONTRATO CASCADE CONSTRAINTS;
  3.  
  4. CREATE TABLE CONTRATO
  5.                       (
  6.                       FECHA_CONTRATACION DATE,
  7.                       SALARIO NUMERIC,
  8.                       PUESTO CHAR(20), CHECK (PUESTO IN ( 'Encargado','Dependiente')),
  9.                       COD_CONT VARCHAR(20),
  10.                       PRIMARY KEY(COD_CONT)
  11.                       );
  12.                      
  13.                      
  14. CREATE TABLE TRABAJADOR
  15.                       (
  16.                       NOMBRE VARCHAR(50),
  17.                       APELLIDOS VARCHAR(50),
  18.                       DNI VARCHAR(10),
  19.                       CATEGORIA CHAR(20), CHECK (CATEGORIA IN ('Encargado','Dependiente')),
  20.                       HORAS_EXT INTEGER,
  21.                       NUM_SEG_SOCIAL CHAR(11),
  22.                       SEXO CHAR(20), CHECK(SEXO IN('Hombre','Mujer')),
  23.                       TELEFONO CHAR(9),
  24.                       EMAIL VARCHAR(50),
  25.                       DIRECCION VARCHAR(100),
  26.                       COD_TRA VARCHAR(20),
  27.                       COD_CONT VARCHAR(20),
  28.                       PRIMARY KEY(COD_TRA),
  29.                       FOREIGN KEY (COD_CONT)REFERENCES CONTRATO(COD_CONT)
  30.                       );


Y quiero que cuando un trabajador ascienda se cambie su PUESTO y su SALARIO, para lo que he hecho el siguiente PROCEDURE:
Código SQL:
Ver original
  1. CREATE OR REPLACE PROCEDURE ascender_trabajador(cod_trab IN VARCHAR)
  2.  IS RES VARCHAR(20);
  3. fecha1 DATE;
  4. cod_conte VARCHAR(20);
  5. pues CHAR(20);
  6. BEGIN
  7.   SELECT COD_CONT INTO cod_conte FROM TRABAJADOR WHERE cod_trab=TRABAJADOR.COD_TRA;
  8.   SELECT FECHA_CONTRATACION INTO fecha1 FROM CONTRATO WHERE cod_conte=CONTRATO.COD_CONT;
  9.   SELECT PUESTO INTO pues FROM CONTRATO WHERE cod_conte=CONTRATO.COD_CONT;
  10.   IF(pues = 'Dependiente')
  11.   THEN
  12. IF (fecha1 - SYSDATE < 0)
  13. THEN
  14.   UPDATE CONTRATO SET SALARIO = 1500 WHERE cod_conte=CONTRATO.COD_CONT;
  15.   UPDATE CONTRATO SET PUESTO = 'Dependiente' WHERE cod_conte=CONTRATO.COD_CONT;
  16.   res:='Trabajador ascendido correctamente';
  17.   ELSE res:='El trabajador no puede ascender porque no ha cumplido el año de trabajo requerido para ello1';
  18.   END IF;
  19.   ELSE res:='El trabajador no puede ascender porque ya está en el máximo puesto';
  20.   END IF;
  21.   dbms_output.put_line(RES);
  22.   END PROCEDURE;


El caso es que me da un error que dice : "Error(22,7): PLS-00103: Encountered the symbol "PROCEDURE" when expecting one of the following: ; <an identifier> <a double-quoted delimited-identifier> current delete exists prior <a single-quoted SQL string> The symbol "PROCEDURE" was ignored. "


Estoy un poco verde en este tema, no sé qué es lo que puede estar fallando. Si alguien me echara una mano se lo agradecería. Gracias.

PD:No sabía como hacer la excepcion de que si un trabajador no lleva el año trabajado no puede ascender. Me la he inventado un poco con lo de SYSDATE ¿Está bien?
  #2 (permalink)  
Antiguo 19/06/2015, 06:45
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Problema con un Procedure

La palabra PROCEDURE en la línea 22 está de más, debería ser END;

Saludos
  #3 (permalink)  
Antiguo 19/06/2015, 07:15
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Problema con un Procedure

Además a nivel "lógico" tiene un fallo puesto que al ascender mantiene el puesto de "dependiente".
__________________
Aviso: No se resuelven dudas por MP!
  #4 (permalink)  
Antiguo 19/06/2015, 07:24
Avatar de blueMuffin010  
Fecha de Ingreso: mayo-2015
Ubicación: Sevilla
Mensajes: 19
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problema con un Procedure

Antes que nada, gracias por la contestación.

Cita:
Iniciado por Malenko Ver Mensaje
Además a nivel "lógico" tiene un fallo puesto que al ascender mantiene el puesto de "dependiente".
Eso no se cambia automáticamente cuando uso UPDATE SET?????
  #5 (permalink)  
Antiguo 19/06/2015, 07:31
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Problema con un Procedure

Hace referencia a la línea 15, que debería ser:

Código SQL:
Ver original
  1. UPDATE CONTRATO SET PUESTO = 'Encargado' WHERE cod_conte=CONTRATO.COD_CONT;

Saludos
  #6 (permalink)  
Antiguo 19/06/2015, 07:38
Avatar de blueMuffin010  
Fecha de Ingreso: mayo-2015
Ubicación: Sevilla
Mensajes: 19
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problema con un Procedure

Aaaaahh vale, vale, fallo tonto. Gracias

Sobre lo de IF (fecha1 - SYSDATE < 0) alguno sabe si está bien o no???
  #7 (permalink)  
Antiguo 19/06/2015, 07:54
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Problema con un Procedure

La comparación lógica (fecha1 - SYSDATE < 0) es válida, pero el resultado no te informará si el empleado tiene 1 año de antigüedad, más o menos.

Saludos
  #8 (permalink)  
Antiguo 19/06/2015, 07:55
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Problema con un Procedure

Entiendo que quieres comprobar que la fecha de contratación sea inferior a la fecha actual, no? Es un poco rebuscado. No queda más visual ponerlo así?

Código SQL:
Ver original
  1. IF (fecha1 < SYSDATE)

Como consejo, también pondría nombres de variables más significativos. Si tu lees "fecha1" no sabes que va a almacenar, con lo que he de "adivinarlo". O por ejemplo, porque llamas a la variable "pues" y no "puesto"? Por dos caracteres más aporta muchísimo más significado sobre lo que almacenará.
__________________
Aviso: No se resuelven dudas por MP!
  #9 (permalink)  
Antiguo 19/06/2015, 08:22
Avatar de blueMuffin010  
Fecha de Ingreso: mayo-2015
Ubicación: Sevilla
Mensajes: 19
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problema con un Procedure

Con respecto a los nombres de las variables la verdad es que sí, intentaré ponerlas más claras a partir de ahora.

Para la fecha lo que yo quiero es que un empleado no pueda ascender a no ser que lleve como mínimo un año trabajando. Es decir, que si un empleado empieza a trabajar el 07/05/2014 no puede ser ascendido hasta el 07/05/2015, la verdad es que aquí sí que estoy perdida, no sé cómo contar un año.
  #10 (permalink)  
Antiguo 19/06/2015, 08:42
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: Problema con un Procedure

Te dejo un ejemplo, que me estoy acordando de memoria, deberías probarlo bien. El resultado de la comparación es un entero que representa la cantidad de años entre las fechas.

Código SQL:
Ver original
  1. IF ( trunc(months_between(sysdate , fecha1) /12) > 0)

Saludos
  #11 (permalink)  
Antiguo 19/06/2015, 08:57
Avatar de blueMuffin010  
Fecha de Ingreso: mayo-2015
Ubicación: Sevilla
Mensajes: 19
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problema con un Procedure

Cita:
Iniciado por matanga Ver Mensaje
Te dejo un ejemplo, que me estoy acordando de memoria, deberías probarlo bien. El resultado de la comparación es un entero que representa la cantidad de años entre las fechas.

Código SQL:
Ver original
  1. IF ( trunc(months_between(sysdate , fecha1) /12) > 0)

Saludos
Muchísimas gracias por la ayuda, con eso ya me funciona todo bien

Etiquetas: procedure, table
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 08:37.