PLSQL过程错误

PLSQL过程错误,plsql,oracle11g,pls-00103,Plsql,Oracle11g,Pls 00103,我在执行代码时遇到以下错误 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

我在执行代码时遇到以下错误

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;
/
在显示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 下面是我在显示错误之前执行的实际代码:

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;

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

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

您原来的问题显示了一条错误消息,该消息指向
“?”
,但您发布的代码作为注释将引发类似的“IN”错误:

2/24   PLS-00103: Encountered the symbol "IN" when expecting one of the following:
这是因为您在中对局部变量使用了
;但是
IN
OUT
IN-OUT
仅适用于存储过程参数。例如,您可以在
中使用显式的
声明函数,尽管它是默认值:

create or replace function contact_restriction(obj_schema IN varchar2, ...
因此需要从可见的
v\u联系人信息
声明中删除该信息。您已经链接到一个您正在使用的示例,但是您已经删除了其中的许多重要引用,这仍然会导致它在作为VPD的一部分执行时失败;因为
v\u contact\u info\u 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将在原始查询中将其作为一个过滤器,它将阻止返回任何行(在第一种情况下)或不起作用,并允许返回与任何其他现有条件匹配的所有行(在第二种情况下)。

由于您发布的代码中没有“?”字符,我发现很难诊断此问题。可能还有其他一些代码没有包括在内?这是您显示的
联系人限制功能
的剩余代码,但错误是
联系人限制
。请在调用
show errors
之前立即显示实际执行的代码。在对
DBMS\u RLS的调用中。添加注释中提到的\u POLICY
您正在传递
policy\u function=>“contact\u restriction\u function”
——但由于Oracle中的不带引号的标识符默认为大写,因此这应该是
policy\u function=>“contact\u restriction\u function”
。这可能不是问题的根源,但在将来可能会有所帮助。分享并享受。@user3391904-请将代码放在问题中,而不是注释中。这仍然不会给出带有
“?”
的错误消息;但是它会抱怨
v\u contact\u info\u 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;
/