Yii2 带有游标的 Oracle 过程
Posted
技术标签:
【中文标题】Yii2 带有游标的 Oracle 过程【英文标题】:Yii2 Oracle procedure with cursor 【发布时间】:2016-02-22 11:18:20 【问题描述】:我有一个具有 IN OUT 游标参数的 Oracle 存储过程。
SP_GET_RATES
(
M_CHECKIN_DATE VARCHAR2,
M_CHECKOUT_DATE VARCHAR2,
M_CURRENCY VARCHAR2,
M_RESULT IN OUT SASIAPLSQLTAB.SEARCH_RESULT_CURSOR
)
在 Yii2 中我尝试使用这种方法来获取程序结果。
$params = array(
':1' => '20-Nov-2015',
':2' => '21-Nov-2015',
':3' => 'USD'
);
$stmt = $connection->createCommand("CALL SP_GET_RATES(:1,:2,:3,:4)", $params);
$stmt->bindParam(':4', $return_cursor,\PDO::PARAM_STR|\PDO::PARAM_INPUT_OUTPUT,4000);
$stmt->queryAll();
但是当我执行这个时,我得到了错误。
SQLSTATE[HY000]: General error: 6553 OCIStmtExecute: ORA-06553: PLS-306: wrong number or types of arguments in call to 'SP_GET_RATES'
(ext\pdo_oci\oci_statement.c:148)
The SQL being executed was: CALL SP_GET_RATES('20-Nov-2015','21-Nov-2015','USD',NULL)
我尝试了不同的方法来绑定值,但我仍然无法弄清楚如何在 Yii2 中绑定 IN OUT 游标参数。并且我认为 Yii2 使用 PDO OCI 连接 oracle 数据库。
Yii 2.0.6 php 5.5.24 甲骨文11g
【问题讨论】:
【参考方案1】:您似乎正在调用带有四个参数的 SP
CALL SP_GET_RATES(:1,:2,:3,:4)
但是你只传递了三个,或者你使用了错误的值类型
$params = array(
':1' => '20-Nov-2015',
':2' => '21-Nov-2015',
':3' => 'USD'
);
【讨论】:
没有。我将第四个参数添加为 bindParam $stmt->bindParam(':4', $return_cursor,\PDO::PARAM_STR|\PDO::PARAM_INPUT_OUTPUT,4000);【参考方案2】:PDO::oci 不支持 REF CURSORS。参考:http://php.net/manual/en/ref.pdo-oci.php
但是对于 Yii,有一个解决方法是使用支持游标的 oci8,并且受到 Yii 的良好支持。
Yii 有 oci8 扩展。与 pdo_oci 相比,这使得使用 oci8 更容易并且在性能方面更好。参考:http://www.yiiframework.com/extension/oci8pdo
【讨论】:
以上是关于Yii2 带有游标的 Oracle 过程的主要内容,如果未能解决你的问题,请参考以下文章
在SQL窗口里,不是在语言的程序中,怎么调用oracle带有out型游标参数的过程.
如何通过 SQL Developer 执行带有游标和表 OUT 参数的存储过程?