让我感到困惑的情况......
我有一个观点。视图有一个函数,它根据两个标准返回“TRUE”或“FALSE”的文本字符串
该函数查看两个表。
条件1:客户表包含日期字段 - 如果系统日期是>它应该返回false的日期字段
条件2:customer表链接到customer_detail表。详细信息表中有时会有记录,有时候没有(因此我将外部联接sytax添加到查询中,但实际上没有做任何事情因为附加条件强制我认为是内部联接)。 customer_detail表中可以为customer表中的每条记录提供多条记录。如果详细信息表中有多个记录,我需要查看最近的记录最大值(uniquefield)。此表有一个日期字段。如果此字段不为null,则该函数应返回第一个条件的错误方法。
这就是我所拥有的。当我编译时,我得到两个错误:
忽略SQL语句 - 在第一个选择语句的第一行
和
错误(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;
答案 0 :(得分:4)
您的程序似乎无法查看表格customerdb.customer_detail
。这可能是因为在没有启用任何角色的情况下定义了过程,并且您可能具有SELECT ANY TABLE特权的角色。来自security guide:
拥有该过程的用户还必须具有过程体中引用的模式对象的权限。要创建一个过程,需要在过程引用的所有对象上明确授予(系统或对象) 。您无法通过角色获得所需的权限。这包括在正在创建的过程中调用的任何过程的EXECUTE特权。
要查看您的程序是否能够运行查询,您可以在禁用所有角色with the following command后与您的用户进行测试:
set role none
在您的情况下,您可能需要直接向您的用户授予SELECT权限:
GRANT SELECT ON customerdb.customer_detail TO <your_user>