请帮助解决“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.SQL
是 TStringList
,因此它具有该类的所有功能。
你说我少了一个空格,但你没有指出在哪里?在末尾?不知道你的意思是什么
It looks like you're missing a space on the *end of this line*:
我确实指出了这一点,但根据 Ken 的说法,这并不重要,因为SQL.Add()
会自动插入行终止符!以上是关于请帮助解决“ORA-00907:缺少右括号”错误的主要内容,如果未能解决你的问题,请参考以下文章
SQL 错误:ORA-00907:缺少右括号 00907。00000 -“缺少右括号”