Ir al contenido


Foto

sobre procedimientos almacenados


  • Por favor identifícate para responder
6 respuestas en este tema

#1 JuanPalmaSoft

JuanPalmaSoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 76 mensajes
  • LocationDistrito Federal

Escrito 05 julio 2012 - 09:15

:sad:

Tengo un procedimiento almacenado, que no se proque me retorna null, si en la tabla existe una tupla que tiene valor. Lo que hace el mismo es agarrar ese valor e incrementarle una unidad. Otras cosas que me pasaron, cuando  hago el select y solo le pongo en el where los campos empresa y tipo. Me da error que hay mas de una fila, voy al editor, ejecuto esta consulta y solo me retorna una fila. 

me pueden ayudar a descifrar esto, por fa.

CREATE DEFINER = 'root'@'localhost' PROCEDURE `Sys_Dame_Consecutivo`(
        OUT Consecutivo VARCHAR(8),
        IN Tipo CHAR(3),
        IN Empresa CHAR(2)
    )
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

DECLARE Contador DOUBLE;

select consecutivo from global_consecutivos
where `NOEMPRESA` = Empresa      and
      `TIPO`      = Tipo          and
      `BASEDATOS` = 'Orden Envio' and
      `SERIE`    = Tipo          and
      `SUCURSAL`  = '22'
into Contador;
           
Set Contador = Contador + 1;

update global_consecutivos
set CONSECUTIVO = Contador
where `NOEMPRESA` = Empresa      and
      `TIPO`      = Tipo          and
      `BASEDATOS` = 'Orden Envio' and
      `SERIE`    = Tipo          and
      `SUCURSAL`  = '22'; 
     
set Consecutivo = CAST( Contador as Char(8));

   
END;


gracias
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 05 julio 2012 - 09:52

Supongo que cuando pides el consecutivo de un valor que aun nunca se ha usado, devuelve un null, y null + 1 = null, al menos en FireBird.

En FireBird se haría así:

Contador = CoalEsce(Contador, 0) + 1

CoalEsce cambia un null porf el segundo valor,así, cuando contador es null devuelve un 0, y en el resto de casos, no modifica contador.

En MySQL debe haber algo igual para cambiar nulls por otros valores "por defecto", pero ese no es mi fuerte !
  • 0

#3 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 05 julio 2012 - 01:42

Supongo que cuando pides el consecutivo de un valor que aun nunca se ha usado, devuelve un null, y null + 1 = null, al menos en FireBird.

En FireBird se haría así:

Contador = CoalEsce(Contador, 0) + 1

CoalEsce cambia un null porf el segundo valor,así, cuando contador es null devuelve un 0, y en el resto de casos, no modifica contador.

En MySQL debe haber algo igual para cambiar nulls por otros valores "por defecto", pero ese no es mi fuerte !


Me ha pasado lo mismo en SQLServer 2005 y 2008, usando ISNULL(<<Valor>>,0) se resuelve y me parece es este mismo en MySQL.

Saludos
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 06 julio 2012 - 03:42

En FireBird existe una segunda manera de conseguirlo, por si sirve en MySQL:

Contador = iif(Contador is null, 0, Contador) + 1

No lo he probado, pero debería funcionar al menos en FB.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 06 julio 2012 - 06:25

MySQL sí tiene la función COALESCE al igual que Firebird.

Saludos.
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 julio 2012 - 07:52

Hola,
Tengo entendido que Coalesce YA es estándar (desde 2008) y se supone que todos los motores deberían tenerla  *-) Si hasta el Big Devil la incorporó en su motor.

Saludos,
  • 0

#7 JuanPalmaSoft

JuanPalmaSoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 76 mensajes
  • LocationDistrito Federal

Escrito 10 julio 2012 - 10:17

Gracias a todos.

Elproblema estaba en la declaracion de parametros y variables, que deben tener, diferente nombre al  de los campos de las tablas.  Pero si estaba el valor inicializado en cero, en la tabla d ela cual busco el proximo consecutivo.

Como quedo el procedimiento, y trabaja sin problemas.

CREATE DEFINER = 'root'@'localhost' PROCEDURE `Sys_Dame_Consecutivo`(
        OUT ParConsecutivo VARCHAR(8),
        IN ParTipo CHAR(3),
        IN ParEmpresa CHAR(2)
    )
    NOT DETERMINISTIC
    READS SQL DATA
    SQL SECURITY INVOKER
    COMMENT ''
BEGIN

declare VarContador DOUBLE DEFAULT 0;

select consecutivo into VarContador from `global_consecutivos`
where `NOEMPRESA` =  ParEmpresa  and
      `TIPO`      =  ParTipo;

Set VarContador = VarContador + 1;

update `global_consecutivos`
set  consecutivo =  VarContador
where `NOEMPRESA` =  ParEmpresa  and
      `TIPO`      =  ParTipo;
     
Set ParConsecutivo = CAST( VarContador as Char(8));       
   
END;

  • 0




IP.Board spam blocked by CleanTalk.