В данный момент ваш курсор и выбор, который вы делаете внутри цикла, не связаны. Цикл курсора - это всего лишь идентификация до 100 записей, и вы перебираете их, но не используете результаты. Вы почти делаете:
for i in 1..100 loop
select ... into ... from ...
end loop;
Таким образом, каждый раз вокруг петли вы пытаетесь выбрать все строки в переменную, следовательно, ошибки вы получаете.
Вы можете обратиться к переменной курсора внутри цикла, как list_ename_rec.ename
. Но вы добавляете в цикл where
; Вы все еще можете сделать это испытание внутри цикла, но вы можете также сделать это в объявлении курсора:
declare
CURSOR List_ENAME_cur IS
SELECT ENAME, substr(ename,5,4)
from table1
WHERE status = 2
AND REGEXP_LIKE(ENAME,
'[1-9]{4}[_][1-9]{2}[_][1-9]{2}[_][1-9]{2}[_][0-9]{4}')
AND ROWNUM <= 100;
begin
FOR List_ENAME_rec IN List_ENAME_cur
loop
DBMS_OUTPUT.PUT_LINE('seq_ENAME'||List_ENAME_rec.seq_ENAME);
end loop;
end;
В качестве альтернативы, если вы хотите получить 100 записей, а затем отображать только те, в пределах этого набора, который соответствует вашим шаблон, который вы могли бы сделать это:
declare
seq_ENAME NUMBER (4);
CURSOR List_ENAME_cur IS
SELECT ENAME from table1
WHERE status = 2
AND ROWNUM <= 100;
begin
FOR List_ENAME_rec IN List_ENAME_cur
loop
if REGEXP_LIKE(List_ENAME_rec.ENAME,
'[1-9]{4}[_][1-9]{2}[_][1-9]{2}[_][1-9]{2}[_][0-9]{4}')
then
seq_ENAME := substr(List_ENAME_rec.ename,5,4);
DBMS_OUTPUT.PUT_LINE('seq_ENAME'||seq_ENAME);
end if;
end loop;
end;
в любом случае, стоит отметить, что который 100 строк вы получите из таблицы неопределенна, потому что вы не имеете order by
положение.
спасибо за помощь и rownum <= 100 coz У меня около миллиона записей, поэтому я хочу, чтобы мой скрипт работал быстрее и больно удалял его последним .. в любом случае проблема решена благодаря – user334560415