PLSQL过程错误



我在执行代码时会出现以下错误

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;
/

show erros命令后我得到了这个

 显示错误功能的错误contact_rterniction:线/COL错误------------------------------------------------------------------------------------------------------------------------------------------------------------------------------3/1 PLS-00103:遇到符号"?"当期望其中一个         下列的:         开始功能Pragma过程亚型类型          当前光标删除         存在先前的外部语言

这是剩余的代码:

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;

您的原始问题显示了一条错误的消息,涉及"?",但是YouT发布的AS评论会引发类似的错误`'in'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''Y'='Y'的字符串。VPD将在原始查询中包含作为过滤器,这将防止返回任何行(在第一种情况下)或没有效果,并允许所有与任何其他现有条件返回的行(在第二种情况下)。

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

create or replace function contact_restriction(obj_schema IN varchar2, obj_name IN varchar2) 
  return varchar2
is

相关内容

  • 没有找到相关文章

最新更新