如何解决此错误:ORA-01741:非法零长度标识符

问题描述 投票:0回答:2

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

我想从这两个字段计算 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();

我的表格如下所示: enter image description here

php sql oracle-database yii2 yii2-active-records
2个回答
0
投票

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

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);
?>

0
投票

问题出在你的这部分代码

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

如果你这样说,则会评估

$this->RETIRE_DATE
并使用
RETIRE_DATE
属性的值。因为该属性为空,所以结果条件将类似于
"" >= $start_period

您想要的条件可能是这样的

RETIRE_DATE >= $start_period
。要实现此目的,您需要将
RETIRE_DATE
作为字符串传递到
andFilterWhere
,而不是传递
RETIRE_DATE
属性的值。

$query->andFilterWhere(['>=', 'RETIRE_DATE', $start_period])
    ->andFilterWhere(['<=', 'RETIRE_DATE', $stop_period])
    ->all();
© www.soinside.com 2019 - 2024. All rights reserved.