Проблема совместимости запросов Oracle с версиями < 12

#sql #oracle #cx-oracle

#sql #Oracle #cx-oracle

Вопрос:

У меня есть приведенный ниже запрос Oracle SQL. Он отлично работает для версий > 12. Но для версий < 12 это выдает ошибку как SQL command not properly ended (КОД ОШИБКИ: ORA-00933).

Запрос:

 select
    LEAST(ROUND(SUM((BLOCKS*BLOCK_SIZE)/1024/1024/1024)),200) GB, 
    to_char(COMPLETION_TIME,'MM.DD.YYYY') COMPLETION_DATE 
from 
    v$archived_log 
where 
    trunc(COMPLETION_TIME,'DD') > sysdate - 30 
group by to_char(COMPLETION_TIME,'MM.DD.YYYY') 
order by SUM((BLOCKS*BLOCK_SIZE)/1024/1024/1024) DESC 
FETCH FIRST 1 ROWS ONLY
  

Что делает запрос: он извлекает максимальный размер архива за последние 30 дней вместе с датой, когда был достигнут максимальный размер архива.

Я запускаю этот запрос с помощью via Python, используя cx_Oracle.

Ответ №1:

 FETCH FIRST 1 ROWS ONLY 
  

не поддерживается в Oracle 11g и предыдущих версиях.

Вы можете использовать rownum подход

 select * from
(
    select
        LEAST(ROUND(SUM((BLOCKS*BLOCK_SIZE)/1024/1024/1024)),200) GB, 
        to_char(COMPLETION_TIME,'MM.DD.YYYY') COMPLETION_DATE 
    from 
        v$archived_log 
    where 
        trunc(COMPLETION_TIME,'DD') > sysdate - 30 
    group by to_char(COMPLETION_TIME,'MM.DD.YYYY') 
    order by SUM((BLOCKS*BLOCK_SIZE)/1024/1024/1024) DESC 
) t
where rownum < 2
  

Комментарии:

1. Для справки, это обсуждается в руководстве cx_Oracle cx-oracle.readthedocs.io/en/latest/user_guide /…