2014-02-16 1 views
0

Я пытаюсь читать курсор из записи, но получаю эту ошибкупытается прочитать курсор из записи, но получение точной выборки возвращает больше запрошенного количества строк?

ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк ORA-06512: в строке 14

declare 
ename  table1.ename%TYPE; 
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 
select substr(ename,5,4),ENAME into seq_ENAME,ename from table1 where REGEXP_LIKE(ENAME,'[1-9]{4}[_][1-9]{2}[_][1-9]{2}[_][1-9]{2}[_][0-9]{4}'); 
DBMS_OUTPUT.PUT_LINE('seq_ENAME'||seq_ENAME); 
end loop; 
end; 

ответ

1

В данный момент ваш курсор и выбор, который вы делаете внутри цикла, не связаны. Цикл курсора - это всего лишь идентификация до 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 положение.

+0

спасибо за помощь и rownum <= 100 coz У меня около миллиона записей, поэтому я хочу, чтобы мой скрипт работал быстрее и больно удалял его последним .. в любом случае проблема решена благодаря – user334560415

Смежные вопросы