2011-02-18 71 views
3

我有一個在循環PL/SQL函數是這樣的:Oracle11g中的數值溢出for循環

FOR i IN min..max LOOP 

變量我,最小值,最大值被聲明爲NUMERIC

在我的情況下,最小和最大

是奧芬非常大,但範圍本身很小,即:

min = 3232236033 
max = 3232236286 

正如你所看到的範圍是約256〜,但這個值甲骨文拋出一個數字溢出錯誤,我停留在如何得到它的工作。

我應該如何迭代這些值?

編輯

OK,我有一個工作的答案,使用最大/最小差異的循環,但是否真的無法遍歷大值在Oracle?

EDIT我檢索的錯誤是:

SQL Error: ORA-01426: nadmiar numeryczny 
ORA-06512: przy "PS.DHCP", linia 88 
01426. 00000 - "numeric overflow" 
*Cause: Evaluation of an value expression causes an overflow/underflow. 
*Action: Reduce the operands. 

行代碼88是:

FOR client_ip IN min_host..max_host 

min_host,max_host,CLIENT_IP是inet_aton(IP的數字表示)的結果

+1

請顯示您的代碼以及您正在接收的例外 – tbone 2011-02-18 17:53:08

+0

該函數有超過70行代碼,但我會粘貼錯誤報告 – canni 2011-02-18 17:58:01

回答

6

看來問題來源於我被鑄成得小一些(這似乎PL/SQL的AA故障), 你可以改變你的循環類型:

While循環工作正常

set serveroutput on 
/
declare 
min_val number; 
max_val number ; 
iterator number ; 
begin 
    min_val := 3232236033 ; 
    max_val := 3232236286 ; 

    iterator := min_val; 
    while iterator<=max_val loop 
     dbms_output.put_line(iterator); 
     iterator := iterator + 1; 
    end loop ; 

end; 
/

從這裏: http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/controlstatements.htm#BABEFFDC

FOR循環索引

FOR LOOP語句的索引是 隱式聲明爲 類型INTEGER,該變量在 循環的本地。循環中的語句可以讀取索引的值 ,但 不能更改它。 之外的語句循環無法引用索引。 FOR LOOP語句運行後, 索引未定義。 (A循環索引是 有時被稱爲一個循環計數器。)

在實施例4-17中,for循環語句 試圖更改 它的索引的值,導致一個錯誤。

起這樣: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/loop_statement.htm

INDEX_NAME

的未聲明的標識符名稱 循環索引(有時稱爲 循環計數器)。它的範圍是循環 本身;您不能在循環外引用 。

index_name 的隱式聲明將覆蓋循環外的任何其他聲明 。要引用另一個具有相同名稱的 變量,請使用 標籤。請參見示例4-22,「將 全局變量與迴路相同的名稱 計數器」。

在一個循環中,該索引像一個常量一樣被處理爲 :它可以出現在 表達式中,但不能被賦值爲 值。

因此即使你聲明在申報「指數」,它沒有被環路內使用,而是使用隱式創建INDEX(這似乎有一個精密太小您的需求)

2

您可以運行循環變量,從0到minmax之間的差值。下面是隻寫號碼DBMS_OUTPUT一個例子:

DECLARE 
    v_min  INTEGER := 3232236033; 
    v_max  INTEGER := 3232236286; 
    v_diff PLS_INTEGER; 
BEGIN 
    v_diff := v_max - v_min; 
    FOR i IN 0..v_diff 
    LOOP 
    -- Use v_min + i where you would have used i. 
    dbms_output.put_line(v_min + i); 
    END LOOP; 
END; 
/

編輯:可悲的是,你不能使用的範圍內操作人員通過大量的迭代。範圍運算符..限制在範圍+/- 2 。從PL/SQL documentation

內部,PL/SQL分配邊界來臨時PLS_INTEGER變量的值,並且,如果有必要,舍入值最接近的整數。 PLS_INTEGER的幅度範圍是-2 ** 31 .. 2 ** 31。如果綁定的計算結果超出該範圍,那麼當PL/SQL嘗試分配時會出現數字溢出錯誤。

+0

好的,我發現這會起作用,但我不明白,爲什麼我有要使用這種毫無意義的循環複雜化,是否真的沒有辦法,循環oracle中的大值? – canni 2011-02-18 17:41:45