【问题标题】:Calling Postgres Stored Procedure with arguments and insert values from a given select使用参数调用 Postgres 存储过程并从给定的选择中插入值
【发布时间】:2016-02-12 20:03:42
【问题描述】:

假设我有一个 select 语句。

SELECT sensorname, starttime from sensors where id = ?;

它返回例如:

Value1 | 123456789
Value1 | 987465465

(开始时间是一个时间戳)

现在我想在我的 Postgres 中创建一个 StoredProcedure。

someProcedure(argumentId){
   Result r = SELECT sensorname, starttime from sensors where id = ?;

}

然后它应该遍历结果集,获取结果并将它们插入另一个表,最后从源表中删除旧的。

这可以通过存储过程实现吗?

编辑:我需要一个存储过程。

类似:

CREATE OR REPLACE FUNCTIONrollupMinutes(id bigint) RETURNS void AS $$

BEGIN
    var qry_rsult = SELECT sensorname, starttime from sensors where id = id;
    insert into rollup(qry_result)   
END;
$$ LANGUAGE plpgsql;

【问题讨论】:

    标签: database postgresql


    【解决方案1】:

    你可以像下面这样使用 CTE 来做到这一点(只有当你想避免一个函数

    WITH cte (id)
    AS (
        INSERT INTO another_table (sensorname,starttime)
        SELECT sensorname
              ,starttime
        FROM sensors WHERE id = id 
        returning id;
        )
    DELETE
    FROM
    sensors
    WHERE id IN (SELECT *FROM cte);
    

    通过创建一个函数,它可以像

    create or replace function fn(id int) returns void as
    $$
    insert into another_table(sensorname,starttime)  
    SELECT sensorname, starttime from sensors where id =id;
    delete from sensors where id =id;
    $$
    language sql
    

    用法:

    select fn(12)
    

    【讨论】:

    • 我不明白这个 cte 如何与函数配合使用
    • CTE 不适用于此处的功能,这是一种不同的方法,我添加了 CTE 方法仅供参考
    • 好的。好吧,谢谢。我真正想要的是从表中选择一个子集并将其插入到另一个表中。然后删除原始数据。我在你的回答中看不到这一点。尤其是在函数中(这对我来说很有趣)
    • @Christian insert into another_table(sensorname,starttime) SELECT sensorname, starttime from sensors where id =id; 将从sensors 表中选择`sensorname, starttime` 并将它们插入到另一个表的sensorname,starttime(或您想要的column1,column2)。之后delete from sensors where id =id; 将删除值来自表sensors
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多