CREATE OR REPLACE PROCEDURE USR_NOVO_CODIGO(
   P_CONTADOR    IN  NOVOCODIGO.CDCONTADOR%TYPE,
   P_SEQUENCIAL  OUT NOVOCODIGO.NRSEQUENCIAL%TYPE,
   P_QTDE        IN  NUMBER DEFAULT 1)
AS
   V_COUNT NUMBER;
   V_CODIGO VARCHAR2(20);

BEGIN
   SELECT COUNT(CDCONTADOR) INTO V_COUNT
   FROM NOVOCODIGO
   WHERE CDCONTADOR = P_CONTADOR;

   IF V_COUNT > 0 THEN
      SELECT NRSEQUENCIAL
      INTO   V_CODIGO
      FROM   NOVOCODIGO
      WHERE  CDCONTADOR = P_CONTADOR
      FOR UPDATE;

      UPDATE NOVOCODIGO
      SET NRSEQUENCIAL = LPAD(RTRIM(TO_CHAR(TO_NUMBER(RTRIM(NRSEQUENCIAL)) + P_QTDE)),20,'0')
      WHERE CDCONTADOR = P_CONTADOR;
   ELSE
      V_CODIGO := LPAD(RTRIM(TO_CHAR(0)),20,'0');

      INSERT INTO NOVOCODIGO (CDCONTADOR, NRSEQUENCIAL)
      VALUES (P_CONTADOR, LPAD(RTRIM(TO_CHAR(P_QTDE)),20,'0'));
   END IF;

   P_SEQUENCIAL := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_CODIGO) + 1)),20,'0');
END;
/
-- VERSAO --
BEGIN ATUVEROBJ('USR_NOVO_CODIGO','4.11.046'); END;
/

