【问题标题】:How can I use %TYPE with Oracle associative arrays?如何将 %TYPE 与 Oracle 关联数组一起使用?
【发布时间】:2017-04-07 04:25:28
【问题描述】:

我在一些 Oracle 包头中声明了一个关联数组类型,例如:

TYPE ParamArray IS TABLE OF VARCHAR2(4096) INDEX BY VARCHAR2(512);

在我的包体中,我想在不重复字符串大小的情况下遍历数组,以避免更新包头时出现不匹配。

我的尝试是:

PROCEDURE IterateArray( Params ParamArray )
AS
  v_ParamName ParamArray%TYPE;
BEGIN
  v_ParamName := Params.First;
  WHILE v_ParamName IS NOT NULL LOOP
    -- do something with the array entry
    v_ParamName := Params.Next(v_ParamName);
  END LOOP;
END;

但这在我的 Oracle 10g 测试服务器上不起作用。

【问题讨论】:

    标签: arrays oracle types associative-array


    【解决方案1】:

    您可以定义自己的类型来处理varchar2 并使用您的类型,无需重复大小。 例如:

    CREATE OR REPLACE PACKAGE testpck AS
        SUBTYPE myType IS VARCHAR2(4096);     /* a type for the values */
        SUBTYPE myIndexType is VARCHAR2(512); /* a type for the index  */
        TYPE ParamArray IS TABLE OF myType
            INDEX BY myIndexType;
        PROCEDURE IterateArray(Params ParamArray);
    END;
    
    CREATE OR REPLACE PACKAGE BODY testpck AS
        PROCEDURE IterateArray(Params ParamArray) AS
            v_ParamName     myType; 
            v_index         myIndexType;
        BEGIN
            v_index    := Params.FIRST;
    
            WHILE v_index IS NOT NULL
            LOOP
                -- do something with the array entry
                v_ParamName := Params(v_index);
                dbms_output.put_line('value of ' || v_index || ' is ' || v_ParamName);
                v_index     := Params.NEXT(v_index);             
            END LOOP;
        END;
    END;
    

    电话:

    declare
        myArray         testpck.ParamArray;
        myValue         testpck.myType;
        myIndex         testpck.myIndexType;     
    begin    
        myIndex := 'ONE';
        myValue := 'VALUE OF ONE';
        myArray(myIndex) := myValue;     
        --
        myIndex := 'TWO';
        myValue := 'VALUE OF TWO';
        myArray(myIndex) := myValue;
        --
        testpck.IterateArray(myArray);
    end;
    

    【讨论】:

    • 我可以编译示例,但 ParamArray 定义不应该使用INDEX BY myType 而不是TABLE OF myType
    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 2014-03-20
    • 2014-02-13
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多