【问题标题】:How do I solve this error: ORA-01741: illegal zero-length identifier如何解决此错误:ORA-01741:非法零长度标识符
【发布时间】:2020-11-08 23:22:29
【问题描述】:

我的架构中有一个视图列出了员工信息。

我想根据这两个字段计算 RETIRE_DATE:BIRTH_DATE 和 RETIRE_AGE。

使用RETIRE_DATE查询某个时期退休的员工。

运行查询给我一个错误

ORA-01741: 非法的零长度标识符

我认为这是因为我在查询中使用RETIRE_DATE 作为我的视图列。我该如何纠正这个问题?

这是我的代码:

    $start_period = strtotime("-100 week");
    $stop_period = strtotime("+100 week");

    $query = StaffEmploymentListView::find()
        ->SELECT([
          'PAYROLL_NO', 
          'BIRTH_DATE',
          'RETIRE_AGE',
          "ADD_MONTHS(BIRTH_DATE, RETIRE_AGE * 12) AS RETIRE_DATE"]);
    
    $query->andFilterWhere(['>=',$this->RETIRE_DATE, $start_period])
            ->andFilterWhere(['<=', $this->RETIRE_DATE, $stop_period])
            ->all();

我的表格如下所示:

【问题讨论】:

  • 您能否提供一个存储在该表中的数据示例?还有什么数据类型是 retire_age ?
  • 跟查询无关,跟引号有关
  • @RobertoHernandez 我附上了一张我的桌子的照片。 retire_age 的类型为 NUMBER(2,0)

标签: php sql oracle yii2 yii2-active-records


【解决方案1】:

以下是有关错误的一些信息:

ORA-01741: 非法的零长度标识符

原因:尝试使用两个双引号 ("") 作为标识符。标识符必须至少有一个字符长。

您的查询在引用元素的方式上存在问题。我使用 oci_connect 和 oci_execute 进行了测试,没有任何问题。

也许您需要将其重写如下,或者对所有元素使用相同的引号。在您的情况下,您使用 ' 引用了一些列,最后一部分使用 "

<?php
$conn = oci_connect("username","password","database");

$query = "SELECT
           PAYROLL_NO, 
           BIRTH_DATE,
           RETIRE_AGE,
           ADD_MONTHS(BIRTH_DATE, RETIRE_AGE * 12) AS RETIRE_DATE 
          FROM YOUR_TABLE_OR_VIEW";


$stmt = oci_parse($conn,$query);
oci_execute($stmt);
?>

【讨论】:

  • 我在查询中使用计算的 RETIRE_DATE 作为标识符。我的视图没有名为 RETIRE_DATE 的列。将上面的查询转换为原始 SQL,我得到: SELECT "PAYROLL_NO", "BIRTH_DATE", ADD_MONTHS(BIRTH_DATE, 70 * 12) AS RETIRE_DATE FROM "HRMIS"."STAFF_EMPLOYLIST_VIEW" WHERE ("" >= :qp0) AND ( ""
【解决方案2】:

问题出在你的这部分代码

$query->andFilterWhere(['>=',$this->RETIRE_DATE, $start_period])
    ->andFilterWhere(['<=', $this->RETIRE_DATE, $stop_period])
    ->all();

如果你这样说,$this-&gt;RETIRE_DATE 将被评估并使用RETIRE_DATE 属性的值。由于该属性为空,因此结果条件类似于"" &gt;= $start_period

您可能想要的条件类似于RETIRE_DATE &gt;= $start_period。为此,您需要将RETIRE_DATE 作为字符串传递给andFilterWhere,而不是传递RETIRE_DATE 属性的值。

$query->andFilterWhere(['>=', 'RETIRE_DATE', $start_period])
    ->andFilterWhere(['<=', 'RETIRE_DATE', $stop_period])
    ->all();

【讨论】:

  • 更改我的查询的那部分我收到此错误:ORA-00904 错误消息“无效标识符”。在我看来,没有名为 RETIRE_DATE 的列。这是上面 SELECT 查询中的计算值。
  • @rufusy 这可能是因为您不能在 where 子句中使用计算字段。在 mysql 中,您可以在有子句中使用它们,但我没有足够的 oracle 经验来说明在那里做的最好方法。如果您想尝试使用 having 子句,只需将 andFilterWhere 方法更改为 andFilterHaving
猜你喜欢
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2020-11-24
  • 1970-01-01
相关资源
最近更新 更多