1
Error report:
ORA-00904: "RDD"."USED_END_DATE": invalid identifier
ORA-02063: preceding line from ADSWEBPROD
ORA-06512: at line 5

次のクエリは、無効な識別子エラーをスローします。

DECLARE
  TYPE demo_date_array_type IS TABLE OF dc_demo_dates.demo_date_id%TYPE;
  updated_demo_dates demo_date_array_type;
BEGIN
  SELECT ddd.demo_date_id 
  BULK COLLECT INTO
    updated_demo_dates
  FROM 
    dc_demo_dates ddd 
  JOIN 
    dc_demo_reservations ddr 
  ON 
    ddd.reservation_id = ddr.reservation_id
    AND ddr.status NOT IN ('DENIED','CANCELLED')
    AND ddr.demo_type <> 'Training'
    AND ddr.environment IS NOT NULL
    AND ddd.last_update_date > SYSTIMESTAMP - 1           -- updated in the last day
    AND ddd.demo_start_date > SYSTIMESTAMP - 14 -- no older than 2 weeks
  JOIN
    (SELECT demo_date_id, used_start_date, used_end_date 
     FROM rps_by_demo_date 
     GROUP BY demo_date_id, used_start_date, used_end_date ) rdd
    ON rdd.demo_date_id = ddd.demo_date_id
  WHERE
    ddd.demo_start_date != NVL(rdd.used_start_date, SYSTIMESTAMP)  -- either start date
    OR ddd.demo_end_date != NVL(rdd.used_end_date, SYSTIMESTAMP);  -- or end date has changed
END;

またはを削除したGROUP BY demo_date_id, used_start_date, used_end_date場合、またはの最後を変更した場合ORANDコードは正常に実行されます(必要な結果が得られない場合を除く)

何が起こっているのか知っていますか?ありがとうございました

編集:group by句をサブクエリからメインクエリに移動し、必要な結果を取得しました。しかし、私はまだエラーの原因を理解していません。

4

1 に答える 1

1

これを試して :-

DECLARE
  TYPE demo_date_array_type IS TABLE OF dc_demo_dates.demo_date_id%TYPE;
  updated_demo_dates demo_date_array_type;
BEGIN
  SELECT ddd.demo_date_id 
  BULK COLLECT INTO
    updated_demo_dates
  FROM 
    dc_demo_dates ddd 
  JOIN 
    dc_demo_reservations ddr 
  ON 
    ddd.reservation_id = ddr.reservation_id
    AND ddr.status NOT IN ('DENIED','CANCELLED')
    AND ddr.demo_type <> 'Training'
    AND ddr.environment IS NOT NULL
    AND ddd.last_update_date > SYSTIMESTAMP - 1           -- updated in the last day
    AND ddd.demo_start_date > SYSTIMESTAMP - 14 -- no older than 2 weeks
  JOIN
    (SELECT demo_date_id, used_start_date, used_end_date 
     FROM rps_by_demo_date 
     GROUP BY demo_date_id, used_start_date, used_end_date ) rdd
    ON rdd.demo_date_id = ddd.demo_date_id
    AND (ddd.demo_start_date != NVL(rdd.used_start_date, SYSTIMESTAMP)  
    OR ddd.demo_end_date != NVL(rdd.used_end_date, SYSTIMESTAMP));  
END;

where 句を結合条件に移動しました。結合操作で where 句を使用すると、予期しない結果になることがあります。where句がrddを認識していない可能性があります。ただし、結合条件によって認識される場合があります。

于 2013-02-23T01:53:32.933 に答える