【问题标题】:ORA-00907 missing right parenthesis In Crystal - Works in Oracle DeveloperORA-00907 在 Crystal 中缺少右括号 - 在 Oracle Developer 中工作
【发布时间】:2015-02-24 14:55:03
【问题描述】:

我有一个查询问题,它在 Oracle Developer 中工作正常,将 {?Month} 替换为 '2015-01-01',但在 Crystal 中,当使用下面的查询时,它给了我错误 ORA-00907 missing right parenthesis。

参数

参数名称:月份

提示文字:输入月份

值类型:字符串(也试过日期)

默认值:2015-01-01 00:00:00AM

代码

SELECT /*+ ordered_predicates */
ACTIVE_SEPARATE.WO_NO, ACTIVE_SEPARATE.MCH_CODE,
(SELECT DISTINCT CASE WHEN MCH_CODE LIKE '%-%' THEN TRIM(SUBSTR(MCH_CODE, 0, INSTR(MCH_CODE, '-')-1)) ELSE MCH_CODE END FROM ACTIVE_SEPARATE ACTIVE_SEPARATE_SUB WHERE ACTIVE_SEPARATE.MCH_CODE = ACTIVE_SEPARATE_SUB.MCH_CODE) AS MCH_CODE_TRIM,
(SELECT DISTINCT CASE WHEN MCH_NAME LIKE '%-%' THEN TRIM(SUBSTR(MCH_NAME, 0, INSTR(MCH_NAME, '-')-1)) ELSE MCH_NAME END FROM EQUIPMENT_FUNCTIONAL WHERE ACTIVE_SEPARATE.MCH_CODE = EQUIPMENT_FUNCTIONAL.MCH_CODE) AS MCH_NAME_TRIM,
MCH_TYPE, ACTIVE_SEPARATE.REQUIRED_START_DATE, ACTIVE_SEPARATE.ERR_DESCR,
(24 * ((REAL_F_DATE) - (REQUIRED_START_DATE))) as BREAKDOWN_HOURS,
(100 - ((((last_day(to_date({?Month}, 'yyyy-mm-dd'))) -  trunc(to_date({?Month}, 'yyyy-mm-dd'), 'month'))*24) + 24) - (( (REAL_F_DATE) - (REQUIRED_START_DATE))* 24)) / ((24 * ((last_day(to_date({?Month}, 'yyyy-mm-dd'))) - trunc(to_date({?Month}, 'yyyy-mm-dd'), 'month'))) + 24) AS PERCENTAGE_AVAILABILITY
FROM ACTIVE_SEPARATE
RIGHT JOIN EQUIPMENT_FUNCTIONAL ON EQUIPMENT_FUNCTIONAL.MCH_CODE = (SELECT DISTINCT CASE WHEN MCH_CODE LIKE '%-%' THEN TRIM(SUBSTR(MCH_CODE, 0, INSTR(MCH_CODE, '-')-1)) ELSE MCH_CODE END FROM ACTIVE_SEPARATE ACTIVE_SEPARATE_SUB WHERE ACTIVE_SEPARATE.MCH_CODE = ACTIVE_SEPARATE_SUB.MCH_CODE)
WHERE ERR_CLASS = '001'
AND MCH_TYPE IS NOT NULL
AND ACTIVE_SEPARATE.REQUIRED_START_DATE BETWEEN
(trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month}))

UNION

