【问题标题】:Explicit type PostgreSQL显式类型 PostgreSQL
【发布时间】:2023-01-07 00:20:01
【问题描述】:

我有个问题。有一个函数,计算部门的总预算,包括层次结构中较低的部门:

CREATE OR REPLACE FUNCTION PUBLIC.DEPT_BUDGET (DNO BPCHAR(3))
RETURNS TABLE (
    TOT DECIMAL(12,2)
)
AS $DEPT_BUDGET$
DECLARE sumb DECIMAL(12, 2);
DECLARE rdno BPCHAR(3)[];
DECLARE cnt INTEGER;
DECLARE I BPCHAR(3);
BEGIN
    tot = 0;

    SELECT "BUDGET" FROM department WHERE dept_no = dno INTO tot;

    SELECT count("BUDGET") FROM department WHERE head_dept = dno INTO cnt;

    IF cnt = 0 
    THEN RETURN QUERY SELECT "BUDGET" FROM department WHERE dept_no = dno;
    END IF;
    SELECT
        ARRAY_AGG(dept_no)
    FROM
        department
    WHERE
        head_dept = dno
    INTO
        rdno;
        
    FOREACH I IN ARRAY rdno
    LOOP
        SELECT * FROM DEPT_BUDGET(I) INTO SUMB;
        tot = tot + sumb;
    END LOOP;

END; $DEPT_BUDGET$ LANGUAGE plpgsql;

dept_nobpchar(3) 类型。当我尝试调用函数 SELECT public.dept_budget('000'::VARCHAR); 时,出现错误:SQL Error [42883]: ERROR: function dept_budget(integer) does not exist. No function matches the given name and argument types. You might need to add explicit type casts.

当我更改 bpcharchar 上的类型参数时,出现另一个错误:SQL Error [22004]: ERROR: FOREACH expression must not be null. 我不明白,为什么强制打字不起作用。我应该怎么办? Types of data

UPD: 是的,有bpchar,但我已经尝试在BPCHAR(3)上到处改VARCHAR(3),仍然有错误。

【问题讨论】:

  • 尝试将 VARCHAR、char、bpchar 替换为文本数据类型。 aslo count() 函数返回 bigint 而不是 int。
  • @jian 不幸的是,不幸的是,它没有帮助。 foreach 的结果仍然是 NULL。
  • 在您的问题中添加:1)department 中的dept_no 是什么类型? 2)为什么cast(dno as varchar)被声明为参数DNO VARCHAR(3)? 3)如果你做SELECT * FROM DEPT_BUDGET(I::varchar)会发生什么?
  • @AdrianKlaver 1)我添加截图; 2)我想,postgres 在某个阶段改变了类型; 3) 仍然是一个错误,即 Foreach 表达式不能为空。
  • 不要使用截图,将信息作为文本复制并粘贴到问题中。

标签: postgresql function casting plpgsql


【解决方案1】:

这个函数可以用 sql 而不是 plpgsql 来写。尝试这个 :

CREATE OR REPLACE FUNCTION PUBLIC.DEPT_BUDGET (DNO VARCHAR)
RETURNS DECIMAL(12,2) LANGUAGE sql AS $$
    SELECT sum( CASE
                  WHEN dept_no = dno
                  THEN budget
                  ELSE dept_budget(dept_no)
                END
              ) :: decimal(12,2)
      FROM department 
     WHERE dept_no = dno
        OR head_dept = dno ;
$$ ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多