2016-08-16 4 views
0

Мне нужно выполнить обновление для каждого возврата выбора, но я не знаю, как это сделать.POSTGRESQL - FUNCTION SELECT + UPDATE

В Жар у меня есть этот код:

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; 

Цель СССР является использует с определить, с какими данными нужно работать.

+0

Спасибо за ответ.В моем случае у меня нет столбца «ID», когда я запускаю этот код, эта ошибка появляется: ** ОШИБКА: синтаксическая ошибка при или около «RETURNING» ** –

+0

Я пробовал RETURNING *, но не работал. Появится одно и то же сообщение об ошибке. –

+0

В «Возврате» вы можете поместить список полей в виде eup: ej: id, date, other ... поля, которые вам нужны для идентификации строки. Этот запрос схематичен, вам нужно будет адаптироваться к вашим таблицам и потребностям. –

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 является тип date данных и hora_cadastro является тип time данных. В настоящее время вы конвертируете оба значения в text, объединяете и отбрасываете до timestamp. Это намного дороже, чем нужно. Просто добавьте оба вместе: data_cadastro + hora_cadastro

Сам по себе UPDATE выглядит так, что вы сохраняете функционально зависимые значения избыточно. После того, как вы обновили data_hora_cadastro, вы можете отказаться от data_cadastro и hora_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() вместо этого.

Или, если вам нужны значения предварительно UPDATE: