使用PDO的PHP中的Oracle程序

时间:2011-11-14 12:00:06

标签: php oracle pdo propel

我遇到了使用propel 1.6和oracle程序的问题。我在PDO下发布它是因为我只是代理我对PDO的调用。

基本上程序获取用户名和密码,检查是否  确定并返回用户。  因此,它返回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:línea1,columna 7:  PLS-00306:调用'SP_LOGIN'

的错误参数的数字或类型

我做错了什么?

提前致谢。

P.S:我在Propel论坛上问这个问题,他们指导我搜索PDO解决方案。

2 个答案:

答案 0 :(得分:3)

我怀疑问题是第一个参数。你告诉PDO它是一个字符串(PDO::PARAM_STR),但它实际上是types.cursorType。有一个user comment in the PHP manual表明不支持ref游标。

不幸的是,PDO的Oracle驱动程序是实验性的,(恕我直言)基本上已经放弃了。

答案 1 :(得分:3)

  

检查是否正常并返回用户

否 - 根据原型,它返回一个光标。 Cursors have no meaning outside PL/SQL。如果将类型更改为sys_refcursor并将$ result_arr显式初始化为数组,我希望它有更好的工作机会。

虽然看着Alvaro的回答并且缺少非标量参数,但我认为它可能没有。