> > Envie o conteudo de blah blah blah para analisarmos, deve ser nele.
> > Um sugestão, faça a mesma chamada que a aplicação faz pelo pgAdmin, a
> > mensagem de erro traz mais algumas informações uteis, como o número da
> > linha que deu o problema. Isso pode te ajudar. Ai você só envia a linha
> > com erro.
> >
> > Evandro
> 
> Evandro,
> No pgAdmin a chamada funciona!
> Mais diferenças: a versão do driver JDBC!
> No ambiente onde não funciona, estou usando a versão 8.3-603 JDBC 3.
> No ambiente onde funciona, uso alguma versão 8.1 ou 8.2. Sempre JDBC 3.
> Vou testar com outro driver e posto o resultado.

Testei com os seguintes drivers:
postgresql-8.0-310.jdbc3.jar
postgresql-8.1-412.jdbc3.jar
postgresql-8.2-508.jdbc3.jar
postgresql-8.3-603.jdbc3.jar

Todos apresentam a mesma mensagem de erro.

Segue a function completa...

-----------------------------------------
CREATE OR REPLACE FUNCTION message_sms_mt_consolidate(data_limite timestamp
without time zone)
  RETURNS integer AS
$BODY$
DECLARE
    mtrp RECORD;
    mtrp_found INTEGER;
BEGIN

        -- Insere na tabela temporaria todas as mensagens que serao
arquivadas
        EXECUTE '
        CREATE TEMP TABLE message_sms_mt_tmp AS
        SELECT
          smst_id,
          msmt_id,
          pers_id,
          smst_status,
          smst_error,
          smst_scheduled,
          smst_sent,
          smst_status_update,
          smst_mobile,
          smst_from,
          smst_body,
          acco_id,
          sect_id,
          smst_external_key
        FROM message_sms_mt
        WHERE smst_scheduled < ' || quote_literal($1) || '
        AND smst_status > 3;';
  
        -- Exclui da tabela quente todas as mensagens que serao arquivadas
        EXECUTE '
        DELETE
        FROM message_sms_mt 
        WHERE smst_id IN (
                SELECT smst_id
                FROM message_sms_mt_tmp)';


        -- Insere na tabela de historico todas as msgs da tabela temporaria
        EXECUTE '
        INSERT INTO message_sms_mt_history (
          smst_id,
          msmt_id,
          pers_id,
          smst_status,
          smst_error,
          smst_scheduled,
          smst_sent,
          smst_status_update,
          smst_mobile,
          smst_from,
          smst_body,
          acco_id,
          sect_id,
          smst_external_key)
        SELECT
          smst_id,
          msmt_id,
          pers_id,
          smst_status,
          smst_error,
          smst_scheduled,
          smst_sent,
          smst_status_update,
          smst_mobile,
          smst_from,
          smst_body,
          acco_id,
          sect_id,
          smst_external_key
        FROM message_sms_mt_tmp;';

        -- Verifica todas as mensagens da tabela temporaria
        FOR mtrp IN EXECUTE '
                SELECT  available.acco_id AS acco_id,
                        available.date AS mtrp_date,
                        coalesce(received_by_mobile.total,0) AS
received_by_mobile,
                        coalesce(received_by_mobile_unavailable.total,0) AS
received_by_mobile_unavailable,
                        coalesce(error.total,0) AS error,
                        coalesce(blocked.total,0) AS blocked
                FROM (
                        SELECT acco_id, cast(smst_scheduled AS date) AS date
                        FROM message_sms_mt_tmp
                        WHERE smst_status > 3
                          AND acco_id IS NOT NULL
                          AND smst_mobile NOT LIKE ' ||
quote_literal('5500%') || '
                        GROUP BY acco_id, date
                        ORDER BY acco_id ASC, date DESC
                        ) AS available
                FULL OUTER JOIN (
                        SELECT COUNT(*) AS total, acco_id,
cast(smst_scheduled AS date) AS date
                        FROM message_sms_mt_tmp
                        WHERE smst_status = 4
                          AND acco_id IS NOT NULL
                          AND smst_mobile NOT LIKE ' ||
quote_literal('5500%') || '
                        GROUP BY acco_id, date
                        ORDER BY acco_id ASC, date DESC
                        ) AS received_by_mobile
                ON available.acco_id = received_by_mobile.acco_id AND
