为啥这个函数总是返回0

Posted

技术标签:

【中文标题】为啥这个函数总是返回0【英文标题】:Why does this function always return 0为什么这个函数总是返回0 【发布时间】: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跨度> 【参考方案1】:

试试这个:

SELECT  
   ..
   QTYDEPOT( 1000000, p.m_product_id,to_date('7/7/2014','dd/mm/yyyy'),to_date('24/7/2014','dd/mm/yyyy')) as qtyDepot

您必须指定要传递给函数的日期格式,

希望这会有所帮助!

【讨论】:

【参考方案2】:

您在处理 DATE 时遇到问题。我建议您尝试像这样调用您的函数:

SELECT  
   ..
   QTYDEPOT( 1000000, p.m_product_id,DATE('2014-07-07'),DATE('2014-07-24')) as qtyDepot

如您所见,Oracle 标准格式为'yyyy-mm-dd' 我不知道是否需要DATE(...),但我习惯这样操作DATE:代码更清晰。

【讨论】:

我不认为DATE可以如上图那样使用。也许目的是使用TO_DATE 函数,如:TO_DATE('2014-07-24', 'YYYY-MM-DD')

以上是关于为啥这个函数总是返回0的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?

为啥函数返回的值总是 null 或 undefined?

为啥 Facebook PHP SDK getUser 总是返回 0?

为啥在按值返回时总是调用复制构造函数

为啥这个 Solidity 函数在断言后返回 0?

为啥这个回调中的条件总是返回false?