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型游标参数的过程.

如何使用c#执行返回多个游标的oracle存储过程

如何通过 SQL Developer 执行带有游标和表 OUT 参数的存储过程?

带有隐式游标的过程正在编译但未打印

mybatis调用存储过程 无参带有输入输出参数,输出游标类型的 存储

oracle存储过程返回游标,取值报错