【发布时间】:2011-11-28 21:39:51
【问题描述】:
我有一个表,其中包含每个客户的记录(主表)。然后,我为一些客户准备了一张包含更多详细信息的表格。附加明细表有时在主表中没有记录。有时,详细表在主表中有多个记录,如果是这种情况,我需要最近的记录(因此是最大子选择)。
问题是我的函数只返回详细表中少数记录的值。如果我注释掉查看详细信息表的函数部分并仅返回 STAT3 值,它似乎可以工作。如何使下面的第二个选择语句仅在该查询有结果时才适用?
create or replace FUNCTION "F_RETURN_STAT" (
N_UNIQUE IN NUMBER)
RETURN VARCHAR2
IS
V_STAT3 varchar2(20);
V_STAT varchar2(20);
V_STAT2 varchar2(20);
D_ACTDATE date;
D_STARTDATE date;
BEGIN
select expire into D_ACTDATE
from main_table a
where a.uniquefield = N_UNIQUE;
IF
D_ACTDATE > SYSDATE
or
D_ACTDATE is null
then
V_STAT :='TRUE';
else
v_STAT :='FALSE';
end if;
select b.startdate into D_STARTDATE
from main_table a, detail_table b
where a.uniquefield= b.main_table_id(+) and
b.main_table_id = N_UNIQUE and
b.uniquefield in
(select max(c.uniquefield) from detail_table c group by main_table_id);
if
D_STARTDATE is not null
then
V_STAT2 :='FALSE';
end if;
if
V_STAT2 ='FALSE'
then
V_STAT3 :='FALSE';
ELSE
V_STAT3 := V_STAT;
end if ;
RETURN(V_STAT3);
end;
【问题讨论】:
-
如果您选择的唯一字段无论哪种方式都为空,那么进行外连接有什么意义?即使您完成了这项工作,
D_START_DATE仍然为空。 -
它不会总是为空。如果函数不为空,则该函数返回“FALSE”。如果它为空,则返回第一个查询的值和第一个 if 语句。抱歉,如果您不得不重新阅读此内容。我已多次更新此评论
-
我的意思是,如果
detail_table中没有行,无论您在查询中使用内部联接还是外部联接,您所询问的查询都会将null返回到D_STARTDATE。或者至少如果您使用的是显式游标,它会。实际上,您可以将联接更改为内部联接并捕获NO_ROW_FOUND错误,而不是尝试使外部联接起作用。 -
啊,好吧..我尝试添加一些东西来影响 STAT2 是否为空,但这不起作用。所以我想你必须明确添加一些东西来产生 null 否则它只会查看在详细表中有匹配记录的记录?