2014-01-16 54 views
1

我想在Select語句中用SQL UDF調用COBOL程序。如果您需要更多信息,請告訴我。在AS400上,如何使用結構化參數從SQL用戶定義函數調用COBOL程序?

COBOL數據結構:

01 WS-FOO. 
    03 WS-FOO-ID    PIC X(16). 
    03 WS-FOO-NAME    PIC X(16). 

COBOL代碼:

PROCEDURE DIVISION USING WS-FOO. 

SQL函數那不是工作:

CREATE FUNCTION ANTHONY.FOO (CHAR(16), CHAR(16)) 
RETURNS CHAR(16) 
EXTERNAL NAME FOO.FOO 
LANGUAGE COBOL 
NO SQL 
PARAMETER STYLE SQL; 
+0

跟着你的意思是你的COBOL程序是OPM COBOL/400,或者是ILE COBOL? – WarrenT

+0

我不確定。 COBOL程序在AS400上運行。源代碼中有兩行:「SOURCE-COMPUTER。IBM-AS400。 OBJECT-COMPUTER。IBM-AS400」。 –

+0

如果顯示程序信息['DSPPGM'],它會告訴你程序是OPM還是ILE。按照慣例,您通常也可以通過源成員類型爲CBL或CBLLE來進行說明。 – WarrenT

回答

4

您需要在信息中心閱讀有關參數樣式部分頁面上CREATE FUNCTION (external scalar)

如果您的UDF有兩個參數,您的COBOL程序將需要參數加上其他參數,如PARAMETER STYLE SQL所述。您可能更喜歡PARAMETER STYLE GENERAL的簡單參數列表。使用GENERAL,您可以將COBOL代碼編譯爲ILE服務程序。我將在這個例子中改變長度。

CREATE FUNCTION ANTHONY.FOO (BAR_ID CHAR(6), BAR_NAME CHAR(10)) 
    RETURNS CHAR(16) 
    EXTERNAL NAME 'MYLIB/MYSVCPGM(MYPROC)' 
    LANGUAGE COBOLLE PROGRAM TYPE SUB 
    NO SQL 
    PARAMETER STYLE GENERAL; 

在您的COBOL數據部聯繫科

01 LS-BAR-ID   CHAR(6). 
01 LS-BAR-NAME   CHAR(10). 
01 LS-BAR-RESULT  CHAR(16). 

通過

PROCEDURE DIVISION USING LS-BAR-ID, LS-BAR-NAME 
        RETURNING LS-BAR-RESULT. 
+0

這是否意味着無法在不修改COBOL程序的情況下從UDF調用該程序?我無法修改它。 –

+1

@Anthony一個普通的COBOL程序在程序之間的參數方面不像函數那樣運行(不需要返回)。對於一個功能,它是不同的。您需要更改COBOL程序,或者如果它不是作爲用戶定義的函數編寫的,則它不能用作用戶定義的函數。或者你需要做別的事情。 –

+0

@Anthony您可以使用SQL參數創建代理COBOL程序,並從中調用原始程序。 – jamesallman

相關問題