我遇到了使用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解决方案。
答案 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的回答并且缺少非标量参数,但我认为它可能没有。