2010-03-13 161 views
9

我開始學習COBOL。我有一些編寫處理SQL數據庫的程序的經驗,我想我很困惑COBOL如何存儲和檢索存儲在大型機中的數據。我知道它不像關係數據庫,但是我看到的每個示例程序都直接從命令行獲取數據,我知道這並不是真實世界的COBOL程序處理數據的方式。有人可以解釋或告訴我一個可以解釋它的好資源嗎?COBOL如何存儲和檢索數據?

回答

20

COBOL是另一種第三代計算機語言。它比大多數人略微年長一些,並不意味着它不完整(實際上它帶有相當多的包袱 - 但那是另一回事)。

與任何其他第三代語言一樣,COBOL以與在C程序中幾乎相同的方式操作數據文件。沒有什麼奇怪的,神祕的或神奇的。使用該語言的文件I/O功能打開,讀取,寫入和關閉文件。

各種機制用於形成實際文件和程序之間的鏈接。這裏的細節通常是特定於您正在使用的操作系統的。通常,COBOL實現通過邏輯文件名稱而不是實際名稱來嘗試將自己與操作環境隔離開來。當您編寫將移植到不同平臺的程序時(例如,在Windows平臺上的IDE中編寫和測試,然後在大型機上運行),此添加的間接性非常重要。

以下示例與IBM大型機環境相關。

在IBM大型機領域中,您會發現程序可以批處理或聯機(例如CICS)運行。我不會介紹如何在CICS下設置文件I/O(這是一個很長的故事)。用於處理文件的程序通常是批處理。下面是一個批處理程序如何工作的粗略說明:

  1. 批處理程序通過JCL運行。 JCL用於識別要運行的程序('EXEC'語句),並使用'DD'語句識別程序將引用哪些文件。 DD語句的功能是在實際文件和COBOL程序要引用文件時引用的名稱(這是前面提到的隔離機制)之間形成邏輯連接。例如,

    JCLDDNAM DD DSN='HLQ.MY.FILE'... 
    

    將在 'DD' 名稱 'JCLDDNAM' 關聯到一個名爲 'HLQ.MY.FILE' 的文件。這部分是依賴於平臺的,因此細節是針對操作環境的。

  2. 在您的COBOL程序的'FILE-CONTROL'部分,您將JCL中定義的'DD NAME'與您將在每個I/O語句中使用的名稱連接起來以引用該文件。這個連接是使用'SELECT'語句定義的。
    例如,

    SELECT MYFILE 
    ASSIGN JCLDDNAM 
    remainder of select 
    

    讓任何文件你「JCLDDNAM」你的「JCL」到「MYFILE」,你將在稍後COBOL I/O語句引用相關聯之間的連接。 SELECT聲明本身是ISO COBOL標準的一部分。然而,許多COBOL實現定義了一些非標準的擴展,以促進各種各樣的怪異到他們的文件子系統。

  3. 打開,讀,寫的「程序分流」的你程序中使用的名稱「MYFILE」作爲內關閉文件:

    OPEN MYFILE 
    READ MYFILE 
    CLOSE MYFILE 
    

上述被高度簡化,並有在COBOL中做到這一點的多種方式。理解完整的畫面需要一些實際的努力,時間和練習。上面說明的I/O語句是COBOL標準的一部分,但每個供應商都有自己的擴展。

IBM COBOL支持各種文件組織和訪問方法。您可以查看IBM Enterprise COBOL語言參考手冊here以獲取文件操作的語法和規則。然而,User Guide提供了許多用於讀取/寫入文件的很好示例(您將不得不挖掘一點 - 但它完全奠定了爲你而出)。

通過COBOL程序引用SQL數據庫的設置有所不同,但涉及在程序和數據庫子系統之間建立連接。在IBM世界中,這是通過JCL完成的,其他環境將使用不同的機制。

IBM COBOL使用預處理器或協處理器來集成數據庫訪問和數據交換。例如,下面的代碼會從DB2數據庫檢索一些數據:

MOVE 1234 TO PERSON-ID 
EXEC SQL 
    SELECT FIRST_NAME, LAST_NAME 
    INTO :FIRST-NAME, :LAST-NAME 
    FROM PERSON 
    WHERE PERSON_ID = :PERSON-ID 
END-EXEC 
DISPLAY PERSON-ID FIRST-NAME LAST-NAME 

EXEC SQLEND-EXEC之間的東西是一個非常簡單的SQL SELECT語句。以冒號開頭的名稱是COBOL主機變量,用於將數據傳遞給DB2或將其接收回來。如果您曾經編寫過數據庫訪問例程,那麼您應該看起來非常熟悉。這個link提供了一個簡單的介紹,將SQL語句合併到IBM Enterpirse COBOL程序中。

順便說一下,IBM Enterprise COBOL也能夠處理XML文檔。對IBM沉重的IBM很抱歉,但那是我最熟悉的環境。

希望這能讓你開始朝正確的方向發展。

+0

你幾乎擊中了頭部的男人。感謝您花時間寫這麼多! –

+0

@MC皇帝在進行編輯時,請在提供的框中註明理由。如果更改單詞,請確保您正確地執行此操作。 –

+0

@BillWoodger您可以在修訂歷史中輕鬆看到。 –

1

傳統的COBOL批處理環境使用cobol程序的「數據部分」直接聲明數據庫連接,然後在JCL中建立數據庫連接。由於COBOL早於SQL,這些會傾向於各種其他類型的數據庫,但很可能IBM使SQL與DB/2一起工作。我想你會從更接近這個東西的人那裏得到另一個答案。如果您查看可用於其他語言的SQL預處理器,您會發現這個想法 - 遊標將成爲本機數據類型,並將查詢結果傳遞給本機變量。

+0

啊。所以我的理解可能會略有偏差。 COBOL更多的是關於數據的操縱,而對於實際檢索數據並沒有多大作用。我問這個問題的主要原因是我今年夏天要去實習,而且我沒有在那裏做cobol,但那是他們用來處理他們的財務數據的,我很困惑你如何將數據轉化爲cobol處理。儘管謝謝你,我真的很喜歡你的回答! –

+0

@bmargulies:-1:假設IBM –

0

我工作過的所有IBM大型機商店都使用了與關係數據庫交談的COBOL。一般來說,這是IBM的DB2。請注意,DB2是一個運行在大型機上的關係數據庫。它也可以在Windows或Linux上運行。

二十年前,將數據輸入DB2大型機數據庫的主要方式是使用CICS。 CICS是「演示級」軟件,可與基於字符的數據輸入屏幕進行通信。考慮CICS是PHP還是ASP.NET的功能等價物。

今天還有很多選項可以將數據導入DB2。 CICS仍然是一種選擇,但您的「表示層」可以是PHP,ASP.NET,Win Forms,Java JSF,Powerbuilder。關鍵是您的開發平臺需要能夠使用DB2數據庫驅動程序。該平臺可以是Windows,Linux,也可能是其他平臺。

我的觀點是數據可以通過許多平臺的許多方式進入大型機DB2數據庫。 COBOL語言可能涉及數據輸入,報告,更改數據COBOL等。但它可能只是多層應用程序的一部分,可能是Windows,Web和大型機的一部分。如果您有更多關於您在實習中與您合作的應用程序的信息,我可以舉出具體的例子。

2

誰說你不能使用SQL從cobol應用程序中檢索數據,也許不花錢?

我曾經工作過的一家公司,就是這麼做的 - 用SQLite。公有領域庫的這個小寶石將SQL語句編譯爲字節碼,然後執行它們。

通過用處理Cobol文件的C庫的自定義接口替換SQLite的「後端」級別,可以在這種情況下從其他語言(如Python)查詢Cobol數據。它工作 - 在SQLite的限制當然,但它是穩定的,它似乎足夠關係,它甚至不需要數據庫服務器:-)

1

大型機Cobol使用嵌入式SQL(有點像SQLj),例如:

程序部門。

Exec SQL 
     Select col1, col2 
      from myTable 
     into :ws-col1, :ws-col2 
     where col0 = :col0 
    End-Exec 

在這種情況下,在工作存儲部分中定義了主變量ws-col0,ws-col1和ws-col2。數據庫接口管理將數據放在正確的位置。

實際上與分佈式的東西相比很容易。

+0

我也喜歡你的答案。我現在正在實習的地方現在使用cobol作爲他們的大型機資料,並且我已經將它與CICS一起公開,並將它們用於將數據連接到我們的java ee應用程序。 –

相關問題