2016-08-16 115 views
0

我需要執行更新每個返回的選擇,但我不知道我怎麼能做到這一點。POSTGRESQL - 功能選擇+更新

在火鳥我有這樣的代碼:

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' ; 

謝謝大家

+3

IIUC,你有{日期,時間}不同的領域,你想更新從{時間戳}列這些的組合。在這種情況下:你不需要遊標或循環,而且你不需要函數。 – joop

+0

@joop感謝您的回答。我需要創建一個新的更新功能並在我的函數中執行這個功能? –

+0

這可以簡單得多。 codigo_alteracao_convenio是'UNIQUE'專欄嗎?如果你提供你的Postgres版本和實際的表格定義(就像你應該*),一切都很清楚。 –

回答

-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是採用了與確定需要哪些數據工作。

+0

感謝您的回答。在我的情況下,我沒有「ID」列,當我執行此代碼時,會彈出以下錯誤:** ERROR:在「RETURNING」處或附近出現語法錯誤** –

+0

我試過RETURNING *,但不工作。彈出相同的錯誤消息。 –

+0

在「返回」中,您可以將字段列表作爲輸出ej:id,日期,其他...您需要標識行的字段。 此查詢是電路圖,您需要適應您的表格和需求。 –

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()代替。

或者,如果您需要更新前值: