【发布时间】: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_no 有 bpchar(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.
当我更改 bpchar 或 char 上的类型参数时,出现另一个错误: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