如何在Postgres中执行函数

时间:2016-08-03 08:41:55

标签: postgresql plpgsql stored-functions

如何在Postgres中执行函数?

我尝试了以下内容:

select pricelimit();

但它给我的错误如下:

  

没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

这是功能:

CREATE OR REPLACE FUNCTION pricelimit(
    p_product_id numeric,
    p_pricelist_version_id numeric)
  RETURNS numeric AS
$BODY$
DECLARE
    v_Price     numeric;
    v_ProductPrice  numeric;
    bom     record;
BEGIN
    --  Try to get price from PriceList directly
    SELECT  COALESCE (SUM(PriceLimit), 0)
        INTO    v_Price
    FROM    M_PRODUCTPRICE
    WHERE M_PriceList_Version_ID=p_PriceList_Version_ID AND M_Product_ID=p_Product_ID;
    IF (v_Price = 0) THEN
        FOR bom in SELECT bl.M_Product_ID AS M_ProductBOM_ID, 
            CASE WHEN bl.IsQtyPercentage = 'N' THEN bl.QtyBOM ELSE bl.QtyBatch / 100 END AS BomQty , p.IsBOM 
        FROM PP_PRODUCT_BOM b
        INNER JOIN M_PRODUCT p ON (p.M_Product_ID=b.M_Product_ID)
        INNER JOIN PP_PRODUCT_BOMLINE bl ON (bl.PP_Product_BOM_ID=b.PP_Product_BOM_ID)
        WHERE b.M_Product_ID = p_Product_ID
        LOOP
            v_ProductPrice := Bompricelimit (bom.M_ProductBOM_ID, p_PriceList_Version_ID);
            v_Price := v_Price + (bom.BOMQty * v_ProductPrice);
        END LOOP;
    END IF;
    --
    RETURN v_Price;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

并且函数存在于数据库中 如何解决这个问题请帮帮我

2 个答案:

答案 0 :(得分:1)

您的功能需要两个参数,但您可以不使用任何参数。

你需要这样称呼它:

select pricelimit(4, 2);

其中4是参数p_product_id的值,而2是参数p_pricelist_version_id的值

有关更多示例和详细信息,请参阅手册:
https://www.postgresql.org/docs/current/static/sql-createfunction.html#SQL-CREATEFUNCTION-EXAMPLES

答案 1 :(得分:0)

根据您的功能定义

varone=`df -h | awk ' {print $1 }'`
vartwo=`df -h | awk ' NR == 2 {print $2","$3","$4","$5","$6 }'`
echo "$varone $vartwo" >> /home/jeevagan/test_scripts/sizes/excel.csv

函数调用将是那样的

CREATE OR REPLACE FUNCTION pricelimit(
    p_product_id numeric,
    p_pricelist_version_id numeric);

您必须传递参数p_product_id和p_pricelist_version_id。

如果要从参数传递默认值,我们必须更改函数定义,如下所示:

select pricelimit(10, 4);

然后你可以调用这样的函数

CREATE OR REPLACE FUNCTION pricelimit(
    p_product_id numeric default 0::numeric,
    p_pricelist_version_id numeric default 0::numeric)
  RETURNS numeric AS
$BODY$
DECLARE
    v_Price     numeric;
    v_ProductPrice  numeric;
    bom     record;
BEGIN

    --function Defination
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

希望你的怀疑得到澄清....