get_release Oracle API返回"未知"结果而不是正确的释放

时间:2016-10-14 23:32:59

标签: oracle erp oracle-ebs

从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.

以前有人遇到过这个问题吗?!

2 个答案:

答案 0 :(得分:1)

据我所知,有三种可能性:

  1. 使用invoker_rights_clause(AUTHID CURRENT_USER)编译的包 FND_RELEASE 。它为用户apps和任何其他用户使用不同的来源。
  2. function FND_RELEASE.get_release使用context进行访问。
  3. 在您的系统中使用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的逻辑以在其他表上引入其他查询,导致此解决方案中断,直到您创建所需的其他同义词为止。