我在执行代码时会出现以下错误
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
用于本地变量;但是IN
,OUT
和IN 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