2012-05-02 19 views
1

我們在庫LMTLIB中創建了一個名爲ARTEST的AS400 RPGLE程序。在PHP/Zend Framework中調用SQL中的RPGLE程序

它有一個數字INOUT參數,只是返回2

$myVar = "1"; 

$db = Zend_Registry::get('config')->resources->multidb->as400; 

$abstractAdapter = new Zend_Db_Adapter_Db2($db); 

//Gives the message "Invalid bind-variable position 'myVar'" 
$sql = 'CALL QSYS.QCMDEXC(\'CALL LMTLIB.ARTEST PARM(?)\', 0000000026.00000)'; 

//Gives the message "Token PARM was not valid. Valid tokens: (INTO USING. SQLCODE=-104"  
$sql = 'CALL LMTLIB.ARTEST PARM(?)'; 

//Gives the message "ARTEST in LMTLIB type *N not found. SQLCODE=-204" 
$sql = 'CALL LMTLIB.ARTEST (?)'; 

$stmt = new Zend_Db_Statement_Db2($abstractAdapter, $sql); 

$stmt->bindParam('myVar', $myVar, 4, 1); 

$stmt->execute(); 

現在,我可以種-的理解,爲什麼第三個SQL語句會失敗,「未找到」的消息...因爲它不是一個表/文件,而是一個RPGLE程序。

令人煩惱的事情是,如果我刪除(?),並簡單地放入(1)... SQL調用看起來是成功的,並且RPGLE程序顯示它已被調用。但是,我無法看到程序的迴應是什麼。

在此先感謝您的幫助!

回答

2

通常,數據庫管理器使用CALL語句來調用存儲過程。當它這樣做時,它會查找一個存儲的proc,其參數簽名與CALL的簽名相匹配。

如果沒有存儲具有該名稱和簽名的進程,數據庫管理器會嘗試調用一個程序。再次,有一個參數匹配過程發生。

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/db2/rbafzmstcallsta.htm

我建議創建一個存儲過程,這樣你就可以得到正確匹配的參數。

+0

看起來就像它與Zend一起工作。只有一條建議:當我在db2/400上使用php和odbc時,我必須知道php_odbc不支持輸出參數。 – kratenko

0

IBM RPGLE可以通過web服務調用與Zend框架進行交互。

斯科特·克萊門特越過一些這here.

根據應用程序的基礎知識,這可能是與RPG代碼交互的最佳方式。 Webservices可以調用許多RPG程序和iSeries表,並返回一個結果集。 Zend會將其視爲與其他RESTful調用相同,可以由您的模型處理。