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

No regresa datos

Estas en el tema de No regresa datos en el foro de Oracle en Foros del Web. Holas, tengo problemas con una funcion que hice no me actualiza la tabla que eh creado con los datos respectivos, perdonen si tiene simples fallos ...
  #1 (permalink)  
Antiguo 25/09/2013, 18:05
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 11 años, 1 mes
Puntos: 0
Exclamación No regresa datos

Holas, tengo problemas con una funcion que hice no me actualiza la tabla que eh creado con los datos respectivos, perdonen si tiene simples fallos es por que recien inicion en lo que es oracle y pl/sql
el codigo de mi tabla es

Código SQL:
Ver original
  1. CREATE TABLE TP_EMP_CONTRATO(
  2. COD_CONTRATO VARCHAR(10)NOT NULL PRIMARY KEY,
  3. AREA VARCHAR(45),
  4. DESEMPEÑO VARCHAR(45),
  5. T_CONTRATO VARCHAR(45),
  6. INI_CONTRADO DATE,
  7. SALARIO NUMERIC(8,2)
  8. );

Los datos insertados son

Código SQL:
Ver original
  1. --Insertando datos a la tabla tipo de contrato
  2. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  3. VALUES('COT001','ADMINISTRACION','ORGANIZADOR','TRABAJADOR DEPENDIEN-TE','15/9/1998','');
  4. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  5. VALUES('COT002','CONTABILIDAD','GERENTE','TRABAJADOR TIEMPO PAR-CIAL','10/12/1993','');
  6. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  7. VALUES('COT003','FINANZAS','ESPECIALISTA EN FINANZAS','TRABAJADOR DEPENDIEN-TE','5/12/1999','');
  8. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  9. VALUES('COT004','CAPITAL HUMANO','CAPACITADOR Y CONTRATADOR','TRABAJADOR FI-JO','7/10/1999','');
  10. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  11. VALUES('COT005','SERVICIOS POST-VENTA','ESPECIALISTAS DE MERCADEO','TRABAJADOR TIEMPO PARCIAL','15/9/1998','');
  12. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  13. VALUES('COT006','GESTIÓN TECNOLÓGICA','ORGANIZADOR','TRABAJADOR FI-JO','6/10/2005','');
  14. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  15. VALUES('COT007','INFRAESTRUCTURA','INGENIERO','TRABAJADOR FIJO','8/11/2004','');
  16. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  17. VALUES('COT008','PLANEACIÓN','GERENCIA GENERAL','TRABAJADOR TIEMPO PAR-CIAL','6/7/2003','');
  18. INSERT INTO TP_EMP_CONTRATO(COD_CONTRATO,AREA,DESEMPEÑO,T_CONTRATO,INI_CONTRADO,SALARIO)
  19. VALUES('COT009','SEGURIDAD','EMPLEADOS','TRABAJADOR FIJO','15/9/2001','');


Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION F_CONDICION_TP_TRABAJADOR (TP_trabajador VARCHAR)
  2.   RETURN NUMERIC
  3.  IS
  4.   condicion NUMERIC(8,2);
  5.  BEGIN
  6.    condicion:='';
  7.    IF TP_trabajador='TRABAJADOR DEPENDIENTE' THEN
  8.       condicion:=1400;
  9.    elsif TP_trabajador='TRABAJADOR FIJO' THEN
  10.       condicion:=2000;
  11.    ELSE
  12.       condicion:=800;
  13.    END IF;
  14.   RETURN condicion;
  15.  
  16.    UPDATE  TP_EMP_CONTRATO SET SALARIO =condicion;
  17.  END;
y con esto lo relaciono
Código SQL:
Ver original
  1. SELECT AREA,DESEMPEÑO, T_CONTRATO,
  2. F_CONDICION_TP_TRABAJADOR(T_CONTRATO)
  3. FROM TP_EMP_CONTRATO
pero al ejecutar no me guarda el valor de la condicion en salario
porfavor si me podrian ayudar con el codigo
gracias de atemano

Última edición por gnzsoloyo; 25/09/2013 a las 18:10 Razón: Usar el Highlight correcto, por favor.
  #2 (permalink)  
Antiguo 25/09/2013, 18:12
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: No regresa datos

Cita:
pero al ejecutar no me guarda el valor de la condicion en salario
Pues es obvio, mirando ese código que jamás te lo guardará...
El UPDATE está después del RETURN, por lo que jamás llega a ejecutarse.
__________________
¿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 25/09/2013, 18:47
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: No regresa datos

ps lo puse asi como dices pero me sale error al ejecutar la llamada de la funcion

ORA-14551:cannot perform a DML operation inside a query
ORA-06512:at"SYS.F_CONDICION_TP_TRABAJADOR",line 15
  #4 (permalink)  
Antiguo 25/09/2013, 19:24
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: No regresa datos

Efectivamente y tal como dice el error, no puedes ejecutar sentencias dml en una funciòn y menos cuando la usas dentro de una consulta.

