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 驱动程序给出错误“无法加载动态库 - 找不到指定的过程。”

如何从 PHP 代码调用复杂的 Oracle 过程

将表情符号从 php Web 应用程序传递到 Oracle db 和 mysql

让 Oracle 的 MD5 与 PHP 的 MD5 匹配

Oracle全局临时表/PHP交互题

跟随我在oracle学习php(32)