網頁

2020/8/9

Oracle PL/SQL Nested Table FOR LOOP start index

Oracle集合(collection)型態中的Nested Table(表格類型)的index是從1開始起算。

例如下面PL/SQL block中LOOP Nested Table如果從index為0開始會出現錯誤
ORA-06532: 子命令檔超出限制
ORA-06532: Subscript outside of limit

DECLARE
    TYPE nested_table_type IS TABLE OF VARCHAR2(30); -- 定義nested_table_type為Nested Table集合資料型態
    v_nt nested_table_type; -- 宣告v_nt變數型態為nested_table_type
BEGIN
    v_nt := nested_table_type('apple', 'banana', 'guava'); -- 設定v_nt的值
    
    FOR i IN 0 .. v_nt.COUNT -- ORA-06532錯誤,Nested Table變數的index起始值為1
    LOOP
        DBMS_OUTPUT.PUT_LINE(v_nt(i));
    END LOOP;

END;

Nested Table變數的index起始值應該為1如下。

DECLARE
    TYPE nested_table_type IS TABLE OF VARCHAR2(30); -- 定義nested_table_type為Nested Table集合資料型態
    v_nt nested_table_type; -- 宣告v_nt變數型態為nested_table_type
BEGIN
    v_nt := nested_table_type('apple', 'banana', 'guava'); -- 設定v_nt的值
    
    FOR i IN 1 .. v_nt.COUNT -- Nested Table變數的index起始值為1
    LOOP
        DBMS_OUTPUT.PUT_LINE(v_nt(i));
    END LOOP;

END;

或是改用collection methods的FIRSTLAST

DECLARE
    TYPE nested_table_type IS TABLE OF VARCHAR2(30); -- 定義nested_table_type為Nested Table集合資料型態
    v_nt nested_table_type; -- 宣告v_nt變數型態為nested_table_type
BEGIN
    v_nt := nested_table_type('apple', 'banana', 'guava'); -- 設定v_nt的值
    
    FOR i IN v_nt.FIRST .. v_nt.LAST -- 改用FIRST, LAST
    LOOP
        DBMS_OUTPUT.PUT_LINE(v_nt(i));
    END LOOP;

END;

沒有留言:

張貼留言