SELECT /*+ ordered_predicates */
HISTORICAL_SEPARATE.WO_NO, HISTORICAL_SEPARATE.MCH_CODE,
case when (TRIM(SUBSTR(HISTORICAL_SEPARATE.MCH_CODE, 0, INSTR(HISTORICAL_SEPARATE.MCH_CODE, '-')-1))) is null then HISTORICAL_SEPARATE.MCH_CODE else(TRIM(SUBSTR(HISTORICAL_SEPARATE.MCH_CODE, 0, INSTR(HISTORICAL_SEPARATE.MCH_CODE, '-')-1))) end as MCH_CODE_TRIM,
case when (TRIM(SUBSTR(EQUIPMENT_FUNCTIONAL.MCH_NAME, 0, INSTR(EQUIPMENT_FUNCTIONAL.MCH_NAME, '-')-1))) is null then EQUIPMENT_FUNCTIONAL.MCH_NAME else(TRIM(SUBSTR(EQUIPMENT_FUNCTIONAL.MCH_NAME, 0, INSTR(EQUIPMENT_FUNCTIONAL.MCH_NAME, '-')-1))) end as MCH_NANME_TRIM,
MCH_TYPE,  HISTORICAL_SEPARATE.REQUIRED_START_DATE, HISTORICAL_SEPARATE.ERR_DESCR,
(24 * ((REAL_F_DATE) - (REQUIRED_START_DATE))) as BREAKDOWN_HOURS,
(100 - ((((last_day(to_date({?Month}, 'yyyy-mm-dd'))) -  trunc(to_date({?Month}, 'yyyy-mm-dd'), 'month'))*24) + 24) - (( (REAL_F_DATE) - (REQUIRED_START_DATE))* 24)) / ((24 * ((last_day(to_date({?Month}, 'yyyy-mm-dd'))) - trunc(to_date({?Month}, 'yyyy-mm-dd'), 'month'))) + 24) AS PERCENTAGE_AVAILABILITY
FROM HISTORICAL_SEPARATE
RIGHT JOIN EQUIPMENT_FUNCTIONAL ON EQUIPMENT_FUNCTIONAL.MCH_CODE = (SELECT DISTINCT CASE WHEN MCH_CODE LIKE '%-%' THEN TRIM(SUBSTR(MCH_CODE, 0, INSTR(MCH_CODE, '-')-1)) ELSE MCH_CODE END FROM HISTORICAL_SEPARATE HISTORICAL_SEPARATE_SUB WHERE HISTORICAL_SEPARATE.MCH_CODE = HISTORICAL_SEPARATE_SUB.MCH_CODE)
WHERE ERR_CLASS = '001'
AND MCH_TYPE IS NOT NULL
AND HISTORICAL_SEPARATE.REQUIRED_START_DATE BETWEEN
(trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month}))

【问题讨论】:

  • 您是否尝试将月份参数替换为实际的日期文字,看看会发生什么?
  • 您在哪里尝试查询?使用数据库还是使用水晶报表?
  • @OldProgrammer Yeh,如果我在水晶中使用“2015-01-01”而不是月份,它会起作用。
  • @Siva 正如我上面所说,它适用于 oracle 开发人员,但不适用于水晶

标签: sql oracle oracle11g crystal-reports oracle-sqldeveloper


【解决方案1】:

你的前提是错误的;它在 SQL Developer 中不起作用。如果您复制并粘贴查询并将{?Month} 替换为'2015-01-01',则会收到相同的ORA-00907 错误,报告在第14 行第1 列,即AND 本身。

这个:

BETWEEN
(trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month}))

括号在错误的位置 - 你试图做 between (x and y) 这不是正确的语法。应该是:

BETWEEN
trunc(to_date({?Month}, 'yyyy-mm-dd'),'month')
AND
last_day({?Month})

在联合的两半中。

(另外,可能相关的问题:Crystal Reports - Oracle 01861 Error。this 问题中的代码仍然不一致地处理参数 - 有时作为日期,有时作为字符串 - 所以它依赖于 NLS 设置按预期工作。)

【讨论】:

  • 这看起来很有希望,开发中的 NLS 设置已经改变了一些,也许这就是为什么它在开发中为我工作的原因。明天我会试试那个代码,让你知道
  • 您应该真的不要依赖 NLS 设置。尽可能使用实际日期,否则使用显式转换(在其中指定格式模型)。你在某些地方会这样做,所以你只需要坚持下去并保持一致。
猜你喜欢
  • 2018-05-23
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2020-06-14
  • 2019-08-10
  • 1970-01-01
相关资源
最近更新 更多