1:代码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.
取自例子程序,做出如下修改:
密码大写是不行的这里改为tiger
加了变量SID用来存放服务名,在执行连接时候跟在USING后
EXEC SQL
CONNECT :USERNAME IDENTIFIED BY :PASSWD USING :SID
END-EXEC.
我的环境是instantclient客户端,连接docker容器中的oracle服务.这里服务名为XE.
怎么配置见:unbuntu下Docker安装oracle和mysql
2:编译
没有用官方的makefile---demo_procob_ic.mk(这个比较坑,把我的instantclient动态链接库删光光)
这里手工自己编译:
$ 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.