POSTGRESQL - 功能选择+更新

时间:2016-08-16 14:59:51

标签: postgresql function plpgsql

我需要为每次返回选择执行更新,但我不知道我该怎么做。

在firebird中我有这段代码:

 BEGIN
  FOR
SELECT data_cadastro || ' ' || hora_cadastro  as data_hora_cadastro,codigo_alteracao_convenio  
  FROM CC_ALTERACAO_CONVENIO 
  INTO:data_hora_cadastro,codigo_alteracao_convenio

  DO
  BEGIN
    update CC_ALTERACAO_CONVENIO 
       set data_hora_cadastro = :data_hora_cadastro
     where codigo_alteracao_convenio = :codigo_alteracao_convenio;
  suspend;
  END
END

我希望在postgresql中更改功能。

我尝试了这个,但没有用,因为我不知道postgresql的语法我该怎么办。

CREATE OR REPLACE FUNCTION sim.ajuste_alteracao_convenio(OUT data_hora_cadastro character varying, OUT codigo_alteracao_convenio integer)
      RETURNS SETOF record AS
    $BODY$
    DECLARE
       v_data_hora_cadastro character varying;
       v_codigo_alteracao_convenio INTEGER;
      BEGIN
        RETURN QUERY 
            SELECT data_cadastro || ' ' || hora_cadastro  as data_hora_cadastro,codigo_alteracao_convenio
            FROM sim.CC_ALTERACAO_CONVENIO 


        --loop
        BEGIN
            update sim.CC_ALTERACAO_CONVENIO 
            set data_hora_cadastro = v_data_hora_cadastro
            where codigo_alteracao_convenio = v_codigo_alteracao_convenio;

        END
         --END LOOP;
      END;      
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100
      ROWS 1000;

有人可以给我一个方向,我该如何解决这个问题?

解决

create type foo as (
data_hora_cadastro timestamp, 
codigo_alteracao_convenio integer
)


CREATE OR REPLACE FUNCTION sim.ajuste_alteracao_convenio3() 
RETURNS SETOF foo AS
$BODY$
DECLARE
    r foo%rowtype;
BEGIN
    FOR r IN SELECT data_cadastro || ' ' || hora_cadastro  as data_hora_cadastro,codigo_alteracao_convenio FROM sim.CC_ALTERACAO_CONVENIO 
    LOOP
        update sim.CC_ALTERACAO_CONVENIO 
        set data_hora_cadastro = r.data_hora_cadastro
        where codigo_alteracao_convenio = r.codigo_alteracao_convenio;
        RETURN NEXT r; -- return current row of SELECT
    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;

谢谢大家

2 个答案:

答案 0 :(得分:0)

问题中缺少信息,但看起来您只需要一个简单的UPDATE with RETURNING

UPDATE sim.cc_alteracao_convenio a
SET    data_hora_cadastro = a.data_cadastro + a.hora_cadastro
RETURNING a.data_hora_cadastro, a.codigo_alteracao_convenio;

假设data_cadastro是数据类型datehora_cadastro是数据类型time。目前,您将两者都转换为text,连接并转换回timestamp。这比它需要的要昂贵得多。只需将两者加在一起:data_cadastro + hora_cadastro

UPDATE本身看起来像是在冗余地存储与功能相关的值。更新data_hora_cadastro后,您可以删除data_cadastrohora_cadastrocan

如果你肯定需要一个功能:

CREATE OR REPLACE FUNCTION sim.ajuste_alteracao_convenio3() 
  RETURNS TABLE (data_hora_cadastro        timestamp
               , codigo_alteracao_convenio integer) AS
$func$
   UPDATE sim.cc_alteracao_convenio a
   SET    data_hora_cadastro = a.data_cadastro + a.hora_cadastro
   RETURNING a.data_hora_cadastro, a.codigo_alteracao_convenio;
$func$  LANGUAGE sql;  -- never quote the language name

您无需创建复合类型,只需使用RETURNS TABLE()

或者,如果您需要pre-UPDATE值:

答案 1 :(得分:-1)

这就是我所做的,这是一个想法,但可能会激励你:

WITH insusu AS (
    SELECT data_cadastro || ' ' || hora_cadastro  
        as data_hora_cadastro,codigo_alteracao_convenio
    FROM sim.CC_ALTERACAO_CONVENIO 
    RETURNING id
)   
update sim.CC_ALTERACAO_CONVENIO 
        set data_hora_cadastro =:data_hora_cadastro
from insusu;

select *
from insusu;

Objetive使用with来确定需要工作的数据。