Помогите с ошибкой "ORA-00907: отсутствует правая скобка" пожалуйста - PullRequest
0 голосов
/ 27 апреля 2011

Я получаю 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 Oracle происходит сбой с ошибкой выше.

Ответы [ 2 ]

10 голосов
/ 27 апреля 2011

Давайте проверим с помощью 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» или «ДЕНЬ».Вы можете посмотреть их здесь:

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.

С уважением,
Роб.

0 голосов
/ 27 апреля 2011

Похоже, вам не хватает пробела в конце этой строки:

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