CREATE OR REPLACE PROCEDURE SF_NOVO_CODIGO(
   P_CONTADOR    IN  NOVOCODIGO.CDCONTADOR%TYPE,
   P_SEQUENCIAL  OUT NOVOCODIGO.NRSEQUENCIAL%TYPE,
   P_QTDE        IN  NUMBER DEFAULT 1,
   P_NRORG       IN  NOVOCODIGO.NRORG%TYPE DEFAULT 1)

AS
   V_COUNT NUMBER;
   V_CODIGO VARCHAR2(20);

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

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

      UPDATE NOVOCODIGO
      SET NRSEQUENCIAL = LPAD(RTRIM(TO_CHAR(TO_NUMBER(RTRIM(NRSEQUENCIAL)) + P_QTDE)),20,'0')
      WHERE CDCONTADOR = P_CONTADOR
        AND NRORG = P_NRORG;
   ELSE
      V_CODIGO := LPAD(RTRIM(TO_CHAR(0)),20,'0');
      INSERT INTO NOVOCODIGO (CDCONTADOR, NRSEQUENCIAL, NRORG)
      VALUES (P_CONTADOR, LPAD(RTRIM(TO_CHAR(P_QTDE)),20,'0'),P_NRORG);
   END IF;
   P_SEQUENCIAL := LPAD(RTRIM(TO_CHAR(TO_NUMBER(V_CODIGO) + 1)),20,'0');
  COMMIT;
END;
/



-- VERSAO --
BEGIN ATUVEROBJ('SF_NOVO_CODIGO','4.05.111'); END;
/

