php中Oracle的程序与PDO
Posted
技术标签:
【中文标题】php中Oracle的程序与PDO【英文标题】:Procedures of Oracle in php with PDO 【发布时间】:2011-12-28 14:32:32 【问题描述】:我在使用 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: 线 1, 列 7: PLS-00306:调用“SP_LOGIN”的错误参数的数量或类型
我做错了什么?
提前致谢。
P.S:我在 Propel 论坛上问了这个问题,他们指导我搜索 PDO 解决方案。
【问题讨论】:
【参考方案1】:我怀疑问题出在第一个参数上。你告诉 PDO 它是一个字符串 (PDO::PARAM_STR
) 但它实际上是 types.cursorType
。有一个user comment in the PHP manual 表明不支持引用游标。
不幸的是,用于 PDO 的 Oracle 驱动程序是实验性的并且(恕我直言)基本上被放弃了。
【讨论】:
非常感谢。我会得到另一种方法。【参考方案2】:检查是否正常并返回用户
否 - 根据原型它返回一个游标。 Cursors have no meaning outside PL/SQL。如果您将类型更改为 sys_refcursor 并将 $result_arr 显式初始化为数组,我希望它有更好的工作机会。
虽然查看 Alvaro 的答案并且没有非标量参数类型,但我认为它可能不会。
【讨论】:
以上是关于php中Oracle的程序与PDO的主要内容,如果未能解决你的问题,请参考以下文章
php: 加载 oracle 驱动程序给出错误“无法加载动态库 - 找不到指定的过程。”