获取数据库实例


Get DB Instance

在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. Yii使用PDO
  2. PDO和OCI8是完全不同的扩展,不能混用
  3. Oracle数据库的PDO驱动程序(PDO_OCI)具有局限性;例如,似乎并不真正支持游标,通常也不建议使用游标
    • 另请参阅此尝试与PDO一起使用光标的示例

您可以使用'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照常操作。