Yii2带游标的Oracle过程

时间:2015-11-20 03:56:33

标签: php oracle stored-procedures pdo yii

我有一个 Oracle 存储过程,它有一个IN OUT游标参数。

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 Oracle 11g

2 个答案:

答案 0 :(得分:1)

你似乎在调用带有四个参数的SP

 CALL SP_GET_RATES(:1,:2,:3,:4)

但是您只传递了三个,或者您使用了错误的类型

 $params = array(            
    ':1' => '20-Nov-2015',
    ':2' => '21-Nov-2015',
    ':3' => 'USD'                 
);

答案 1 :(得分:0)

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