COBOL与数据库?

Vicoman 2004-05-07 11:12:05
cobol怎么跟数据库联系?比如Oracle?
...全文
449 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangzhidong2002 2004-06-18
  • 打赏
  • 举报
回复
给你个例子,想也需能给你帮助。

*****************************************************************
* Sample Program 1: Simple Query *
* *
* This program logs on to ORACLE, prompts the user for an *
* employee number, queries the database for the employee's *
* name, salary, and commission, then displays the result. *
* The program terminates when the user enters a 0. *
*****************************************************************


IDENTIFICATION DIVISION.
PROGRAM-ID. QUERY.
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 EMP-REC-VARS.
05 EMP-NAME PIC X(10) VARYING.
05 EMP-NUMBER PIC S9(4) COMP VALUE ZERO.
05 SALARY PIC S9(5)V99 COMP-3 VALUE ZERO.
05 COMMISSION PIC S9(5)V99 COMP-3 VALUE ZERO.
05 COMM-IND PIC S9(4) COMP VALUE ZERO.
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.
05 D-EMP-NUMBER PIC 9(4).

01 D-TOTAL-QUERIED PIC 9(4) VALUE ZERO.

PROCEDURE DIVISION.
BEGIN-PGM.
EXEC SQL WHENEVER SQLERROR
DO PERFORM SQL-ERROR END-EXEC.

PERFORM LOGON.

QUERY-LOOP.
DISPLAY " ".
DISPLAY "ENTER EMP NUMBER (0 TO QUIT): "
WITH NO ADVANCING.

ACCEPT D-EMP-NUMBER FROM CONSOLE.

MOVE D-EMP-NUMBER TO EMP-NUMBER.
IF (EMP-NUMBER = 0)
PERFORM SIGN-OFF.
MOVE SPACES TO EMP-NAME-ARR.
EXEC SQL WHENEVER NOT FOUND GOTO NO-EMP END-EXEC.
EXEC SQL SELECT ENAME, SAL, COMM
INTO :EMP-NAME, :SALARY, :COMMISSION:COMM-IND
FROM EMP
WHERE EMPNO = :EMP-NUMBER
END-EXEC.
PERFORM DISPLAY-INFO.
ADD 1 TO D-TOTAL-QUERIED.
GO TO QUERY-LOOP.

NO-EMP.
DISPLAY "NOT A VALID EMPLOYEE NUMBER - TRY AGAIN.".
GO TO QUERY-LOOP.

LOGON.
MOVE "SCOTT" TO USERNAME-ARR.
MOVE 5 TO USERNAME-LEN.
MOVE "TIGER" TO PASSWD-ARR.
MOVE 5 TO PASSWD-LEN.
EXEC SQL
CONNECT :USERNAME IDENTIFIED BY :PASSWD
END-EXEC.
DISPLAY " ".
DISPLAY "CONNECTED TO ORACLE AS USER: ", USERNAME-ARR.

DISPLAY-INFO.
DISPLAY " ".
DISPLAY "EMPLOYEE SALARY COMMISSION".
DISPLAY "-------- ------ ----------".
MOVE EMP-NAME-ARR TO D-EMP-NAME.
MOVE SALARY TO D-SALARY.
IF COMM-IND = -1
DISPLAY D-EMP-NAME, D-SALARY, " NULL"
ELSE
MOVE COMMISSION TO D-COMMISSION
DISPLAY D-EMP-NAME, D-SALARY, " ", D-COMMISSION
END-IF.

SIGN-OFF.
DISPLAY " ".
DISPLAY "TOTAL NUMBER QUERIED WAS ",
D-TOTAL-QUERIED, ".".
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.
sparkle1 2004-06-17
  • 打赏
  • 举报
回复
001830 DISPLAY "Your username:" WITH NO ADVANCING.
001840 ACCEPT USERNAME FROM CONSOLE.

DISPLAY "Your password:" WITH NO ADVANCING.
ACCEPT PW FROM CONSOLE.

DISPLAY "Your dbname:" WITH NO ADVANCING.
ACCEPT DBNAME FROM CONSOLE.

EXEC SQL CONNECT :USERNAME IDENTIFIED BY :PW
USING :DBNAME
END-EXEC.
DISPLAY " ".
DISPLAY "CONNECTED TO ORACLE AS USER: " , USERNAME.
zhenzhen1 2004-06-08
  • 打赏
  • 举报
回复
同时要在编译环境中,引入oracle预编译的lib文件,
我的机子上的文件是在D:\oracle\ora81\precomp\lib\orasql9.lib

cobol85 和cobol97的编译环境不同, 所以引用lib文件的方式也不同
zhenzhen1 2004-06-08
  • 打赏
  • 举报
回复
cobol 连接oracle时, 先要对cob或pco 文件用oracle自带的procob进行预编译
然后才能使用。

