Как поместить количество строк запроса в переменную, прежде чем я верну этот запрос в ref_cursor?

#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'
...