- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 plpgpsql 函数的 RETURNS TABLE 中添加字段,我要添加的值在函数内部执行的 SELECT 中不存在:
我有这个函数,它在开始日期和结束日期(纪元时间戳)之间每隔“步”秒对作业使用的 cpu 和 ram 的总和进行采样:
CREATE OR REPLACE FUNCTION resources(start_date INTEGER, end_date INTEGER, step INTEGER)
RETURNS TABLE (
cpu bigint
, ram bigint) AS $$
DECLARE
counter INTEGER := 0 ;
BEGIN
counter := start_date;
LOOP
EXIT WHEN counter > end_date ;
RETURN QUERY EXECUTE
'SELECT sum(j_ram) as ram, sum(j_cpu) as cpu from jobs where j_start_time <= ' || counter || ' and j_end_time >= ' || counter;
counter := counter + step ;
END LOOP ;
END;
$$ LANGUAGE plpgsql;
输出的结果是这样的:
cpu | ram
-------+------
0 |
6 | 12000
6 | 11000
1 | 1000
如何在表中添加变量 'counter' 的值使其具有类似的内容:
cpu | ram | counter
-------+-------+--------
0 | | 100
6 | 12000 | 110
6 | 11000 | 120
1 | 1000 | 130
最佳答案
您的情况实际上不需要 EXECUTE
,因为没有动态参数,如表名、列名等。它只是传递给 where 子句的值发生变化。计数器可以是选择的一部分。
CREATE OR REPLACE FUNCTION resources(start_date INTEGER, end_date INTEGER,
step INTEGER)
RETURNS TABLE (
cpu bigint
, ram bigint
, counter int) AS $$
DECLARE
counter INTEGER := 0 ;
BEGIN
counter := start_date;
LOOP
EXIT WHEN counter > end_date ;
RETURN QUERY
SELECT sum(j_ram)::bigint as ram, sum(j_cpu)::bigint as cpu,
counter from jobs
where j_start_time <= counter
and j_end_time >= counter;
counter := counter + step ;
END LOOP ;
END;
$$ LANGUAGE plpgsql;
我建议您避免循环,使用 generate_series
的单个查询就足够了。该函数可以是一个简单的 SQL 函数,除非您有任何其他需要做而不是只返回一个查询结果。
CREATE OR REPLACE FUNCTION resources2(start_date INTEGER, end_date INTEGER,
step INTEGER)
RETURNS TABLE (
cpu bigint
, ram bigint
, counter int) AS $$
SELECT sum(j_ram) :: BIGINT AS ram,
sum(j_cpu) :: BIGINT AS cpu,
g.counter
FROM jobs j
JOIN (SELECT generate_series(start_date, end_date, step) AS counter) g
ON j_start_time <= g.counter
AND j_end_time >= g.counter
GROUP BY g.counter
ORDER BY g.counter;
$$ LANGUAGE sql;
关于postgresql - 在 RETURNS TABLE pgplsql 函数中添加字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54922194/
我们有以下存储过程,最近在 postgres 数据库中对大量日期执行非常慢。问题: 我们解析一个字符串的性质(第一个数字是行的id,第二个是状态) ||2|0||3|1||4|0|| 用java这样的
如何在 plpgpsql 函数的 RETURNS TABLE 中添加字段,我要添加的值在函数内部执行的 SELECT 中不存在: 我有这个函数,它在开始日期和结束日期(纪元时间戳)之间每隔“步”秒对作
我正在使用 Heroku 开发一个应用程序,但他们没有为 Postgres 加载 plpgsql 语言,这在尝试运行以下命令时会导致问题: CREATE FUNCTION profiles_searc
我刚刚尝试创建我的第一个 plpgsql 函数。执行脚本时,我得到 错误:语言“‘plpgsql’”不存在 然后我运行命令 CREATE LANGUAGE plpgsql;显示以下错误: 错误:语言“
当从带有 EXCEPTION WHEN OTHERS block 的 PGPLSQL 函数调用执行插入的 SQL 函数时,如果违反的外键约束是可延迟的,则引发异常而不是捕获异常。 我正在使用 Amaz
我是一名优秀的程序员,十分优秀!