2014-03-31 28 views
0

您好我对Oracle Ebs相当陌生......我遇到了一个pl/sql函数,它正在检查iprocurement中的一个变量是否与指定的列表相关..我不确定如何编写SELECT 'Y'oracle中的PL/SQL函数EBS

function if_it (header_id NUMBER) RETURN CHAR IS 

    x_it CHAR(1); 
begin 

SELECT DISTINCT if_it 
into x_it 
FROM ( 
SELECT 'Y' if_it 
FROM po.po_requisition_lines pr 
where nvl(to_number(pr.attribute1), 0) IN (1,2,3) 
and pr.requisition_header_id = header_id 
UNION 
SELECT 'N' is_it FROM DUAL); 

return x_it; 

exception when others then -- returned Yes and No, so we want to retyurn Yes 
    return 'Y'; 
end if_it; 
+0

你能否澄清什么问题吗?也许这里有一种可能性,就是将查询修改为“count(*)”,并根据(count> 1)返回Y/N。 – Yavor

+0

什么是'SELECT'是'if_it'行呢,即内部选择如何工作.. – user3482112

回答

0

您走样“Y”为if_it当数据pr.attribute1的行是等于1,2或3而pr.requisition_header_id = header_id。因此,无论何时,po.po_requisition_lines pr表中的这两件事情都属实,您正在选择硬编码值'Y'。然后选择'N'并将其别名为is_it。因此,如果您通过的header_idpo.po_requisition_lines pr表中的pr.requisition_header_id不匹配,那么Select Distinct将仅返回'N'。如果你的header_id确实匹配,你会得到'Y'和'N'。

+0

嗨瑞安,感谢您的快速回复。我可以理解直到联盟的部分,但之后不知道你说的header_id不匹配的部分是什么意思。另外UNION SELECT'N'is_it FROM DUAL --- UNION SELECT'N'if_it FROM DUAL – user3482112

+0

OK Ryan,我想我明白了。谢谢 – user3482112

+0

联盟结合了两个选择语句(http://www.w3schools.com/sql/sql_union.asp)。对偶选择'N'将始终给出结果,并且结果始终为您提供的代码的'N'。 – CodeMonkey

0

当且仅当po.po_requisition_lines(其中属性1位于(1,2,3))中的记录中没有任何记录的requisition_header_id等于给定参数header_id时,该函数返回'N'。该定义有点过于复杂(可能更简单)。

整个select返回之一:

N 

Y 
N 

但后者因为into条款(其预计单列才会返回)将引发异常。

内部选择:相似,只是可能有几个记录与Y.(外部选择使用distinct子句删除重复项)。

+0

谢谢你一堆Yavor ...真的很感激 – user3482112

0

解决办法:

function if_it (p_header_id NUMBER) RETURN VARCHAR2 IS 
begin 
FOR cur IN (SELECT NULL FROM DUAL 
       WHERE EXISTS 
       (SELECT NULL 
       FROM po.po_requisition_lines pr 
       where nvl(to_number(pr.attribute1), 0) IN (1,2,3) 
       and pr.requisition_header_id = p_header_id) 
      ) LOOP 
    RETURN 'Y'; 
END LOOP; 
RETURN 'N'; 

end if_it;