2011-11-14 39 views
3

我遇到了propel 1.6和oracle程序的問題。我將它張貼在PDO下,因爲我是Propel,只是爲了代表我對PDO的呼叫。在PDO中使用Oracle的步驟

基本程序得到用戶名和密碼,檢查是否爲 OK並返回用戶。 因此,它返回一個types.cursorType。

sql開始像這樣。

CREATE OR REPLACE 
PROCEDURE   "SP_LOGIN" (R_CURSOR OUT types.cursorType, UserId IN 
VARCHAR2, Password IN VARCHAR2) 

我的PHP的代碼是:

$con = Propel::getConnection(); 
$sql = 'BEGIN SP_LOGIN(:CURSOR, :0, :1); END;'; 
$stmt = $con->prepare($sql); 
$result_arr; 
$stmt->bindParam(":CURSOR", $result_arr, PDO::PARAM_STR || PDO::PARAM_INPUT_OUTPUT); 
$stmt->bindParam(":0", $username, PDO::PARAM_STR); 
$stmt->bindParam(":1", $password, PDO::PARAM_STR); 
$stmt->execute(); 
$result_arr = $stmt->fetchAll(); 

現在拋出類型的異常: {PDOException} SQLSTATE [HY000]:常規錯誤:6550 OCIStmtExecute: ORA-06550:拉利內阿1, columna 7: PLS-00306:調用'SP_LOGIN'的錯誤參數的數字或類型

我在做什麼錯?

在此先感謝。

P.S:我在Propel論壇上問這個問題,他們指示我去尋找PDO解決方案。

回答

3

我會懷疑問題是第一個參數。你告訴PDO它是一個字符串(PDO::PARAM_STR),但它實際上是types.cursorType。有一個user comment in the PHP manual表明ref遊標不受支持。

不幸的是,PDO的Oracle驅動程序是實驗性的,(恕我直言)基本上放棄了。

+0

非常感謝。我會得到另一種方法。 –

3

checks that is OK and return the user

否 - 根據原型返回一個遊標。 Cursors have no meaning outside PL/SQL。如果將類型更改爲sys_refcursor並將$ result_arr顯式初始化爲一個數組,我期望它有更好的工作機會。

雖然看着阿爾瓦羅的答案和缺乏非標量參數類型,我認爲它可能不會。