PLSQL 程序错误
Posted
技术标签:
【中文标题】PLSQL 程序错误【英文标题】:PLSQL procedure error 【发布时间】:2014-03-07 11:48:53 【问题描述】:执行代码时出现以下错误
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;
/
在显示错误命令后我得到了这个
显示错误 FUNCTION CONTACT_RESTRICTION 的错误: LINE/COL 错误 -------- ------------------------------------------ ---------------------- 3/1 PLS-00103:遇到符号“?”当期待其中之一 下列的: 开始函数杂注过程子类型类型 当前光标删除 存在先前的外部语言这是剩下的代码:
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;
【问题讨论】:
因为没有“?”您发布的代码中的字符我发现很难诊断这个问题。也许还有一些其他代码没有包含在内? 这是剩下的代码 您已显示contact_restriction_function
的代码,但错误是CONTACT_RESTRICTION
。请在调用show errors
之前立即显示您实际执行的代码。
在您的评论(上面)中提到的对DBMS_RLS.ADD_POLICY
的调用中,您传递了policy_function => 'contact_restriction_function'
- 但是因为Oracle 中未加引号的标识符默认为大写,所以这应该是policy_function => 'CONTACT_RESTRICTION_FUNCTION'
。这可能不是此问题的根源,但将来可能会有所帮助。分享和享受。
@user3391904 - 请在问题中输入代码,而不是在 cmets 中。这仍然没有给出"?"
的错误消息;但它会在v_contact_info_visible
的声明中抱怨IN
。不知道为什么你从你复制的样本中剥离了报价处理;您还将下划线更改为连字符,这将导致另一个错误。
【参考方案1】:
您的原始问题显示了一条引用"?"
的错误消息,但您发布的代码作为评论会引发类似的错误“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 会将其作为过滤器包含在原始查询中,这将阻止返回任何行(在第一种情况下)或无效并允许返回与任何其他现有条件匹配的所有行(在第二种情况下)。
【讨论】:
【参考方案2】:函数头的语法不正确。应该是:
create or replace function contact_restriction(obj_schema IN varchar2, obj_name IN varchar2)
return varchar2
is
【讨论】:
IN
,我认为你已经改变了,是可选的;这是默认的parameter mode。错误的是下一行的IN
...以上是关于PLSQL 程序错误的主要内容,如果未能解决你的问题,请参考以下文章