2015-07-21 64 views
0

我想调用一个函数,它返回一个用户定义的类型,它存在于不同的模式中。调用函数从Oracle中的不同模式返回用户类型

的功能和封装的声明是像---

​​

因为它明显看出,函数返回一个引用游标作为行的选定数目的输出。

下列现在,为了实现这一目标,我按照steps--

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)在其他模式下创建包的同义词

尽管我可以从不同的模式调用函数,但是我在结果集中得到空值,但是每当我执行函数I中提到的查询时可以看到结果。

是因为包里面创建的类型的东西,如果是有人可以使我得到正确的结果的方式设置

回答

1

你的包与AUTHID CURRENT_USER定义,所以当你从源模式称之为PA_WEBHOOK.FN_ORDER_CUSTOMER_GET它的工作原理很好,但是当你从ECOMM_APP模式调用它时,它在运行时使用ECOMM_APP的特权,而不是定义模式的特权,它在名称解析时使用ECOMM_APP模式,而不是在对象未完全限定时使用定义模式。

所有这一切意味着如果PA_WEBHOOK.FN_ORDER_CUSTOMER_GET尝试将引用光标返回到ORDERS表(不受所有者模式名称限定),它将根据调用哪个模式将refcursor返回到不同的表。如果您的模式有一个包含数据的ORDERS表,则会返回数据,但如果ECOMM_APP的表格没有数据,它将不会返回任何数据。如果ECOMM_APP没有引用的表,该函数可能会引发错误。函数有可能会掩盖这种情况的错误处理程序。

或者,如果PA_WEBHOOK.FN_ORDER_CUSTOMER_GET使用完全限定的表格引用,那么ECOMM_APP模式可能没有选择特权。错误处理程序也可以掩盖缺少priv的情况。

虽然没有看到包身,但很多这是猜测。您可以在oracle的文档中阅读Invoker's and Definer's Rights以获取更多信息。

+0

最初的问题在于函数本身,因为在系统中实现了游标的最大计数。 – Abhi

+0

我已经提供了强制权限,即在包上执行,在表上选择/更新/插入/删除,在seq上选择并在用户定义类型上执行,因此权限不是问题。问题与配置有关,其中提到的最大游标大小真的很低,导致函数本身存在问题,通过从函数中删除异常处理部分来了解这一点。 – Abhi

+0

是的,但你是否使用完全限定的表/对象引用'schema.table_name'或无限制的引用,例如'table_name'?在后一种情况下,当由拥有该包的同一模式访问时,函数将找到引用的对象,但是当从另一模式访问时,只有该模式具有指向正确的本地或全局同义词的引用对象对象,或者模式拥有相同名称的对象(并且希望是相同的类型)。这是'AUTHID CURRENT_USER'语句的一部分。用于访问数据库对象的 – Sentinel

相关问题