Как получить N строк в операторе Oracle SQL SELECT с заданным номером по переменной?

В Oracle SQL у меня есть переменная, которая представляет собой количество строк для выборки, я могу использовать только оператор SQL SELECT, поэтому нет блока PL/SQL.

Если переменная имеет установленное значение, я должен получить количество строк в переменной, если нет, то получить как можно больше строк (бесконечно).

Я старался:

select * from system_options
THEN FETCH FIRST
    CASE :lim
        THEN :lim
        ELSE 9999
    END
ROWS ONLY

Это дает мне ORA-00933: SQL command not properly ended.

Другим вариантом было бы не устанавливать переменную, а затем не иметь оператора THEN FETCH.


person user5507535    schedule 28.03.2021    source источник
comment
Я предполагаю, что этот вопрос является дубликатом и похож на приведенный ниже введите здесь описание ссылки   -  person Anjula Paulus    schedule 28.03.2021


Ответы (1)


У вас есть несколько синтаксических ошибок:

  • Вам не нужно THEN перед FETCH FIRST; а также
  • В выражении CASE отсутствует предложение WHEN.

У меня нет SQL/Plus для тестирования с использованием переменной связывания, но что-то вроде этого:

select * from system_options
FETCH FIRST CASE WHEN :lim IS NOT NULL THEN :lim ELSE 9999 END ROWS ONLY

Или вы можете использовать COALESCE:

select * from system_options
FETCH FIRST COALESCE( :lim, 9999 ) ROWS ONLY

db‹›fiddle здесь

person MT0    schedule 28.03.2021
comment
Использование COALESCE лучше, спасибо! Я думал, что в Oracle есть константа для max int или что-то в этом роде, но мне нужно ввести число. Также я не знаю, почему в моем случае я должен использовать строку, поэтому я должен использовать '9999', иначе я получаю эту ошибку ORA-00932: inconsistent datatypes: expected CHAR got NUMBER. - person user5507535; 28.03.2021
comment
@user5507535 user5507535 Если ваша переменная связывания передается в виде строки, то оба типа данных должны быть одинаковыми, и он будет жаловаться, если это не так. Я предполагаю, что вы передаете его из стороннего приложения (например, Java, C# или Python); если это так, то просто убедитесь, что он привязан к (или приведен) к числу, а не к строке. - person MT0; 28.03.2021