Solo imaginate que tu consulta retornara 1000000 de registros y al interior hicieras esos 1000000 de updates sin nisiquiera tener un condicional.

Recuerda que una funciòn devuelve un unico valor en su retorno.

Describenos que requieres y te damos algunas ideas.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 25/09/2013, 19:26
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: No regresa datos

quiero que condicion se guarde en salario pero no entiendo muy bien como ponerlo de la forma que dicen
  #6 (permalink)  
Antiguo 25/09/2013, 19:32
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: No regresa datos

Cuando haces esto:

Código SQL:
Ver original
  1. SELECT AREA,DESEMPEÑO, T_CONTRATO
  2. FROM TP_EMP_CONTRATO

que te devuelve?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 25/09/2013, 19:36
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: No regresa datos

Me sale los datos insertados
URL=http://www.subirimagenes.com/imagen-sinttulo-8634399.html][/URL]
  #8 (permalink)  
Antiguo 25/09/2013, 19:46
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: No regresa datos

Dejalo como un campo calculado. Evita el update.
Solo tendrias que quitar el update.

Si definitivamente lo quieres almacenar, Para eso, te recomendarìa mas unn trigger, que antes de intertarse un registro en esa tabla, calcule el valor.

quedaria asi mas o menos:

Código SQL:
Ver original
  1. CREATE OR REPLACE TRIGGER tri_tp_emp_contrato
  2. BEFORE INSERT ON tp_emp_contrato FOR EACH ROW
  3.  BEGIN
  4.  
  5.    IF :NEW.TP_trabajador='TRABAJADOR DEPENDIENTE' THEN
  6.       :NEW.SALARIO :=1400;
  7.    elsif :NEW.TP_trabajador='TRABAJADOR FIJO' THEN
  8.       :NEW.SALARIO :=2000;
  9.    ELSE
  10.       :NEW.SALARIO :=800;
  11.    END IF;
  12. END;
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 26/09/2013 a las 07:33
  #9 (permalink)  
Antiguo 25/09/2013, 19:59
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: No regresa datos

cuanto quisiera hacerlo haci pero el profesor me pidio que haga funciones con if yo queria ponerle el update para que pase los datos de return al de la tabla
por favor si me puedes ayudar
  #10 (permalink)  
Antiguo 25/09/2013, 20:13
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: No regresa datos

No se puede por funcion.

Dejalo como campo calculado. No hay necesidad de almacenarlo en un campo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 25/09/2013, 20:29
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: No regresa datos

entonces no se puede realizar un update dentro de una funcion?
  #12 (permalink)  
Antiguo 25/09/2013, 20:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: No regresa datos

No se puede
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #13 (permalink)  
Antiguo 25/09/2013, 20:54
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: No regresa datos

Lo que tienes que pensar es que una función tiene por objeto realizar una operación que devuelva un único valor. No realizar operaciones DML.
Si lo que quieres es realizar tal UPDATE no es una stored function lo que debes usar, sino un stored procedure, que no es exactamente lo mismo, y tu profesor lo sabe.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 25/09/2013, 21:46
 
Fecha de Ingreso: septiembre-2013
Mensajes: 9
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: No regresa datos

Intente con el triger pero este error me genero

http://s2.subirimagenes.com/imagen/previo/thump_8634510sin-ttulo.png
  #15 (permalink)  
Antiguo 26/09/2013, 03:02
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: No regresa datos


Eso no es exactamente un error, es un problema de permisos.

¿No lo tradujiste?

Simplemente te dice que no puedes crear un trigger en objetos que le pertenecen al SYS.
¿En dónde estás tratando de meterlo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 26/09/2013, 07:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: No regresa datos

Cita:
¿En dónde estás tratando de meterlo?


Volviendo al tema, si no quieres obtener un cero en tu nota, tal como dice gnzsoloyo, nunca debes crear objetos de uso personal en el esquema sys. El esquema sys es el corazón de Oracle y cualquier tarea adicional que requieras, debes crear un esquema aparte.

Antes que nada, para crear el usuario sería:
Código SQL:
Ver original
  1. CREATE USER nombre_de_su_usuario IDENTIFIED BY el_password_que_quieras;
  2. GRANT CONNECT,RESOURCE TO nombre_de_su_usuario;
La primera linea crea un esquema. la segunda asigna permisos para conectarse y para tareas basicas como la creación de objetos.

Una vez hecho esto, te debes conectar al usuario.
CONN nombre_del_usuario/el_password_que_quieras

Para verificar que estas conectado como el usuario y no como sys, puedes ejecutar esta consulta:
Código SQL:
Ver original
  1. SELECT USER FROM DUAL;

debe aparecer el usuario que acabas de crear.

En este punto, creas tu tabla, creas tu función, creas tu trigger y realizas las respectivas pruebas.

Saludos

PD: Perdón gnzsoloyo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #17 (permalink)  
Antiguo 26/09/2013, 07:56
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: No regresa datos

No problem...



La frase quedó picando...
__________________
¿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: tabla
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 01:11.