获取数据库实例

时间:2016-05-05 15:10:10

标签: php yii2

在Yii2中执行此代码的正确方法是什么。我得到oci_new_cursor() expects parameter 1 to be resource, object given

// get DB instance
$connection = Yii::$app->db;
// set cursor
$refcur = oci_new_cursor($connection);

$q = "BEGIN :RC := REPORT_CARDS.GET_DATA(:I_YEAR); END;";
...

1 个答案:

答案 0 :(得分:1)

要记住一些重要事实:

  1. Yii uses PDO
  2. PDO和OCI8为completely different extensions,您无法混合使用
  3. Oracle数据库的PDO驱动程序(PDO_OCI)有局限性;例如,似乎cursors aren't really supported及其用途一般为not really recommended
  4. 您可以使用\Yii::$app->db->pdo获取Yii使用的PDO实例,但是根据上面的第2点,这对您尝试在示例中使用的OCI8函数没有帮助。根据第3点,将资源用于学习使用PDO来代替OCI8似乎并不是一个好主意。

    尽管如此,如果你想为那些仍然可以解决的问题提供另一种“Yii方式”,你可以试着看看yii\db\Command到底有多远。您在评论中引用的oci_bind_by_name()的PDO副本PDOStatement::bindParam基本上由yii\db\Command::bindParam代理。因此,定制SQL查询的一个非常基本的用法示例就像是

    // $var1 and $var2 somewhere
    $command = \Yii::$app->db->createCommand('some query with :bound :values');
    $command->bindParam(':bound', $var1, \PDO::PARAM_STR);
    $command->bindParam(':values', $var2, \PDO::PARAM_STR || \PDO::PARAM_INPUT_OUTPUT); 
    $command->execute();   
    

    我无法用你的具体例子进行测试,根据我所读到的内容,如果你自己尝试,我不能保证成功,但我祝你好运。如果它没有成功,那么我看不到一个简单的方法;您只需使用自己的单独连接,手动初始化为oci_connect或其他任何连接,然后通过OCI8照常操作。