0

执行代码时出现以下错误

create or replace
function contact_restriction_function(obj_schema varchar2, obj_name varchar2)
return varchar2 is
    v_contact_info_visible hr_user_access.contact_info_visible%type;
    begin
    -- Here you can put any business logic for filtering
    select nvl(max(contact_info_visible),'N')
    into v_contact_info_visible
    from hr_user_access
    where user_name = user;

    -- SQL filter / policy predicate
    return ''''||v_contact_info_visible||''' = ''Y'' ';
end;
/

在显示错误命令后我得到了这个

显示错误    
FUNCTION CONTACT_RESTRICTION 的错误:

LINE/COL 错误
-------- ------------------------------------------ ----------------------
3/1 PLS-00103:遇到符号“?” 当期待其中之一
         下列的:
         开始函数杂注过程子类型类型
          当前光标删除
         存在先前的外部语言

这是剩下的代码:

begin
  dbms_rls.add_policy(object_schema => 'HR' ,
                      object_name => 'EMPLOYEES' ,
                      policy_name => 'Contact_Restriction_Policy' ,
                      policy_function => 'contact_restriction_function' ,
                      sec_relevant_cols=>'EMAIL,PHONE_NUMBER'Contact Info ,
                      sec_relevant_cols_opt=>dbms_rls.all_rows);
end;

下面是我在显示错误之前执行的实际代码:

create or replace function contact_restriction(obj_schema varchar2, obj_name varchar2) 
  return varchar2
is
  v_contact_info_visible IN user_access.contact_info_visible%type;
begin
  select nvl(max(contact_info_visible),'N')
    into v_contact_info_visible
    from user_access where username = user;

  return 'v_contact-info_visible ='|| 'Y';
end;
4

2 回答 2

2

您的原始问题显示了一条错误消息"?",但您发布的代码作为评论会引发类似的错误 `"IN"' 代替:

2/24   PLS-00103: Encountered the symbol "IN" when expecting one of the following:

那是因为您使用IN了局部变量;但是INOUTIN OUT适用于存储过程参数。例如,您可以使用显式声明该函数IN,尽管它是默认值:

create or replace function contact_restriction(obj_schema IN varchar2, ...

所以需要从v_contact_info_visible声明中删除。您已链接到您正在使用的示例,但您已从中删除了许多重要的引用,这仍然会导致它在作为 VPD 的一部分执行时失败;因为v_contact_info_visible将超出调用者的范围。你有一个错字,用连字符而不是下划线。

你需要类似的东西:

create or replace function contact_restriction(obj_schema varchar2,
  obj_name varchar2)
return varchar2 is
  v_contact_info_visible user_access.contact_info_visible%type;
begin
  select nvl(max(contact_info_visible),'N')
  into v_contact_info_visible
  from user_access
  where username = user;
  return ''''||v_contact_info_visible ||''' =''Y''';
end;
/

调用时,它将返回一个字符串,它是'N'='Y'or 'Y'='Y'。VPD 会将其作为过滤器包含在原始查询中,这将阻止返回任何行(在第一种情况下)或无效并允许返回与任何其他现有条件匹配的所有行(在第二种情况下)。

于 2014-03-08T19:03:06.323 回答
0

函数头的语法不正确。它应该是:

create or replace function contact_restriction(obj_schema IN varchar2, obj_name IN varchar2) 
  return varchar2
is
于 2014-03-07T19:44:44.537 回答