COBOL procedures
COBOL procedures are to be written in a similar manner as COBOL subprograms.
- Handling parameters in a COBOL procedure
- Each parameter to be accepted or passed by a procedure must be
declared in the LINKAGE SECTION. For example, this code fragment comes
from a procedure that accepts two IN parameters (one CHAR(15) and
one INT), and passes an OUT parameter (an INT):
Ensure that the COBOL data types you declare map correctly to SQL data types. For a detailed list of data type mappings between SQL and COBOL, see "Supported SQL Data Types in COBOL".LINKAGE SECTION. 01 IN-SPERSON PIC X(15). 01 IN-SQTY PIC S9(9) USAGE COMP-5. 01 OUT-SALESSUM PIC S9(9) USAGE COMP-5.Each parameter must then be listed in the PROCEDURE DIVISION. The following example shows a PROCEDURE DIVISION that corresponds to the parameter definitions from the previous LINKAGE SECTION example.PROCEDURE DIVISION USING IN-SPERSON IN-SQTY OUT-SALESSUM. - Exiting a COBOL procedure
- To properly exit the procedure use the following commands:
With these commands, the procedure returns correctly to the client application. This is especially important when the procedure is called by a local COBOL client application.MOVE SQLZ-HOLD-PROC TO RETURN-CODE. GOBACK.
When building a COBOL procedure, it is strongly recommended that you use the build script written for your operating system and compiler. Build scripts for Micro Focus COBOL are found in the sqllib/samples/cobol_mf directory. Build scripts for IBM® COBOL are found in the sqllib/samples/cobol directory.
The following is an example of a COBOL procedure that accepts two
input parameters, and then returns an output parameter and a result
set:
IDENTIFICATION DIVISION.
PROGRAM-ID. "NEWSALE".
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INSERT-STMT.
05 FILLER PIC X(24) VALUE "INSERT INTO SALES (SALES".
05 FILLER PIC X(24) VALUE "_PERSON,SALES) VALUES ('".
05 SPERSON PIC X(16).
05 FILLER PIC X(2) VALUE "',".
05 SQTY PIC S9(9).
05 FILLER PIC X(1) VALUE ")".
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 INS-SMT-INF.
05 INS-STMT.
49 INS-LEN PIC S9(4) USAGE COMP.
49 INS-TEXT PIC X(100).
01 SALESSUM PIC S9(9) USAGE COMP-5.
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA END-EXEC.
LINKAGE SECTION.
01 IN-SPERSON PIC X(15).
01 IN-SQTY PIC S9(9) USAGE COMP-5.
01 OUT-SALESSUM PIC S9(9) USAGE COMP-5.
PROCEDURE DIVISION USING IN-SPERSON
IN-SQTY
OUT-SALESSUM.
MAINLINE.
MOVE 0 TO SQLCODE.
PERFORM INSERT-ROW.
IF SQLCODE IS NOT EQUAL TO 0
GOBACK
END-IF.
PERFORM SELECT-ROWS.
PERFORM GET-SUM.
GOBACK.
INSERT-ROW.
MOVE IN-SPERSON TO SPERSON.
MOVE IN-SQTY TO SQTY.
MOVE INSERT-STMT TO INS-TEXT.
MOVE LENGTH OF INSERT-STMT TO INS-LEN.
EXEC SQL EXECUTE IMMEDIATE :INS-STMT END-EXEC.
GET-SUM.
EXEC SQL
SELECT SUM(SALES) INTO :SALESSUM FROM SALES
END-EXEC.
MOVE SALESSUM TO OUT-SALESSUM.
SELECT-ROWS.
EXEC SQL
DECLARE CUR CURSOR WITH RETURN FOR SELECT * FROM SALES
END-EXEC.
IF SQLCODE = 0
EXEC SQL OPEN CUR END-EXEC
END-IF.The corresponding CREATE PROCEDURE statement for this procedure
is as follows:
CREATE PROCEDURE NEWSALE ( IN SALESPERSON CHAR(15),
IN SALESQTY INT,
OUT SALESSUM INT)
RESULT SETS 1
EXTERNAL NAME 'NEWSALE!NEWSALE'
FENCED
LANGUAGE COBOL
PARAMETER STYLE SQL
MODIFIES SQL DATA The preceding statement assumes that
the COBOL function exists in a library called NEWSALE.Note: When registering a COBOL procedure on Windows operating systems, take
the following precaution when identifying a stored procedure body
in the CREATE statement's EXTERNAL NAME clause. If you use an absolute
path id to identify the procedure body, you must append the .dll extension.
For example:
CREATE PROCEDURE NEWSALE ( IN SALESPERSON CHAR(15),
IN SALESQTY INT,
OUT SALESSUM INT)
RESULT SETS 1
EXTERNAL NAME 'NEWSALE!NEWSALE'
FENCED
LANGUAGE COBOL
PARAMETER STYLE SQL
MODIFIES SQL DATA
EXTERNAL NAME 'd:\mylib\NEWSALE.dll'