在cobol97中, 要将sql中用到的变量全部在work-storage节中声明,并且要放在
EXEC SQL BEGIN DECLARE SECTION END-EXEC.

EXEC SQL END DECLARE SECTION END-EXEC.
两句之间。 同时 要引用
EXEC SQL INCLUDE SQLCA.COB END-EXEC.



WORKING-STORAGE SECTION.
000660*---------------------------------------------------------------*
000670* 儂僗僩曄悢掕媊僄儕傾 *
000680*---------------------------------------------------------------*
000690 EXEC SQL BEGIN DECLARE SECTION END-EXEC.
000700*
000710 01 倂俽亅儂僗僩曄悢.
000720 03 倂俽亅嬈柋娗棟俬俢 PIC X(08)
000730 VALUE "GYMKNRRC".
000740 03 倂俽亅僾儘僌儔儉俬俢 PIC X(08).
000750*
000760*--< 俷俼俙俠俴俤嫟捠曄悢 >
000770 EXEC SQL INCLUDE SQLCOM.CBL END-EXEC.
000780*
000790*--< 嬈柋娗棟僥乕僽儖 >
000800 EXEC SQL INCLUDE D70GYM.CBL END-EXEC.
000801*
000810*--< 慜庴忣曬僥乕僽儖>
000820 EXEC SQL INCLUDE M40MAB.CBL END-EXEC.
000821*
000830*--< 庢堷愭儅僗僞僥乕僽儖>
000840 EXEC SQL INCLUDE D01TRS.CBL END-EXEC.
000841*
000850*--< 惪媮愭儅僗僞僥乕僽儖>
000860 EXEC SQL INCLUDE D02SQS.CBL END-EXEC.
000861*
000862*--< 嵚尃忣曬僥乕僽儖>
000863 EXEC SQL INCLUDE M01SAJ.CBL END-EXEC.
000881*
000882 77 庡宊栺嬫暘柤徧 PIC N(30).
000883 77 屭媞嬫暘柤徧 PIC N(30).
000884*
000892*
000900 EXEC SQL END DECLARE SECTION END-EXEC.
000910*
000920*--< 俷俼俙俠俴俤 俽俻俴幚峴忣曬 >
000930 EXEC SQL INCLUDE SQLCA.COB END-EXEC.
Vicoman 2004-05-10
  • 打赏
  • 举报
回复
谢谢各位!
现在还有一些问题,因为是第一次接触COBOL,所以很多地方还不太明白:
1. EXEC SQL ...... END-EXEC 是COBOL里的么,有人说先要用PRO*COBOL进行预编译...
2. 费了九牛二虎之力,终于在oracle里找到了procob.exe(oracle 9),是不是就是那个预编
译工具?
3. 我的 procob 的 Include 项 没有内容

********************************************************************************

D:\>procob

Pro*COBOL: Release 9.2.0.1.0 - Production on 月 May 10 13:23:48 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

システムのデフォルト・オプション値: D:\oracle\ora92\precomp\admin\pcbcfg.cfg

