如何跨模式引用PL/SQL包中的记录类型
跨模式引用包中自定义记录类型的解决方案
错误原因
你之前的尝试均误用了%TYPE和%ROWTYPE属性:
%TYPE用于获取变量、列或常量的类型,不能直接作用于自定义记录类型本身%ROWTYPE用于获取表或游标行的结构,同样不适用于自定义记录类型
正确引用方式
由于schema_1.package_a.r_user_type是已公开的自定义记录类型,且schema_2已拥有该包的EXECUTE权限,直接将其作为变量类型即可,无需附加任何属性。
正确的Package Body写法
create or replace package body schema_2.package_b as procedure display_user_info is -- 直接引用跨模式包中的记录类型 r_user_info schema_1.package_a.r_user_type; begin -- 注意:查询字段的数量、顺序和类型必须与记录类型完全匹配 select '张三', 'zhangsan@example.com' into r_user_info.name, r_user_info.email from dual; -- 若查询结果结构完全匹配记录类型,也可直接整体赋值 -- select name, email into r_user_info from your_user_table where id = 1; end; end;
若Package规范中需使用该类型
如果package_b的规范部分(即包定义的声明段)要暴露该类型或用它作为参数/返回值,同样直接引用即可:
create or replace package schema_2.package_b as procedure display_user_info(p_user_info in schema_1.package_a.r_user_type); end;
关键注意事项
- 确认
schema_1已向schema_2授予package_a的EXECUTE权限(你已完成此操作) - 赋值时必须保证数据源的字段与记录类型的字段在数量、顺序、数据类型上完全匹配,否则会触发类型不匹配错误
内容的提问来源于stack exchange,提问作者McRivers
相关产品推荐
相关产品推荐

