首页 > 解决方案 > Yii2:Oracle (oci) 格式的子查询

问题描述

我目前有一个连接到 oracle 数据库的模型。它运行良好,我能够毫无问题地执行查询。

但是,以下情况会导致 oracle 数据库拒绝查询:

    $subquery = mytable::find()->where(['status'=>'success']);

    $mainQuery = new Query(); 
    $mainQuery->select([...])
    ->from(['subQ'=>$subquery])
    ->where(...

在上面的示例中,$subquery 运行良好(如果我自己运行它)但 Oracle 数据库拒绝了该组合

我认为问题在于“new Query()”调用的是 mysql 查询而不是 oci 查询。如何将 Query() 实例化为 oci 查询?

任何帮助表示赞赏。

例子

我创建了以下简单查询来演示该问题:

$subQuery = Study::find()->limit(10);
$mainQuery = new Query;
$mainQuery->select(["*"])->from(['subQ'=>$subQuery]);

Study 类被配置为调用 Oracle 数据库。

执行上述查询时,我从 Oracle db 收到以下消息:

SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user 'username'@'db.url' for table 'study'
The SQL being executed was: SELECT * FROM (SELECT * FROM `SCHEMA`.`STUDY` LIMIT 10) `subQ`

如果我单独执行 $subQuery ,一切都很好,并返回 10 条记录。我不是 Oracle 查询方面的专家,但在我看来,被拒绝的查询使用的是 MySQl 语法而不是 oracle 语法。这意味着新的 Query 类将覆盖 Study 查询。

如何强制新查询使用 oci 语法?

非常感谢

标签: yii2subqueryoracle-call-interface

解决方案


解决方案是指示 Query 连接到所需的数据库,如下所示:

$qry = new Query();
$qry-> // usual commands
$qry->all(Yii::$app->dbName);

这很好用。


推荐阅读