2011-11-22 60 views
0

令人困惑的情況如此與我無關......pl sql函數具有嵌套if和multiple選項

我有一個看法。該視圖具有基於兩個條件返回「TRUE」或「FALSE」的文本字符串的功能

該函數查看兩個表。

條件1:客戶表包含一個日期字段 - 如果系統日期>日期字段應該返回false

條件2:客戶錶鏈接到一個customer_detail表。在細節表中有時會有記錄,有時不會(因此我將外部聯接語法符號添加到查詢中,因爲附加條件會強制內部聯接,所以我沒有做任何事情)。客戶表中的每條記錄在customer_detail表中可以有多個記錄。如果細節表中有多條記錄,我需要查看最近的記錄max(uniquefield)。這個表格有一個日期字段。如果該字段不爲空,則該函數應返回第一個條件的錯誤關鍵字。

這是我的。當我編譯我得到兩個錯誤:

SQL statment忽視 - 在第一選擇statment

錯誤(17,45)的第一行:PL/SQL :ORA-00942:表或視圖不存在 - 在第一的子選擇選擇

create or replace FUNCTION "F_STATUS" (
N_UNIQUE IN NUMBER) 
RETURN VARCHAR2 
IS 
    V_TORF varchar2(20); 
    D_ACTDATE date; 
    D_STARTDATE date; 
BEGIN 
select b.startdate into D_STARTDATE 
from customerdb.customer a, customerdb.customer_detail b 
where a.uniquefield= b.uniquefield(+) and 
b.uniquefield = N_UNIQUE and 
b.uniquefield in 
    (select max(c.uniquefield) from customerdb.customer_detail c group by uniquefield); 

if 
D_STARTDATE is not null 
then 
    V_TORF :='FALSE'; 
    RETURN(V_TORF); 
else 
    select expiredate into D_ACTDATE 
    from customerdb.customer 
    where customerdb.customer.uniquefield = N_UNIQUE; 
    IF 
     D_ACTDATE > SYSDATE 
     then 
     V_TORF :='TRUE'; 
     RETURN(V_TORF); 
    else 
     v_TORF :='FALSE'; 
     RETURN(V_TORF); 
    end if; 
end if; 
end; 

回答

4

你的程序似乎無法看到表customerdb.customer_detail。這可能是由於這樣的事實,即過程沒有啓用任何角色而被定義,並且您可能具有SELECT ANY TABLE特權的角色。來自security guide

擁有該過程的用戶還必須具有過程主體中引用的架構對象的權限。要創建程序,需要明確授予對程序所引用的所有對象必需的權限(系統或對象)。您無法通過角色獲取所需的權限。這包括在正在創建的過程中調用的任何過程的EXECUTE特權。

要看到,如果你的程序將能夠運行一個查詢,你可以已經禁用所有角色with the following command後用自己的用戶測試:你可能需要被授予SELECT

set role none 

你的情況直接向您的用戶發送特權:

GRANT SELECT ON customerdb.customer_detail TO <your_user>