【问题标题】: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跨度>

标签: sql oracle select plsql stored-functions


【解决方案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')
    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 2016-03-30
    • 2019-05-20
    • 1970-01-01
    • 2015-09-29
    • 2020-06-17
    • 2021-01-24
    相关资源
    最近更新 更多