PL/SQL基于Anydata实现任意类型数据免重载比较方案咨询
问题结论
完全可以实现,不需要绑定具体的参数类型,通过ANYDATA和配套的ANYTYPE内置方法,就能在运行时完成单值类型与集合元素类型的一致性校验,完全匹配双ANYDATA入参的存储过程声明形式。
核心实现逻辑
类型校验的核心是分别提取两个入参的类型元数据做比对:
- 对第一个单值入参,直接提取其绑定的
ANYTYPE类型描述符 - 对第二个集合入参,先校验传入值是否为嵌套表/可变数组类型,再从集合的类型描述符中拆解出元素对应的
ANYTYPE描述符 - 调用
ANYTYPE自带的Equal方法判断两个类型描述符是否指向同一类型即可完成校验,该方式比直接比对类型名字符串严谨得多,不会出现长度、精度、自定义类型判断错误的问题
可直接运行的实现示例
CREATE OR REPLACE PROCEDURE get_position(Single_Value ANYDATA, Value_Set ANYDATA) IS v_single_type ANYTYPE; v_collect_type ANYTYPE; v_elem_type ANYTYPE; v_typecode PLS_INTEGER; v_dummy_res PLS_INTEGER; v_type_match_res PLS_INTEGER; -- 通用集合遍历相关变量 v_collection ANYDATASET; v_idx PLS_INTEGER := 1; v_cur_elem ANYDATA; v_equal_res PLS_INTEGER; BEGIN -- 1. 提取单值的类型描述符 v_single_type := Single_Value.GetType(); IF v_single_type IS NULL THEN RAISE_APPLICATION_ERROR(-20001, '单值入参类型无效'); END IF; -- 2. 校验第二个入参是否为合法集合类型 v_typecode := Value_Set.GetType(v_collect_type); IF v_typecode NOT IN (DBMS_TYPES.TYPECODE_NESTED_TABLE, DBMS_TYPES.TYPECODE_VARRAY) THEN RAISE_APPLICATION_ERROR(-20002, '第二个入参必须是嵌套表或可变数组类型,不支持关联数组'); END IF; -- 3. 提取集合的元素类型描述符 v_dummy_res := v_collect_type.GetAttrElemType(1, v_elem_type); IF v_elem_type IS NULL THEN RAISE_APPLICATION_ERROR(-20003, '集合元素类型解析失败'); END IF; -- 4. 执行类型一致性校验 v_type_match_res := v_single_type.Equal(v_elem_type); IF v_type_match_res = 0 THEN RAISE_APPLICATION_ERROR(-20004, '单值类型与集合元素类型不匹配,终止执行'); END IF; -- 5. 类型校验通过后,通用遍历集合查找匹配项 v_collection := ANYDATASET.ConvertAnyData(Value_Set); WHILE v_idx <= v_collection.GetCount() LOOP v_collection.Piecewise; v_collection.GetElement(v_idx, v_cur_elem); -- 比对当前元素和传入单值是否相等 v_equal_res := Single_Value.Equal(v_cur_elem); IF v_equal_res = 1 THEN DBMS_OUTPUT.PUT_LINE('匹配元素位置:' || v_idx); END IF; v_idx := v_idx + 1; END LOOP; END; /
注意事项
- 不要通过类型名字符串做等值判断,该方式无法区分同类型不同长度/精度、同名不同schema下的自定义类型,判断结果不可靠,必须使用
ANYTYPE.Equal方法 ANYDATA不支持接收PL/SQL关联数组(即index-by table),如果要传入集合必须使用嵌套表或VARRAY类型- 上述实现是完全通用的,不管传入的单值和集合是
VARCHAR2、NUMBER、DATE还是自定义对象类型,都可以正常完成类型校验和匹配查找,不需要针对特定类型做硬编码适配
内容的提问来源于stack exchange,提问作者Machine
相关产品推荐
相关产品推荐

