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

problemas proc almacenado

Estas en el tema de problemas proc almacenado en el foro de Oracle en Foros del Web. Buenas: Estoy creando un procedimiento almacenado que inserta un registro en una tabla (T_ALMACEN). La tabla se compone de los siguientes campos: ID_ALM NUMBER(3,0) NOT ...
  #1 (permalink)  
Antiguo 03/05/2011, 03:15
 
Fecha de Ingreso: abril-2011
Mensajes: 7
Antigüedad: 13 años, 6 meses
Puntos: 0
problemas proc almacenado

Buenas:

Estoy creando un procedimiento almacenado que inserta un registro en una tabla (T_ALMACEN).
La tabla se compone de los siguientes campos:
ID_ALM NUMBER(3,0) NOT NULL PK--->IDENTIFICADOR
TIPO_VIA VARCHAR2(2) IN ('CL','AV',RU','CA') NOT NULL
VIA VARCHAR2(25)-->NOMBRE DE VÍA
NUM NUMBER(3,0) NOT NULL
COD_POS NUMBER(5,0) -->CÓDIGO POSTAL
OPER VARCHAR2(1) NOT NULL IN ('S','N')-->INDICADOR DE OPERATIVIDAD
NOMBRE VARCHAR2(25) NOT NULL-->NOMBRE DEL ALMACEN

Mi procedimiento hace una comprobación de los parámetros de entrada (los valores de los campos del registro que ingreso), el que me da problemas es el TIPO_VIA que aunque entre algunos de los valores permitidos, me salta una excepción controlada pero creo que no debería.

El bloque de este código es:

if p_tipo_insert is not null then
dbms_output.put_line('tipo de via no es nulo');
if p_via_insert != 'CL' and p_via_insert != 'AV' and p_via_insert != 'RU' and p_via_insert != 'CA' then
dbms_output.put_line('tipo via no válido');
raise v_data_exception;
end if;
end if;

........

exception
when v_data_exception then
dbms_output.put_line('Imposible insertar, incoherencia en datos de entrada.');
when others then
dbms_output.put_line('Imposible insertar, problema sin determinar.');

Y me salta la traza de incoherencia de datos ?¿?¿?¿?¿

La cosa es que insertando directamente no tengo problemas pero a través del proc SIEMPRE me da el mismo error.

Ej:

BEGIN
pr_insert_almacen (756,'CL','PELOTAS',34,47583,'S','CASAS');
END;

RESULTADO:

id: 756
tipo via: CL
via: PELOTAS
num via: 34
cod postal: 47583
operativo: S
nombre: CASAS
id no es nulo
tipo de via no es nulo
tipo via no válido
Imposible insertar, incoherencia en datos de entrada.


Alguien sabría decirme lo que ocurre?
Gracias a todos
  #2 (permalink)  
Antiguo 03/05/2011, 07:34
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 17 años, 10 meses
Puntos: 4
Respuesta: problemas proc almacenado

Hola.

Podrias colocar el codigo para ver en donde esta el error, asi como lo colocas no se puede saber a ciencia cierta cual es la causa del error.


Saludos.
  #3 (permalink)  
Antiguo 03/05/2011, 07:59
 
Fecha de Ingreso: abril-2011
Mensajes: 7
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: problemas proc almacenado

Hola,scooby:

el código completo es:

create or replace procedure pr_insert_almacen
(p_id_insert in number,
p_tipo_insert in varchar2,
p_via_insert in varchar2,
p_num_insert in number,
p_cod_post_insert in number,
p_oper_insert in varchar2,
p_nombre_insert in varchar2) as
v_data_exception exception;
begin
/*comprobación de los datos entrados*/
dbms_output.put_line('id: ' || to_char(p_id_insert));
dbms_output.put_line('tipo via: ' || p_tipo_insert);
dbms_output.put_line('via: ' || p_via_insert);
dbms_output.put_line('num via: ' || p_num_insert);
dbms_output.put_line('cod postal: ' || to_char(p_cod_post_insert));
dbms_output.put_line('operativo: ' || p_oper_insert);
dbms_output.put_line('nombre: ' || p_nombre_insert);
/*comprobación de integridad de parámetros*/
if p_id_insert is null then
dbms_output.put_line('Error: identificador es nullo');
raise v_data_exception;
end if;
if p_id_insert is not null then
dbms_output.put_line('id no es nulo');
end if;
if p_tipo_insert is null then
dbms_output.put_line('Error: tipo de via es nullo');
raise v_data_exception;
end if;
/*---*/
if p_tipo_insert is not null then
dbms_output.put_line('tipo de via no es nulo');
if p_via_insert != 'CL' and p_via_insert != 'AV' and p_via_insert != 'RU' and p_via_insert != 'CA' then
dbms_output.put_line('tipo via no válido');
raise v_data_exception;
end if;
end if;
if p_tipo_insert is null then
dbms_output.put_line('tipo de via es nulo');
raise v_data_exception;
end if;
/*---*/
if p_via_insert is null then
dbms_output.put_line('Error: via es nulo');
end if;
if p_via_insert is not null then
dbms_output.put_line('Error: via no es nulo');
end if;
/*--*/
if p_num_insert is null then
raise v_data_exception;
end if;
if p_num_insert is not null then
dbms_output.put_line('numero no es nulo');
raise v_data_exception;
end if;
/*--*/
if p_oper_insert is null then
dbms_output.put_line('Error: indicador operativo es nulo');
raise v_data_exception;
end if;
if p_oper_insert is not null then
dbms_output.put_line('indicador operativo no es nulo');
if p_oper_insert != 's' and p_oper_insert != 'n' then
dbms_output.put_line('Error: indicador operativo ni s ni n');
raise v_data_exception;
end if;
if p_oper_insert = 'S' or p_oper_insert = 'N' then
dbms_output.put_line('indicador oper ok');
end if;
end if;
/*--*/
if p_nombre_insert is null then
dbms_output.put_line('Error: nombre es nulo');
raise v_data_exception;
end if;
if p_nombre_insert is not null then
dbms_output.put_line('nombre no es nulo');
end if;
/*si todo ok inserción en tabla*/
insert into t_almacen values (p_id_insert, p_tipo_insert, p_via_insert, p_num_insert, p_cod_post_insert, p_oper_insert, p_nombre_insert);
commit;
dbms_output.put_line('Inserción de almacen correcta.');
exception
when v_data_exception then
dbms_output.put_line('Imposible insertar, incoherencia en datos de entrada.');
when others then
dbms_output.put_line('Imposible insertar, problema sin determinar.');
end;

Espero que esto te ayude más.

Un saludo
  #4 (permalink)  
Antiguo 03/05/2011, 11:16
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: problemas proc almacenado

La cosa es que insertando directamente no tengo problemas pero a través del proc SIEMPRE me da el mismo error.

No me parece nada raro y tampoco me parece un error. Le estás diciendo que si

p_via_insert != 'CL' and p_via_insert != 'AV' and p_via_insert != 'RU' and p_via_insert != 'CA' entonces te saque el mensaje tipo via no válido y haces un raise para que se te vaya por el when v_data_exception y sacas el mensajito de Imposible insertar, incoherencia en datos de entrada.No es raro que el insert directo te funcione si no viola ninguna constraint que tengas en la tabla.

No se si me has entendido, pero creo que te lo he puesto bien claro.
  #5 (permalink)  
Antiguo 05/05/2011, 16:30
Avatar de bitbow  
Fecha de Ingreso: julio-2006
Ubicación: Distrito Federal
Mensajes: 635
Antigüedad: 18 años, 4 meses
Puntos: 34
Respuesta: problemas proc almacenado

Creo que tu problema esta en esta parte, los tipos de datos no corresponden.

/*comprobación de los datos entrados*/
dbms_output.put_line('id: ' || to_char(p_id_insert));
dbms_output.put_line('tipo via: ' || p_tipo_insert);
dbms_output.put_line('via: ' || p_via_insert);
dbms_output.put_line('num via: ' || p_num_insert);
dbms_output.put_line('cod postal: ' || to_char(p_cod_post_insert));
dbms_output.put_line('operativo: ' || p_oper_insert);
dbms_output.put_line('nombre: ' || p_nombre_insert);
/*comprobación de integridad de parámetros*/

Suerte.
__________________
El ego es el mayor enemigo de un hombre inteligente.
  #6 (permalink)  
Antiguo 10/05/2011, 09:26
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 17 años, 10 meses
Puntos: 4
Respuesta: problemas proc almacenado

Hola joseigvillanueva


Te comento que me puse a probar tu query y encontre lo siguiente:

Código SQL:
Ver original
  1. IF p_Tipo_Insert IS NOT NULL THEN
  2.       Dbms_Output.Put_Line('tipo de via no es nulo');
  3.       IF p_Via_Insert != 'CL' AND p_Via_Insert != 'AV' AND
  4.          p_Via_Insert != 'RU' AND p_Via_Insert != 'CA' THEN
  5.         Dbms_Output.Put_Line('tipo via no válido');
  6.         Raise v_Data_Exception;
  7.       END IF;
  8.     END IF;

Aqui lo que sucede, segun los datos que tu colocas (756,'CL','PELOTAS',34,47583,'S','CASAS') el valor que toma p_Via_Insert es PELOTAS, por consiguiente cada vez que llega a este if se va por el raise que colocaste. si lo que quieres es comparar, deberia de ser es contra la variable p_Tipo_Insert que es la que esta almacenando el CL, todo esto siguiendo la logica que tienes en el procedimiento.

Saludos.
  #7 (permalink)  
Antiguo 10/05/2011, 15:20
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: problemas proc almacenado

Por lo que se puede ver, la idea es que no se inserten valores fuera del rango 'CL', 'AV', 'RU' y 'CA', si ese el caso, la condición del if debería ser:

Código:
if ( p_via_insert not in ('CL','AV','RU','CA') ) then
 raise v_data_exception;
end if;
Otra alternativa para lograr esto es utilizar check constraints, ya que pueden validar los datos de las tablas cuando se hacen cargas externas o simplificar el código del procedimiento.

Saludos

Etiquetas: almacenar
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 12:48.