首页 文章

PLSQL程序错误

提问于
浏览
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;
/

在show erros命令之后我得到了这个

show errors    
Errors for FUNCTION CONTACT_RESTRICTION:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/1      PLS-00103: Encountered the symbol "?" when expecting one of the
         following:
         begin function pragma procedure subtype type 
          current cursor delete
         exists prior external language

这是剩下的代码:

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;

2 回答

  • 0

    您的原始问题显示引用 "?" 的错误消息,但您发布的评论代码会引发类似的错误:“"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将在原始查询中包含它作为过滤器,它将阻止返回任何行(在第一种情况下)或无效并允许返回与任何其他现有条件匹配的所有行(在第二种情况下) .

  • 2

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

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

相关问题