PL/SQL中如何实现以NUMBER类型为索引的键值对映射存储
PL/SQL关联数组索引类型限制说明
Oracle PL/SQL中的关联数组(INDEX BY表)仅支持两类合法索引类型:
- 整数类型:
PLS_INTEGER、BINARY_INTEGER(取值范围为 -2147483648 ~ 2147483647) - 字符串类型:
VARCHAR2、CHAR、LONG等字符类型
使用NUMBER(38)作为索引类型不符合语法要求,因此会触发不支持的报错。
解决方案
方案1:使用PLS_INTEGER作为索引(优先推荐)
如果你的数值索引键的取值范围在-2147483648 ~ 2147483647之间,直接将索引类型替换为PLS_INTEGER即可,该类型是PL/SQL原生整数类型,读写性能最优:
TYPE number_list IS TABLE of NUMBER(38) INDEX BY PLS_INTEGER;
使用示例:
DECLARE TYPE number_list IS TABLE of NUMBER(38) INDEX BY PLS_INTEGER; my_list number_list; BEGIN my_list(1001) := 8888; my_list(2002) := 9999; DBMS_OUTPUT.PUT_LINE(my_list(1001)); END; /
方案2:数值转字符串作为索引
如果你的索引键数值超出了PLS_INTEGER的取值范围,可以将数值转为字符串后作为索引,存取时统一使用TO_CHAR做类型转换即可:
TYPE number_list IS TABLE of NUMBER(38) INDEX BY VARCHAR2(40);
使用示例:
DECLARE TYPE number_list IS TABLE of NUMBER(38) INDEX BY VARCHAR2(40); my_list number_list; -- 超出PLS_INTEGER范围的大数索引键 large_key NUMBER(38) := 987654321012345678901234567890; BEGIN -- 存储时转为字符串 my_list(TO_CHAR(large_key)) := 7777; -- 读取时也转为字符串匹配索引 DBMS_OUTPUT.PUT_LINE(my_list(TO_CHAR(large_key))); END; /
注意:转字符串时需保证格式统一,不要添加千位分隔符、前后空格等多余字符,避免同一个数值生成不同字符串导致索引匹配失败。
内容的提问来源于stack exchange,提问作者joz_eco_12
相关产品推荐
相关产品推荐

