如何将 %TYPE 与 Oracle 关联数组一起使用?
How can I use %TYPE with Oracle associative arrays?
我在一些 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 测试服务器上不起作用。
您可以定义自己的类型来处理 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;
我在一些 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 测试服务器上不起作用。
您可以定义自己的类型来处理 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;