O comando CALL transfere o controle do programa principal para outro programa (subprograma), sendo utilizado para modularização, reutilização de código e passagem de parâmetros entre programas.

🧠 O que faz

  • O programa principal é chamado de chamador.

  • O programa externo que recebe o controle é o subprograma chamado.

  • A transferência é temporária: ao final da execução do subprograma, o controle retorna ao programa chamador.

  • É compatível com passagem de parâmetros por referência, valor ou conteúdo.

  • Pode ser utilizado com RETURNING para obter valores do subprograma.

🧾 Sintaxe

CALL 'NOME-DO-PROGRAMA' [USING argumentos]
                      [RETURNING retorno]
                      [ON EXCEPTION imperativa]
                      [NOT ON EXCEPTION imperativa]
                      [END-CALL]

🔁 Tipos de passagem de parâmetros

Tipo O que faz
BY REFERENCE Passa a referência (endereço) do dado. Alterações afetam o original.
BY CONTENT Passa cópia do valor. O subprograma pode alterar, mas não reflete no chamador.
BY VALUE Passa valor como cópia imutável. Recomendado para chamadas externas (ex: C).

📌 Exemplo simples

▶️ Programa principal

CALL 'PROGSEC' USING WS-VALOR.

▶️ Programa chamado

IDENTIFICATION DIVISION.
PROGRAM-ID. PROGSEC.

PROCEDURE DIVISION USING WS-VALOR.
    ADD 10 TO WS-VALOR.
    GOBACK.

🔙 Com RETURNING

Usado quando o subprograma retorna um valor.

CALL 'SOMA' USING A, B RETURNING C.

No programa chamado:

PROCEDURE DIVISION USING A B RETURNING C.
    COMPUTE C = A + B
    GOBACK.

🚨 ON EXCEPTION e NOT ON EXCEPTION

Permite tratar erros durante a chamada do subprograma.

CALL 'EXTERNO' USING PARAMETRO
     ON EXCEPTION
        DISPLAY "ERRO AO CHAMAR PROGRAMA"
     NOT ON EXCEPTION
        DISPLAY "PROGRAMA CHAMADO COM SUCESSO".

✅ Boas práticas

  • Use CALL para modularizar tarefas complexas.

  • Descreva os parâmetros em LINKAGE SECTION no programa chamado.

  • Sempre termine o subprograma com GOBACK ou EXIT PROGRAM.

  • Evite CALL com nomes literais fixos quando possível. Prefira variáveis (identifier-1) com nome de programa dinâmico, se necessário.