我试图在一个包中调用一个函数,该函数返回一个存在于不同模式中的用户定义类型。
函数和包声明就像---
CREATE OR REPLACE PACKAGE PA_WEBHOOK
AUTHID CURRENT_USER
IS
TYPE gcur_table_data IS REF CURSOR;
TYPE typ_tab_updated_ids IS TABLE OF orders.order_sid%TYPE;
FUNCTION fn_order_customer_get (p_str_order_id IN orders.order_id%TYPE) RETURN gcur_table_data;
END PA_WEBHOOK;
/
很明显,函数返回一个引用游标作为选定行数的输出。
现在为了达到这个目的,我遵循了以下步骤 -
1)创建角色 -
CREATE ROLE ECOMMERCE_APP_ROLE;
2)为角色提供特权---
GRANT EXECUTE ON PA_WEBHOOK TO ECOMMERCE_APP_ROLE;
3)为用户架构分配角色
GRANT ECOMMERCE_APP_ROLE TO ECOMM_APP;
4)在其他模式中创建包的同义词
虽然我可以从不同的模式调用该函数但是我在结果集中得到null,但每当我执行函数中提到的查询时,我都可以看到结果。
是不是因为在包内创建了类型,如果是,有人可以引导我获得正确的结果集
答案 0 :(得分:1)
您的软件包是使用AUTHID CURRENT_USER
定义的,因此当您从源架构调用PA_WEBHOOK.FN_ORDER_CUSTOMER_GET
时,它可以正常工作,但是当您从ECOMM_APP
架构调用它时,它会使用ECOMM_APP
运行时的权限,而不是定义模式的权限,它在名称解析期间使用ECOMM_APP
模式,而不是在对象不完全限定时使用定义模式。
所有这些意味着,如果PA_WEBHOOK.FN_ORDER_CUSTOMER_GET
尝试将引用游标返回到ORDERS
表(未使用所有者架构名称限定),它将根据哪个架构返回到不同表的refcursor&# 39; s来自。如果您的架构有一个包含数据的ORDERS
表格,那么您将获得数据,但如果ECOMM_APP
有一个没有数据的ORDERS
表,那么它将赢得任何数据。如果ECOMM_APP
没有引用的表,则该函数可能会抛出错误。该函数可能有一个可能掩盖这种情况的错误处理程序。
或者,如果PA_WEBHOOK.FN_ORDER_CUSTOMER_GET
使用完全限定的表引用,那么ECOMM_APP
模式可能没有选择它们的权限。同样,错误处理程序可能会掩盖缺少权限。
虽然没有看到包体,但很多猜想都是猜测。您可以在oracle的文档中阅读Invoker's and Definer's Rights了解更多信息。