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 作为局部变量;但INOUTIN 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 程序错误的主要内容,如果未能解决你的问题,请参考以下文章

PLsql登录oracle数据 报 “ora-12541:TNS:无监听程序”错误

orcale用PLSQL打开为啥来时报初始化错误

PLSQL——05异常处理

PLSQL例外处理

Plsql程序和异常

Oracle/PLSQL 中的分页错误