Вы не можете вставить в CTE и не можете повесить блок PL / SQL от CTE - только запрос.(Хотя вы можете встроить PL / SQL в CTE из 12c).
Если вы хотите сгенерировать значения в диапазоне, вы можете использовать иерархический запрос:
with growing (variable) as (
select <start_point> + level - 1
from dual
connect by level <= <end_point>
)
, где <start_point>
и <end_point>
- это заполнители, которые необходимо заменить буквальными значениями или (в зависимости от того, как вы будете использовать это) переменную замены или связывания.Так что с вашим диапазоном в качестве фиксированных литералов:
with growing (variable) as (
select 1 + level - 1
from dual
connect by level <= 100
)
select * from growing;
VARIABLE
----------
1
2
3
...
99
100
или используйте рекурсивный CTE:
with growing (variable) as (
select <start_point> from dual
union all
select variable + 1
from growing
where variable < <end_point>
)
так:
with growing (variable) as (
select 1 from dual
union all
select variable + 1
from growing
where variable < 100
)
select * from growing;
VARIABLE
----------
1
2
3
...
99
100
Если вы пытаетесь объединитьэто с переменными PL / SQL, тогда вы можете использовать CTE в цикле курсора, ссылаясь на локальные переменные PL / SQL в CTE:
set serveroutput on
declare
start_point number := 1;
end_point number := 100;
begin
for r in (
with growing (variable) as (
select 1 from dual
union all
select variable + start_point
from growing
where variable < end_point
)
select * from growing
)
loop
dbms_output.put_line(r.variable);
end loop;
end;
/
1
2
3
...
98
99
PL/SQL procedure successfully completed.
, но вам действительно нужно использовать CTE какчасть большого запроса, будь то простой SQL или часть блока PL / SQL.
Чтобы просто напечатать значения в PL / SQL, вам не нужен CTE, просто простой цикл:
declare
start_point number := 1;
end_point number := 100;
begin
for i in start_point..end_point loop
dbms_output.put_line(i);
end loop;
end;
/
но опять же вы, конечно, ожидаете, что будете делать что-то более полезное с сгенерированными числами.Если у вас уже была временная таблица, созданная на уровне схемы, вы можете вставить ее (с помощью PL / SQL или обычного SQL).(Они должны сохраняться; таблица постоянна, по крайней мере, для глобальных временных таблиц; данные являются временными. Подробнее ).Или вы можете заполнить коллекцию таблиц, например,
declare
type t_tab is table of number;
tab t_tab := t_tab();
start_point number := 1;
end_point number := 100;
begin
for i in start_point..end_point loop
dbms_output.put_line(i);
tab.extend();
tab(tab.count) := i;
end loop;
end;
/
Это действительно зависит от того, что вам нужно делать с сгенерированными числами и во что вы их сохраняете (если что).