#oracle #plsql
#Oracle #plsql
Вопрос:
Я создаю запрос для использования в разбивке на страницы, поэтому мой запрос выглядит следующим образом:
open ref_cursor for
select * from TableA ta
join TableB tb on ta.id = tb.ta_id
where ta.conditionA = "searchParameter1"
where tb.conditionB = "searchParameter2"
order by ta.columnF
offset i_row_offset rows
fetch next i_row_fetch rows only
Я хотел бы вернуть эту часть в качестве выходного параметра, прежде чем смещать / извлекать результаты запроса:
// I would like to get the row count of this part...
o_all_row_count := select count(*) from TableA ta
join TableB tb on ta.id = tb.ta_id
where ta.conditionA = "searchParameter1"
where tb.conditionB = "searchParameter2"
// And then slice if by offset/fetch only the rows that I want
select * from TableA ta
join TableB tb on ta.id = tb.ta_id
where ta.conditionA = "searchParameter1"
where tb.conditionB = "searchParameter2"
order by ta.columnF
offset i_row_offset rows
fetch next i_row_fetch rows only
Я определенно могу это сделать, но, похоже, я собираюсь выполнить дважды один и тот же поисковый запрос. Как мне сделать это лучше?
Ответ №1:
Я не думаю, что вы можете; чтобы узнать, сколько строк в курсоре, вам нужно извлечь из него и да — это выполняет одну и ту же работу дважды.
Ответ №2:
Вы можете получить то, что хотите, просто не напрямую и не легко. Что вам нужно, так это развернуть курсор на столбец. Затем вы заполняете этот столбец аналитической версией count, создавая один раздел:
select ...
, count(*) over() "rows in cursor"
from tablea a
join tableb b
on ( ... )
where ...;
Это, по всей вероятности, также потребует от вас фактического указания ваших столбцов в select (т. Е. Без выбора * ) и последующей выборки. Смотрите Полный пример здесь .
Поскольку я использую только верхний регистр, чтобы привлечь внимание, вы можете в принципе игнорировать все, кроме переменных верхнего регистра и сгенерированного столбца при выборе открытого курсора.
Возникает вопрос: стоит ли это усилий?
Кстати, ваш запрос
select * from TableA ta
join TableB tb on ta.id = tb.ta_id
where ta.conditionA = "searchParameter1"
where tb.conditionB = "searchParameter2"
недопустимо. Во-первых, у вас может быть не более 1 предложения WHERE на SELECT . Во-вторых, двойные кавычки приводят к тому, что заключенное в кавычки значение интерпретируется как имя переменной, А НЕ как строковая константа. Для значения вам нужна одинарная кавычка. Вышеуказанное должно быть:
select *
from TableA ta
join TableB tb on ta.id = tb.ta_id
where ta.conditionA = 'searchParameter1'
and tb.conditionB = 'searchParameter2'
...