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
ouEXIT PROGRAM
. -
Evite
CALL
com nomes literais fixos quando possível. Prefira variáveis (identifier-1
) com nome de programa dinâmico, se necessário.