COBOL - Subrutinas

La subrutina Cobol es un programa que se puede compilar de forma independiente pero no se puede ejecutar de forma independiente. Hay dos tipos de subrutinas:internal subroutines me gusta Perform declaraciones y external subrutinas como el verbo CALL.

Verbo de llamada

El verbo de llamada se utiliza para transferir el control de un programa a otro. El programa que contiene el verbo CALL es elCalling Program y el programa que se llama se conoce como Called Program. La ejecución del programa llamado se detendrá hasta que el programa llamado finalice la ejecución. La instrucción Salir del programa se utiliza en el programa Llamado para transferir el control de vuelta.

Restricciones del programa llamado

Los siguientes son los requisitos del programa llamado:

  • Linkage sectiondebe estar definido en el programa llamado. Consiste en elementos de datos pasados ​​en el programa. Los elementos de datos no deben tener cláusula de valor. La cláusula PIC debe ser compatible con las variables pasadas a través del programa de llamada.

  • Procedure division using tiene una lista de variables pasadas desde el programa de llamada y el orden debe ser el mismo que se menciona en el verbo de llamada.

  • Exit programLa sentencia se utiliza en el programa llamado para transferir el control de vuelta. Debe ser la última sentencia del programa llamado.

Los parámetros se pueden pasar entre programas de dos formas:

  • Por referencia
  • Por contenido

Llamar por referencia

Si se modifican los valores de las variables en el programa llamado, entonces sus nuevos valores se reflejarán en el programa de llamada. SiBY no se especifica una cláusula, entonces las variables siempre se pasan por referencia.

Sintaxis

A continuación se muestra la sintaxis de llamar a la subrutina por referencia:

CALL sub-prog-name USING variable-1, variable-2.

Example

El siguiente ejemplo es el programa de llamada MAIN y UTIL es el programa llamado -

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
   CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

Programa llamado

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

In Called Program
Student Id : 1111
Student Name : Tim

Llamar por contenido

Si se modifican los valores de las variables en el programa llamado, entonces sus nuevos valores no se reflejarán en el programa de llamada.

Sintaxis

A continuación se muestra la sintaxis de llamar a la subrutina por contenido:

CALL sub-prog-name USING 
BY CONTENT variable-1, BY CONTENT variable-2.

Example

El siguiente ejemplo es el programa de llamada MAIN y UTIL es el programa llamado -

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
   CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

Programa llamado

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL para ejecutar el programa COBOL anterior -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN

Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:

In Called Program
Student Id : 1000
Student Name : Tim

Tipos de llamada

Hay dos tipos de llamadas:

  • Static Callocurre cuando un programa se compila con la opción del compilador NODYNAM. Un programa llamado estático se carga en el almacenamiento durante la compilación.

  • Dynamic Callocurre cuando un programa se compila con la opción del compilador DYNAM y NODLL. Un programa llamado dinámico se carga en el almacenamiento en tiempo de ejecución.