2014-02-16 21 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因爲我有大約百萬條記錄,所以我想我的腳本運行更快,生病去除後者..無論如何,問題解決了感謝 – user334560415