具有嵌套if和多选的pl sql函数

时间:2011-11-22 15:12:21

标签: sql oracle function plsql

让我感到困惑的情况......

我有一个观点。视图有一个函数,它根据两个标准返回“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;

1 个答案:

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