PostgreSQL函数数字类型错误

jde*_*vio 4 sql postgresql ddl stored-functions

我正在尝试在PostgreSQL中创建一个存储过程。当我使用时float,该函数有效,但是当我尝试将floats 更改numeric为时出现错误:

ERROR: cannot change return type of existing function
SQL state: 42P13
Detail: Row type defined by OUT parameters is different.
Hint: Use DROP FUNCTION percent_grades(text) first.
Run Code Online (Sandbox Code Playgroud)

我真的不知道这是什么意思,但是除了CAST更改,我不需要执行任何其他操作type

我的职能是:

CREATE OR REPLACE FUNCTION percent_grades(text)
RETURNS TABLE(grade text, percent float)
AS
  $$
    DECLARE percent_total float;
    BEGIN
      RETURN QUERY
        SELECT psa_grade_name, 
               SUM(psa_amount) / CAST(total_cards($1) AS float) AS percent_total
        FROM psa_pop_view
        WHERE psa_card = $1
        GROUP BY psa_grade_name
        ORDER BY psa_grade_name;
    END;
  $$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我想替换float为s numeric(5, 4)

Mur*_*nik 5

一个create or replace语句不能更改函数的签名。如错误所示,您必须首先删除该函数:

DROP FUNCTION percent_grades(text);
Run Code Online (Sandbox Code Playgroud)

然后才用正确的签名重新创建它:

CREATE OR REPLACE FUNCTION percent_grades(text)
RETURNS TABLE(grade text, percent numeric(5,4))
AS
  $$
    DECLARE percent_total float;
    BEGIN
      RETURN QUERY
        SELECT psa_grade_name, 
               SUM(psa_amount) / CAST(total_cards($1) AS float) AS percent_total
        FROM psa_pop_view
        WHERE psa_card = $1
        GROUP BY psa_grade_name
        ORDER BY psa_grade_name;
    END;
  $$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)