2014-03-07 93 views
0

我得到下面的錯誤而執行代碼PLSQL程序錯誤

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

這是剩下的代碼:下面

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; 
+1

因爲沒有「?」你發佈的代碼中的字符我發現很難診斷這個問題。也許還有一些其他代碼沒有包含在內? –

+0

這是剩餘的代碼 – user3391904

+0

開始 DBMS_RLS.ADD_POLICY(object_schema => 'HR' ,則object_name => '僱員' ,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); 結束; / – user3391904

回答

0

函數標頭的語法不正確。它應該是:

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

'IN',我認爲你已經改變了,是可選的;這是默認的[參數模式](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/subprograms.htm#LNPLS659)。這是下一行錯誤的'IN'... –

2

你原來的問題顯示錯誤消息指"?",但代碼YOUT發佈了作爲註釋會引起類似的錯誤'「IN」」來代替:

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

這是因爲你已經使用IN作爲局部變量;但是IN,OUTIN 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將把它作爲原始查詢中的一個過濾器,這將阻止任何行被返回(在第一種情況下)或不起作用,並允許返回與其他任何現有條件匹配的所有行(在第二種情況下)。