available.date = received_by_mobile.date
                FULL OUTER JOIN (
                        SELECT COUNT(*) AS total, acco_id,
cast(smst_scheduled AS date) AS date
                        FROM message_sms_mt_tmp
                        WHERE smst_status = 6
                          AND acco_id IS NOT NULL
                          AND smst_mobile NOT LIKE ' ||
quote_literal('5500%') || '
                        GROUP BY acco_id, date
                        ORDER BY acco_id ASC, date DESC
                        ) AS received_by_mobile_unavailable
                ON available.acco_id =
received_by_mobile_unavailable.acco_id AND available.date =
received_by_mobile_unavailable.date
                FULL OUTER JOIN (
                        SELECT COUNT(*) AS total, acco_id,
cast(smst_scheduled AS date) AS date
                        FROM message_sms_mt_tmp
                        WHERE smst_status = 5
                          AND acco_id IS NOT NULL
                          AND smst_mobile NOT LIKE ' ||
quote_literal('5500%') || '
                        GROUP BY acco_id, date
                        ORDER BY acco_id ASC, date DESC
                        ) AS error
                ON available.acco_id = error.acco_id AND available.date =
error.date
                FULL OUTER JOIN (
                        SELECT COUNT(*) AS total, acco_id,
cast(smst_scheduled AS date) AS date
                        FROM message_sms_mt_tmp
                        WHERE smst_status = 10
                          AND acco_id IS NOT NULL
                          AND smst_mobile NOT LIKE ' ||
quote_literal('5500%') || '
                        GROUP BY acco_id, date
                        ORDER BY acco_id ASC, date DESC
                        ) AS blocked
                ON available.acco_id = blocked.acco_id AND available.date =
blocked.date
                ORDER BY acco_id, mtrp_date'

        LOOP

        IF (mtrp.acco_id IS NOT NULL AND mtrp.mtrp_date IS NOT NULL) 
        THEN
                RAISE NOTICE 'acco_id: % - %',mtrp.acco_id,mtrp.mtrp_date;

                EXECUTE ' SELECT COUNT(*) FROM message_sms_mt_report WHERE
acco_id = '
                        || mtrp.acco_id
                        || ' AND mtrp_date LIKE '
                        || quote_literal(mtrp.mtrp_date)
                INTO mtrp_found;
                
                RAISE NOTICE 'count: %',mtrp_found;

                IF mtrp_found = 0 THEN
                        --RAISE NOTICE 'Not found...';
                        EXECUTE 'INSERT INTO message_sms_mt_report ('
                                || 'acco_id,'
                                || 'mtrp_date,'
                                || 'mtrp_received_by_mobile,'
                                || 'mtrp_received_by_mobile_unavailable,'
                                || 'mtrp_error,'
                                || 'mtrp_blocked'
                                || ') VALUES ('
                                || mtrp.acco_id || ',' 
                                || quote_literal(mtrp.mtrp_date) || ','
                                || mtrp.received_by_mobile || ','
                                || mtrp.received_by_mobile_unavailable ||
','
                                || mtrp.error || ','
                                || mtrp.blocked
                                || ')';

                ELSE
                        --RAISE NOTICE 'Found!!!';
                        EXECUTE 'UPDATE message_sms_mt_report SET '
                                || ' mtrp_received_by_mobile =
mtrp_received_by_mobile + ' || mtrp.received_by_mobile
                                || ',mtrp_received_by_mobile_unavailable =
mtrp_received_by_mobile_unavailable + ' ||
mtrp.received_by_mobile_unavailable
                                || ',mtrp_error = mtrp_error + ' ||
mtrp.error
                                || ',mtrp_blocked = mtrp_blocked + ' ||
mtrp.blocked
                                || ' WHERE '
                                || ' acco_id = ' || mtrp.acco_id
                                || ' AND mtrp_date LIKE ' ||
quote_literal(mtrp.mtrp_date);
                END IF;
                        

        END IF;

        END LOOP;


        -- Apaga a tabela temporaria (caso encontre)
        EXECUTE 'DELETE FROM message_sms_mt_tmp';
        EXECUTE 'DROP TABLE message_sms_mt_tmp';


        RETURN 0;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
-----------------------------------------


Eduardo Bobsin Machado
________________________________

Human Mobile - Torpedos SMS
www.human.com.br
mail:       [EMAIL PROTECTED]
phone:   51 3346 8282

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a