IEl*_*ite 0 sql delphi oracle delphi-7
我得到一个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数据库时,它崩溃,上面的错误.
Rob*_*ijk 10
让我们检查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.
问候,
Rob.