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