CREATE OR REPLACE FUNCTION MOD_11(VALOR IN VARCHAR2) RETURN NUMBER IS
SOMA NUMBER;
CONTADOR NUMBER;
PESO NUMBER;
DIGITO NUMBER;
BASE NUMBER;
RESTO BOOLEAN; 
begin
  SOMA := 0;
  PESO := 2;
  BASE := 9;
  RESTO := FALSE;
  FOR CONTADOR IN REVERSE 1 .. LENGTH(VALOR) LOOP
    SOMA := SOMA +  (TO_NUMBER(SUBSTR(VALOR,CONTADOR,1)))* (PESO);
    IF (PESO < BASE) THEN
      PESO := PESO + 1 ;
    ELSE
      PESO := 2;
    END IF;
  END LOOP;
  IF RESTO THEN
    DIGITO := MOD(SOMA,11);
  ELSE 
    DIGITO := 11 - MOD(SOMA,11);
    IF (DIGITO > 9) THEN
      DIGITO := 0;
    END IF;
  END IF;
  RETURN DIGITO;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('MOD_11','6.35.044'); END;
/
