执行代码时出现以下错误
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 回答
您的原始问题显示引用
"?"
的错误消息,但您发布的评论代码会引发类似的错误:“"IN"”:那是因为你已经使用
IN
作为局部变量;但IN
,OUT
和IN OUT
仅适用于存储过程参数 . 例如,您可以使用显式IN
声明该函数,但它仍然是默认值:因此需要从
v_contact_info_visible
声明中删除 . 你正在努力工作,但是你从中删除了许多重要的引用,这仍然会导致它作为VPD的一部分执行时失败;因为v_contact_info_visible
将超出调用者的范围 . 你有一个拼写错误,连字符而不是下划线 .你需要这样的东西:
调用时,将返回一个字符串
'N'='Y'
或'Y'='Y'
. VPD将在原始查询中包含它作为过滤器,它将阻止返回任何行(在第一种情况下)或无效并允许返回与任何其他现有条件匹配的所有行(在第二种情况下) .函数头的语法不正确 . 它应该是: