недопустимый SQL-запрос в жабе - PullRequest
0 голосов
/ 04 мая 2018

Ниже запрос получает меня

неверный SQL-оператор

в жабе

IF EXISTS (SELECT T_BASIS_ACCESS_ID FROM ECKERNEL_MCA.T_BASIS_ACCESS WHERE ROLE_ID LIKE 'MCA.GFS.LEAD') 
    BEGIN
       SELECT OBJECT_ID, NAME  FROM ECKERNEL_MCA.OV_AREA WHERE END_DATE IS NULL AND OBJECT_ID  IN
       (SELECT DISTINCT REPLACE(REPLACE(REPLACE(ATTRIBUTE_TEXT, '(', '' ),')',''), '''', '') 
       FROM ECKERNEL_MCA.T_BASIS_OBJECT_PARTITION WHERE T_BASIS_ACCESS_ID IN 
       (SELECT T_BASIS_ACCESS_ID FROM ECKERNEL_MCA.T_BASIS_ACCESS WHERE ROLE_ID LIKE 'MCA.GFS.LEAD') )
    END
ELSE
    BEGIN
       SELECT OBJECT_ID, NAME  FROM ECKERNEL_MCA.OV_AREA WHERE END_DATE IS NULL
    END    

1 Ответ

0 голосов
/ 05 мая 2018

Насколько я могу судить, этот код действительно недействителен. Тот, который следует, может скомпилироваться. Обратите внимание, что:

  • Я создал локальные переменные, которые будут содержать результат операторов SELECT. Они вам нужны в PL / SQL
  • Я пытался показать вам, что исключения должны обрабатываться. В «IF-THEN-ELSE» нет особой пользы, потому что - если первый SELECT (я назвал его «A») завершится неудачно, он не вернет NULL, но вызовет исключение NO_DATA_FOUND. Я не знаю ни ваших таблиц, ни данных, которые вы там храните, поэтому - возможно, этот код не содержит исключений, я не могу сказать.
  • Я не смог проверить это, так как у меня нет ваших таблиц, и я не хотел их создавать сам.

declare
  l_t_basis_access_id   eckernel_mca.t_basis_access.t_basis_access_id%type;
  l_object_id           eckernel_mca.ov_area.object_id%type;
  l_name                eckernel_mca.ov_area.name%type;
begin
  -- SELECT "A"
  select t_basis_access_id 
    into l_t_basis_access_id
    from eckernel_mca.t_basis_access
    where role_id like 'MCA.GFS.LEAD';

  -- SELECT "A" returned a single value - proceed with the next SELECT "B"

  -- SELECT "B"
  select object_id, name 
  into l_object_id,l_name
  from eckernel_mca.ov_area
  where end_date is null
    and object_id in (select distinct replace(replace(replace(attribute_text,'(',''),')',''),'''','')
                      from eckernel_mca.t_basis_object_partition
                      where t_basis_access_id in (select t_basis_access_id
                                                  from eckernel_mca.t_basis_access
                                                  where role_id like 'MCA.GFS.LEAD'
                                                 )
                     );
exception
  when no_data_found then
    -- SELECT "A" didn't return anything and raised no_data_found; but, SELECT "B" might 
    -- raise it as well
    select object_id, name 
    into l_object_id,l_name
    from eckernel_mca.ov_area
    where end_date is null;

  when too_many_rows then
    -- Any SELECT involved in this code could return it, so - handle it, if necessary
end;
...