首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL函数错误

PostgreSQL函数错误
EN

Stack Overflow用户
提问于 2014-07-30 02:09:59
回答 2查看 38关注 0票数 1

我需要一些帮助来解决我的PostgreSQL 9.1函数的问题:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION COMMISSION_MARGIN(Aiid NUMERIC) RETURNS NUMERIC AS $$
    DECLARE
           COMISSAO NUMERIC;
           TOTAL_SEM_IMPOSTO NUMERIC;
    BEGIN
            COMISSAO='"SELECT SUM(ILA.QUANTITY) FROM INVOICE_LINE_AGENT AS ILA
                     INNER JOIN ACCOUNT_INVOICE_LINE AS AIL ON ILA.INVOICE_LINE_ID = AIL.ID
                     INNER JOIN ACCOUNT_INVOICE AS AI ON AI.ID = AIL.INVOICE_ID
                     WHERE AI.ID = Aiid GROUP BY AI.ID"';

            TOTAL_SEM_IMPOSTO='"SELECT SUM(AIL.PRICE_SUBTOTAL) FROM INVOICE_LINE_AGENT AS ILA
                     INNER JOIN ACCOUNT_INVOICE_LINE AS AIL ON ILA.INVOICE_LINE_ID = AIL.ID
                     INNER JOIN ACCOUNT_INVOICE AS AI ON AI.ID = AIL.INVOICE_ID
                     WHERE AI.ID = Aiid GROUP BY AI.ID"';
            RETURN ((COMISSAO/TOTAL_SEM_IMPOSTO)*100);
    END;
$$ LANGUAGE plpgsql;

函数调用:

代码语言:javascript
复制
SELECT 
     COMMISSION_MARGIN(AI.ID) AS "Margin (%)"
FROM
    ACCOUNT_INVOICE AS AI
INNER JOIN OTHER_TABLE AS OT ON ......

但我收到了这样的信息:

代码语言:javascript
复制
ERROR:  column "SELECT SUM(ILA.QUANTITY) FROM INVOICE_LINE_AGENT AS ILA
  " doesn't exists
CONTEXT:  PL/pgSQL function "commission_margin" line 6 at attribution
EN

回答 2

Stack Overflow用户

发布于 2014-07-30 02:16:29

您需要的是一个SELECT ... INTO,用于将sql查询返回的值放入这些变量中。类似于:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION COMMISSION_MARGIN(Aiid NUMERIC) RETURNS NUMERIC AS $$
    DECLARE
           COMISSAO NUMERIC;
           TOTAL_SEM_IMPOSTO NUMERIC;
    BEGIN
         SELECT SUM(ILA.QUANTITY) INTO COMISSAO 
           FROM INVOICE_LINE_AGENT AS ILA
                INNER JOIN ACCOUNT_INVOICE_LINE AS AIL 
                        ON ILA.INVOICE_LINE_ID = AIL.ID
                INNER JOIN ACCOUNT_INVOICE AS AI 
                        ON AI.ID = AIL.INVOICE_ID
          WHERE AI.ID = Aiid 
          GROUP BY AI.ID;

          SELECT SUM(ILA.PRICE_SUBTOTAL) INTO TOTAL_SEM_IMPOSTO 
            FROM INVOICE_LINE_AGENT AS ILA
                     INNER JOIN ACCOUNT_INVOICE_LINE AS AIL 
                             ON ILA.INVOICE_LINE_ID = AIL.ID
                     INNER JOIN ACCOUNT_INVOICE AS AI 
                             ON AI.ID = AIL.INVOICE_ID
           WHERE AI.ID = Aiid 
           GROUP BY AI.ID;

         RETURN ((COMISSAO/TOTAL_SEM_IMPOSTO)*100);
    END;
$$ LANGUAGE plpgsql;

作为一个加分,你应该在阅读异常处理时考虑一下。因为在使用SELECT ... INTO语句时,您可能会遇到一些问题,比如查询返回多个行,或者根本没有返回任何行。请参阅此处的文档:Executing a Query with a Single-Row Result

票数 2
EN

Stack Overflow用户

发布于 2014-07-30 02:55:26

在很大程度上简化了,不运行两个单独的查询,而只使用一个SQL函数:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION COMMISSION_MARGIN(Aiid NUMERIC)
  RETURNS NUMERIC AS
$func$

SELECT (SUM(ILA.QUANTITY) * 100) / SUM(AIL.PRICE_SUBTOTAL)
FROM   INVOICE_LINE_AGENT   ILA
JOIN   ACCOUNT_INVOICE_LINE AIL ON ILA.INVOICE_LINE_ID = AIL.ID
JOIN   ACCOUNT_INVOICE      AI  ON AI.ID = AIL.INVOICE_ID
WHERE  AI.ID = Aiid

$func$ LANGUAGE sql;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25022147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档