0

コードの実行中に以下のエラーが発生します

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 コマンドの後、私はこれを得ました

エラーを表示    
FUNCTION CONTACT_RESTRICTION のエラー:

LINE/COLエラー
-------- ---------------------------------------------- -----------------------
3/1 PLS-00103: 記号「?」が見つかりました。のいずれかを期待するとき
         続く:
         begin 関数プラグマ プロシージャ サブタイプ タイプ
          現在のカーソルの削除
         以前の外部言語が存在する

これは残りのコードです:

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

2 に答える 2

2

元の質問には を参照するエラー メッセージが表示"?"されますが、コメントとして投稿したコードでは、代わりに「IN」に対して同様のエラーが発生します。

2/24   PLS-00103: Encountered the symbol "IN" when expecting one of the following:

これはIN、ローカル変数に使用したためです。ただしINOUTおよび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 番目のケース)。

于 2014-03-08T19:03:06.323 に答える
0

関数ヘッダーの構文が正しくありません。そのはず:

create or replace function contact_restriction(obj_schema IN varchar2, obj_name IN varchar2) 
  return varchar2
is
于 2014-03-07T19:44:44.537 に答える