【发布时间】:2014-08-05 07:57:55
【问题描述】:
不知道为什么这个函数总是返回0
CREATE OR REPLACE FUNCTION QTYDEPOT(
p_org_id IN NUMBER,
p_product_id IN NUMBER,
p_datefrom IN DATE,
p_dateto IN DATE)
RETURN NUMBER
AS
qty NUMBER;
BEGIN
SELECT COALESCE(SUM(C_InvoiceLine.qtyinvoiced), 0)
INTO qty
FROM C_InvoiceLine
INNER JOIN C_invoice
ON (c_invoiceline.C_INVOICE_ID = c_invoice.C_INVOICE_ID)
INNER JOIN C_BPartner
ON (c_invoice.C_BPARTNER_ID = c_bpartner.C_BPARTNER_ID)
WHERE C_BPartner.ISSALESREP = 'N'
AND C_BPartner.ISEMPLOYEE = 'N'
AND c_bpartner.ISCUSTOMER = 'Y'
AND c_invoiceline.AD_org_id = p_org_id
AND c_invoiceline.m_product_id= p_product_id
AND c_invoice.DateInvoiced BETWEEN p_datefrom AND p_dateto;
RETURN qty ;
END;
P.S : 如果我删除关闭 where 的日期部分
c_invoice.DateInvoiced BETWEEN p_datefrom AND p_dateto;
函数返回实际值。
我这样称呼它
SELECT
..
QTYDEPOT( 1000000, p.m_product_id,'7/7/2014','24/7/2014') as qtyDepot
【问题讨论】:
-
那么对于您传入的值和日期,您在表中是否有任何匹配的记录?当您传递字符串并依赖隐式转换时,我通常会怀疑日期格式问题,但在这种情况下会出错(因为没有 24 个月)。
-
如果在函数外手动运行相同的查询会发生什么?
-
我猜你使用的是英国日期格式。为确保正确读取日期,我建议使用“24/Jul/2014”或 ISO 格式“2014-07-24”。
-
您需要先评估此查询 select * FROM C_InvoiceLine INNER JOIN C_invoice ON (c_invoiceline.C_INVOICE_ID = c_invoice.C_INVOICE_ID) INNER JOIN C_BPartner ON (c_invoice.C_BPARTNER_ID = c_bpartner.C_BPARTNER_ID) WHERE C_BPartner.ISSALESREP = 'N' AND C_BPartner.ISEMPLOYEE = 'N' AND c_bpartner.ISCUSTOMER = 'Y' AND c_invoiceline.AD_org_id = p_org_id AND c_invoiceline.m_product_id= p_product_id AND c_invoice.DateInvoiced BETWEEN p_datefrom AND p_dateto; RETURN qty ;你应该得到上述查询的记录..检查连接和 where 子句。
-
我在调用 date 时发现它必须是这样的 QTYDEPOT(1000000, p.m_product_id,'7/7/14','24/7/14') as qtyDepot跨度>
标签: sql oracle select plsql stored-functions