请帮助解决“ORA-00907:缺少右括号”错误

Posted

技术标签:

【中文标题】请帮助解决“ORA-00907:缺少右括号”错误【英文标题】:Help with "ORA-00907: missing right parenthesis" error please 【发布时间】:2011-04-27 12:29:06 【问题描述】:

我收到 ORA-00907:以下代码中缺少右括号

 dbQuery:= TQuery.Create(nil);
 dbQuery.DatabaseName:= dbMain.DatabaseName;
 with dbQuery do
 begin
   SQL.Add('select payee_address_zip, EXTRACT(WEEKDAY FROM check_date) as DOW, ');
   SQL.Add('(cmcl_bank_cleared - check_date) as DateDiff from AP_Master ');
   SQL.Add('where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=:DaysParam)');
   SQL.Add('order by payee_address_zip, DOW, DateDiff');
  try
   ParamByName('DaysParam').AsInteger:= days_param_int;
   Open;
   //do something else here      
  except on E:EDatabaseError do
   begin
    raise ECustomException.create('Error opening query for step 1 of computing Float Factors!');
   end;//except
  end; //try
 end; //with
 dbQuery.Free;

谁能告诉我这是怎么回事?我似乎看不到我遗漏了一个括号,并且这个 SQL 对 Interbase 测试数据库工作得很好。但是,当将其移动到客户端 oracle 数据库时,它会崩溃,并出现上述错误。

【问题讨论】:

在这种情况下,它总是可以帮助我打印出生成的 SQL 并在程序之外运行它。 这个问题仍然悬而未决....如果有人想给我这个问题的 DELPHI 答案,请......谢谢 没有 Delphi 答案,这是一个 Oracle 错误...即使您键入以下内容,您也会得到相同的错误: select extract(weekday from sysdate) from dual;正是这种语法触发了 Oracle 错误。您必须将查询重写为 Oracle 查询,而不是 Interbase 查询。 【参考方案1】:

让我们检查一下 SQL*Plus,这样您就可以准确地看到解析器在哪个位置需要右括号:

SQL> create table ap_master(payee_address_zip,check_date,cmcl_bank_cleared)
  2  as
  3  select 1,sysdate,sysdate+1 from dual
  4  /

Table created.

SQL> var DaysParam number
SQL> exec :DaysParam := 1

PL/SQL procedure successfully completed.

SQL> select payee_address_zip
  2       , EXTRACT(WEEKDAY FROM check_date) as DOW
  3       , (cmcl_bank_cleared - check_date) as DateDiff
  4    from AP_Master
  5   where (cmcl_bank_cleared is not null)
  6     AND ((cmcl_bank_cleared - check_date) >=:DaysParam)order by payee_address_zip, DOW, DateDiff
  7  /
     , EXTRACT(WEEKDAY FROM check_date) as DOW
                       *
ERROR at line 2:
ORA-00907: missing right parenthesis

所以你的 EXTRACT 函数有一些东西。这是关于 EXTRACT (datetime) 函数的相关文档:

http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/functions059.htm#sthref1117

它没有提及您的 WEEKDAY 关键字。不过,您可以使用 TO_CHAR 函数获取工作日。我不知道您到底想要哪种日期格式元素。我猜是“D”或“DAY”。你可以在这里查看它们:

http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/sql_elements004.htm#CDEHIFJA

如果您更改 EXTRACT 表达式并将其替换为 TO_CHAR,它将起作用:

SQL> select payee_address_zip
  2       , to_char(check_date,'d') as DOW
  3       , (cmcl_bank_cleared - check_date) as DateDiff
  4    from AP_Master
  5   where (cmcl_bank_cleared is not null)
  6     AND ((cmcl_bank_cleared - check_date) >=:DaysParam)order by payee_address_zip, DOW, DateDiff
  7  /

PAYEE_ADDRESS_ZIP D   DATEDIFF
----------------- - ----------
                1 4          1

1 row selected.

问候, 抢。

【讨论】:

我收到与我在原始帖子中所述相同的错误。即使将函数从 Extract 更改为 to_char。 SQL.Add('select payee_address_zip, to_char(check_date, ' + 'd' + ') as DOW, '); 因为您再次缺少右括号,即您没有引用日期格式元素。我不确定delphi,但您可能需要使用 SQL.Add('select payee_address_zip, to_char(check_date, ''d'') as DOW, '),您会看到两个单引号,而不是单个双引号引用。当然:-) 我做了一个字符串的串联 - 字符串 + 字符串 + 字符串 您需要引用您的日期格式元素,因此查询变为 "... to_char(check_date,'d') ..." 而不是 "... to_char(check_date,d) 。 ……”。虽然这不会引发右括号错误,但会引发 ORA-00904: "D": invalid identifier。无论如何,使用我向您展示的相同技术。【参考方案2】:

您似乎在这一行的末尾缺少一个空格:

SQL.Add('where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=:DaysParam)');

【讨论】:

不是这样的。 SQL.Add() 添加新的文本行(带有行终止符,通常是 CR),因此末尾的空格无关紧要。 啊,我不知道 SQL.Add() 的功能,所以我只是猜测(我想我应该提到这一点)。 在 Delphi 中,TQuery.SQLTStringList,因此它具有该类的所有功能。 你说我少了一个空格,但你没有指出在哪里?在末尾?不知道你的意思是什么 It looks like you're missing a space on the *end of this line*: 我确实指出了这一点,但根据 Ken 的说法,这并不重要,因为SQL.Add() 会自动插入行终止符!

以上是关于请帮助解决“ORA-00907:缺少右括号”错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00907: 缺少右括号 -- 奇怪

SQL 错误:ORA-00907:缺少右括号 00907。00000 -“缺少右括号”

ORA-00907: SQL 中的自然连接缺少右括号

ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号” *原因:*操作:行错误:44 列:30

错误:ORA-00907:oracle 缺少右括号

Oracle Live SQL:ORA-00907:缺少右括号 -