Access oracle with open cobol

1: Code procobdemo.pco

      *****************************************************************
      * Sample Program 2:  Cursor Operations                          *
      *                                                               *
      * This program logs on to ORACLE, declares and opens a cursor,  *
      * fetches the names, salaries, and commissions of all           *
      * salespeople, displays the results, then closes the cursor.    *
      *****************************************************************

       IDENTIFICATION DIVISION.
       PROGRAM-ID. CURSOR-OPS.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.

           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01  USERNAME          PIC X(10) VARYING.
       01  PASSWD            PIC X(10) VARYING.
       01  SID            PIC X(10) VARYING.
       01  EMP-REC-VARS.
           05  EMP-NAME      PIC X(10) VARYING.
           05  SALARY        PIC S9(6)V99
                             DISPLAY SIGN LEADING SEPARATE.
           05  COMMISSION    PIC S9(6)V99
                             DISPLAY SIGN LEADING SEPARATE.
           EXEC SQL VAR SALARY IS DISPLAY(8,2) END-EXEC.
           EXEC SQL VAR COMMISSION IS DISPLAY(8,2) END-EXEC.
           EXEC SQL END DECLARE SECTION END-EXEC.

           EXEC SQL INCLUDE SQLCA END-EXEC.

       01  DISPLAY-VARIABLES.
           05  D-EMP-NAME    PIC X(10).
           05  D-SALARY      PIC Z(4)9.99.
           05  D-COMMISSION  PIC Z(4)9.99.

       PROCEDURE DIVISION.

       BEGIN-PGM.
           EXEC SQL WHENEVER SQLERROR
               DO PERFORM SQL-ERROR END-EXEC.
           PERFORM LOGON.
           EXEC SQL DECLARE SALESPEOPLE CURSOR FOR
               SELECT ENAME, SAL, COMM
               FROM EMP
               WHERE JOB LIKE 'SALES%'
           END-EXEC.
           EXEC SQL OPEN SALESPEOPLE END-EXEC.
           DISPLAY " ".
           DISPLAY "SALESPERSON  SALARY      COMMISSION".
           DISPLAY "-----------  ----------  ----------".

       FETCH-LOOP.
           EXEC SQL WHENEVER NOT FOUND
               DO PERFORM SIGN-OFF END-EXEC.
           EXEC SQL FETCH SALESPEOPLE
               INTO :EMP-NAME, :SALARY, :COMMISSION
           END-EXEC.
           MOVE EMP-NAME-ARR TO D-EMP-NAME.
           MOVE SALARY TO D-SALARY.
           MOVE COMMISSION TO D-COMMISSION.
           DISPLAY D-EMP-NAME, "     ", D-SALARY, "    ", D-COMMISSION.
           MOVE SPACES TO EMP-NAME-ARR.
           GO TO FETCH-LOOP.

       LOGON.
           MOVE "scott" TO USERNAME-ARR.
           MOVE 5 TO USERNAME-LEN.
           MOVE "tiger" TO PASSWD-ARR.
           MOVE 5 TO PASSWD-LEN.
           MOVE "XE" TO SID-ARR.
           MOVE 2 TO SID-LEN.
           EXEC SQL
               CONNECT :USERNAME IDENTIFIED BY :PASSWD USING :SID
           END-EXEC.
           DISPLAY " ".
           DISPLAY "CONNECTED TO ORACLE AS USER:  ", USERNAME-ARR.

       SIGN-OFF.
           EXEC SQL CLOSE SALESPEOPLE END-EXEC. 
           DISPLAY " ".
           DISPLAY "HAVE A GOOD DAY.".
           DISPLAY " ".
           EXEC SQL COMMIT WORK RELEASE END-EXEC.
           STOP RUN.

       SQL-ERROR.
           EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
           DISPLAY " ".
           DISPLAY "ORACLE ERROR DETECTED:".
           DISPLAY " ".
           DISPLAY SQLERRMC.
           EXEC SQL ROLLBACK WORK RELEASE END-EXEC.
           STOP RUN.

Taken from the example program, make the following modifications:

       The uppercase password is not acceptable here to tiger

       The variable SID is added to store the service name, which is followed by USING when executing the connection

           EXEC SQL
               CONNECT :USERNAME IDENTIFIED BY :PASSWD USING :SID
           END-EXEC.

My environment is instantclient client which connects to oracle service in docker container. Here the service is named XE.

How to configure see: Docker install oracle and mysql under unbuntu

2: compile

I didn't use the official makefile---demo_procob_ic.mk (this is a pit, delete my instantclient dynamic link library)

Compile by hand here:

$ procob  iname=procobdemo.pco

Pro*COBOL: Release 11.2.0.4.0 - Production on 星期二 5月 8 23:20:10 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

系统默认选项值取自于:  /opt/ora11g/instantclient_11_2/precomp/admin/pcbcfg.cfg

$ cobc -x -o procobdemo  procobdemo.cob -L/opt/ora11g/instantclient_11_2/lib /opt/ora11g/instantclient_11_2/cobsqlintf.o -lpthread -lclntsh
$ ./procobdemo 
 
CONNECTED TO ORACLE AS USER:  scott     
 
SALESPERSON  SALARY      COMMISSION
-----------  ----------  ----------
ALLEN           1600.00      300.00
WARD            1250.00      500.00
MARTIN          1250.00     1400.00
TURNER          1500.00        0.00
 
HAVE A GOOD DAY.
 

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325978810&siteId=291194637