【问题标题】:Yii2 Oracle procedure with cursorYii2 带有游标的 Oracle 过程
【发布时间】: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

【问题讨论】:

    标签: php oracle stored-procedures pdo yii


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2020-05-14
      • 2011-01-24
      相关资源
      最近更新 更多