Calcular dígito verificador de códigos de barra EAN13 con Oracle PL/SQL

En el trabajo tuve la necesidad de calcular el dígito verificador de códigos de barra EAN13 con el lenguaje PL/SQL de Oracle, y como estaba bastante perezoso para codificarlo por mí mismo me puse a probar varios ejemplos de código que había encontrado en Internet.

Los resultados de las pruebas de dichos ejemplos fueron diversos, y como en ciertas ocasiones el dígito verificador calculado no resultaba ser el correcto, al final decidí crear mi propia versión.

El código que sigue a continuación es una función que retorna el dígito verificador calculado en base a la cadena de caracteres que recibe como parámetro. La función es bastante simple y tiene amplio margen de mejora, pero el código básico requerido para calcular el dígito verificador funciona y es eso lo que pretendo dejar documentado.
CREATE OR REPLACE FUNCTION CODIGO_BARRAS_GENERAR_DV(P_CODIGO IN VARCHAR2, P_TIPO VARCHAR2 DEFAULT 'EAN13') RETURN VARCHAR2 IS
L_SUM NUMBER;
L_MULTIPLE NUMBER;
V_CODIGO_EAN13 VARCHAR2(13) DEFAULT NULL;
BEGIN
IF (P_TIPO = 'EAN13') THEN
V_CODIGO_EAN13 := SUBSTR(LPAD(P_CODIGO,12,'0'),1,12);
FOR I IN 1..12 LOOP
IF (MOD(I,2) = 0) THEN
L_MULTIPLE := 3;
ELSE
L_MULTIPLE := 1;
END IF;

L_SUM := NVL(L_SUM, 0) + SUBSTR(V_CODIGO_EAN13, I, 1) * L_MULTIPLE;
END LOOP;

RETURN V_CODIGO_EAN13||REPLACE((10 - MOD(L_SUM, 10)),10,0);
ELSE
RETURN NULL;
END IF;
END;
ENLACE: Código disponible en Gist de Github.

Fuentes

Comentarios