从apps用户执行下面的get_release函数时,它返回正确的版本: 12.1.3 ,但是当从另一个用户执行它时,它返回未知结果:
declare
l_release_name varchar2(30);
l_other_release_info varchar2(2000);
begin
if not apps.FND_RELEASE.get_release (l_release_name, l_other_release_info) then
null;
end if;
dbms_output.put_line(l_release_name);
end;
FND_RELEASE.get_release 是一个公共包,不应该限制从另一个用户调用它。
我在函数评论中找到的内容:
-- get_release() will usually return TRUE
-- with RELEASE_NAME =
-- contents of RELEASE_NAME column in FND_PRODUCT_GROUPS
-- and OTHER_RELEASE_INFO = null
--
-- If FND_PRODUCT_GROUPS.RELEASE_NAME contains imbedded spaces:
--
-- get_release() will return TRUE
-- with RELEASE_NAME = FND_PRODUCT_GROUPS.RELEASE_NAME up to but
-- not including the first imbedded space
-- and OTHER_RELEASE_INFO = FND_PRODUCT_GROUPS.RELEASE_NAME
-- starting with the first non-space character after the first
-- imbedded space
--
-- On failure, get_release() returns FALSE. This will be a performance issue.
-- Both RELEASE_NAME and OTHER_RELEASE_INFO will be set to 'Unknown'.
-- This indicates that either:
-- 1) there are no rows in fnd_product_groups
-- - this can be resolved by populating the row and it will
-- be queried on the next call.
-- 2) there is more than one row in fnd_product_groups
-- - delete all but the one correct row from fnd_product_groups and it
-- will be queried on the next call. It's possible that the values
-- returned by release_* and *_version routines are still correct if
-- the first row in fnd_product_groups, ordered by product_group_id,
-- if the currect row, but this will still be a performance problem.
以前有人遇到过这个问题吗?!
答案 0 :(得分:1)
据我所知,有三种可能性:
AUTHID CURRENT_USER
)编译的包 FND_RELEASE 。它为用户apps
和任何其他用户使用不同的来源。 context
进行访问。private database
选项。它能够重写查询并为当前用户添加条件。(第2点的变化,但隐含)答案 1 :(得分:1)
我发现您正在使用Oracle电子商务套件数据模型和软件包。
在该软件包中,FND_RELEASE
被声明为AUTHID CURRENT_USER
(即,它使用了调用者的权限)。您可以在包规范的第1行看到这一点。
这意味着在此查询中查看了FND_PRODUCT_GROUPS
表...
select release_name
from fnd_product_groups
order by product_group_id;
... NOT APPS.FND_PRODUCT_GROUPS
..它是当前用户拥有的FND_PRODUCT_GROUPS
表。
由于该用户可能没有FND_PRODUCT_GROUPS
表,FND_RELEASE
在尝试运行该查询时会引发ORA-00942: table or view does not exist
错误。
这导致它跳转到它的WHEN OTHERS
异常处理程序,导致它返回false,输出参数设置为" Unknown"。
解决此问题的一种方法是为FND_RELEASE
创建一个使用definer权限的自定义包装器。像这样:
create or replace package xxcust_fnd_release AUTHID DEFINER IS
function get_release (release_name out nocopy varchar2,
other_release_info out nocopy varchar2)
return boolean;
end xxcust_fnd_release;
create or replace package body xxcust_fnd_release IS
function get_release (release_name out nocopy varchar2,
other_release_info out nocopy varchar2)
return boolean IS
BEGIN
return fnd_release.get_release (release_name, other_release_info);
END;
end xxcust_fnd_release;
grant execute on xxcust_fnd_release to <your_other_username>;
如果你这样做,并按如下方式修改你的脚本,它将起作用:
declare
l_release_name varchar2(30);
l_other_release_info varchar2(2000);
begin
if not apps.XXCUST_FND_RELEASE.get_release (l_release_name, l_other_release_info) then
null;
end if;
dbms_output.put_line(l_release_name);
end;
如果您不能或不想在APPS
架构中创建新的包装器包,则可以在其他用户的架构中为FND_PRODUCT_GROUPS
创建同义词。
,例如,
create or replace synonym fnd_product_groups FOR apps.fnd_product_groups;
...在您的其他架构中执行此操作,原始脚本将起作用。
此备选方案的缺点是Oracle补丁可能会更改FND_RELEASE
的逻辑以在其他表上引入其他查询,导致此解决方案中断,直到您创建所需的其他同义词为止。