オプション名 現在の設定値 説明
-------------------------------------------------------------------------------
asacc no 「Yes」の場合は、ASAキャリッジ制御を使用します。
assume_sqlcode no 「Yes」の場合は、SQLCODE変数が存在すると仮定しま
す。
auto_connect no 「Yes」の場合は、ops$アカウントへの自動接続が可
能です
close_on_commitno 「Yes」の場合、COMMIT時すべてのカーソルをクロー
ズします
comp5 yes COMP変数ではなくCOMP-5を生成します。
config default config ユーザー定義の構成ファイルを指定するために使用さ
れます。
date_format local 日付文字列書式
dbms native V7/V8互換モード
declare_sectionno DECLARE SECTIONが必須です。
define *なし* IFDEFで使用する記号を定義します。

  • dynamic oracle OracleまたはANSI動的SQL方法を指定します。
    end_of_fetch 1403 FETCH SQLCODE値の終わり
    eol_padding yes 行の終りから72列目に埋め込みます。
    errors yes 「Yes」の場合は、エラーを端末に表示します。

  • fips no 「Yes」の場合は、FIPSフラグ付けを実行します。
    format ansi 入力ファイル行のフォーマット <ansi/terminal>
    hold_cursor no 「Yes」の場合は、Oracleカーソルを保持します
  • (再割
    り当てしません)。

  • host cobol ホスト言語
    iname *なし* 入力ファイル名
    include *なし* EXEC SQL INCLUDEファイルのパス名

  • <font color=4>我机器这里的include为什么没有值?怎么给他负值呢?</font>
    ireclen 80 入力ファイルのレコード長
    litdelim quote COBOL文字列リテラルのデリミタ <quote/apost>
    lname *なし* リスト・ファイル名
    lreclen 132 リスト・ファイルのレコード長
    ltype long リスト型<long/short/none>

  • maxliteral 256 リテラル文字列の最大長

  • maxopencursors 10 カーソル・キャッシュ内のOracleカーソルの最大数

  • mode oracle ANSIの場合は、ANSI規格に準じます。<Oracle/ANSI、
    ISO/ANSI14またはISO14>
    nested yes 「Yes」の場合は、ネストされたプログラムがサポー
    トされます
  • (GLOBALが生成されます)
    nls_local no 「Yes」の場合は、Pro*COBOL以前のリリースのNCHAR
    方法を使用します
    oname *なし* 出力(生成したコード)ファイル名
    oraca no ORACA通信領域を使用します。

  • oreclen 80 出力ファイルのレコード長
    pagelen 66 リスト・ファイルのページ長
    picx charf PIC Xホスト変数のデータ型
    prefetch 1 カーソルのOPEN時に事前フェッチされる行数です。
  • [*
    ]
    release_cursor no 「Yes」の場合は、実行後にOracleカーソルをリリー
    スします。[*
    select_error yes 「Yes」の場合は、SELECTでFOUNDエラーを生成します

  • sqlcheck syntax SQLチェック・レベル <syntax、limited/semantics
    or full/none>

  • threads no 「Yes」の場合は、マルチスレッド・サポートが指定
    されます
    type_code oracle 動的SQLに対してOracleまたはANSIタイプのコードを
    使用します
    unsafe_null no 「Yes」の場合は、危険を伴うNULLフェッチが可能に
    なります
    userid *なし* Oracleユーザー名とパスワード
    varchar no 「Yes」の場合は、ユーザー定義のVARCHARグループ項
    目を受け入れます。
    xref yes 「Yes」の場合は、記号クロス・リファレンスを生成
    します。
  • [*

    "
  • "は、このオプションがEXEC ORACLE OPTIONで有効であることを示します。

    D:\>

    ********************************************************************************



Vicoman 2004-05-09
  • 打赏
  • 举报
回复
我找到了cobol85,可是在编译的时候下面的语句就不能通过
EXEC SQL
INCLUDE SQLCA
END-EXEC
请问是不是INCLUDE的路径设置?
101monster 2004-05-09
  • 打赏
  • 举报
回复
呵呵,UP!
rengang11 2004-05-09
  • 打赏
  • 举报
回复
不过,编译比较麻烦,我们在PC机上使用COBOL95,富士通的编译工具,老兄,祝你好运!
rengang11 2004-05-09
  • 打赏
  • 举报
回复
不是很麻烦。
******声明连接字段
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 USERNAME PIC X(15) VARYING.
01 PASSWD PIC X(15) VARYING.
01 DBNAME PIC X(15) VARYING.
*************连接部分
LOGON.
MOVE "nritest" TO USERNAME-ARR.
MOVE 7 TO USERNAME-LEN.
MOVE "nritest" TO PASSWD-ARR.
MOVE 7 TO PASSWD-LEN.
MOVE "ORA92S" TO DBNAME-ARR.
MOVE 6 TO DBNAME-LEN.
EXEC SQL CONNECT :USERNAME IDENTIFIED BY :PASSWD USING :DBNAME
END-EXEC.

在开始部分直接用 PERFORM LOGON.调用就可以了
cchpro 2004-05-08
  • 打赏
  • 举报
回复
>最后才编辑成CBL -> COL 才是执行的目的档。
说错了。
应该是,CBL -> COB 才对。

除非,你对 COB 档案资料结构了解。
COB 档 是Binrary 格式。
每个RM-COBOL 版本中,都有详细叙述它的Binrary 格式结构的。
知道Binrary 格式结构后,再去对应到Oracle 的资数据库资料,应该不难的。

因为,十几年前,就曾经用 CA-Clipper 去读取COBOL 的Binrary 格式结构,
转换成 DBF 数据库资料。
Oracle 的资数据库,我就没有接触过了。
因为,WINDOWS 流行MS-SQL 方式。Oracle 那么复杂不好学!

cchpro 2004-05-08
  • 打赏
  • 举报
回复
COBOL 是大型机器的商业语言。
以前在DOS 下,我有玩过喔。
ACU-85 COBOL、RM-COBOL。
这类的 COBOL 和是BASICE 一样,就像是直译语言。
最后才编辑成CBL -> COL 才是执行的目的档。

直到后来,MS 也出了一个COBOL50 版。
它就可以编译成为EXE 档的版本了。

其它;
好像就是没有For Windows 的版本。
曾经花过心血也学过COBOL,也卖过不少书籍学习,
最后在PC 上也派不上用场呀!
Vicoman 2004-05-07
  • 打赏
  • 举报
回复
pro*cobol是什么啊?Oracle里有么?哪里有?
klbt 2004-05-07
  • 打赏
  • 举报
回复
oracle没有,cobol是古老的语言,帮你up

3,424

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