Thanks for the reply. I have not call it STRICT...
The function is:
[code]
CREATE OR REPLACE FUNCTION "apr_insert_hist_2_1" (IN pNOME_VIEW varchar, IN pCHAVE_1 varchar, IN pVAL_CHAVE_1 varchar, IN pVAL_CHAVE_2 date, IN pVAL_CAMPO1 date, IN pVAL_COMENT varchar)
RETURNS void AS
$BODY$
DECLARE
pNOME_VIEW alias for $1;
pCHAVE_1 alias for $2;
pVAL_CHAVE_1 alias for $3;
pVAL_CHAVE_2 alias for $4;
pVAL_CAMPO_1 alias for $5;
pVAL_COMENT alias for $6;
vQUERY_COUNT varchar;
vCONTA int4;
vDAT_INICIO_0 date;
vDAT_FIM_0 date;
vMAX_DAT_INICIO_MAI_0 date;
-- vEMAIL_KEY varchar;
vDEBUG varchar;
vDEBUG_2 varchar;
BEGIN
-- Condições para se abortar a função
-- Verificar que a dat_inicio está preenchida, não pode estar a nulo.
IF pVAL_CHAVE_2 ISNULL THEN
RAISE NOTICE 'O campo data inicio não pode ser nulo.';
RETURN; /* Sai da função */
END IF;
-- Verificar que a dat_fim é maior que a dat_inicio.
IF pVAL_CHAVE_2 > pVAL_CAMPO1 THEN
RAISE NOTICE 'O campo data fim tem de ser maior que o campo data inicio.';
RETURN; /* Sai da função */
END IF;
-- Vou verificar se já existe algum registo para o ID_ANUNCIO_EXTERNO
EXECUTE 'SELECT COUNT(*) as conta FROM '
|| quote_ident(pNOME_VIEW)
|| ' WHERE '
|| quote_ident(pCHAVE_1)
|| ' = '
|| quote_literal(pVAL_CHAVE_1)
INTO STRICT vCONTA;
-- Para DEBUG
-- RAISE NOTICE 'Contagem: %', vCONTA;
-- Verificar se existem registos na tabela
-- Se não existirem registos, entra aqui.
IF vCONTA = 0 THEN
RAISE NOTICE 'entrou aqui 0';
-- Fazer o INSERT dinamico como primeiro registo do ID_QQ_COISA
EXECUTE 'INSERT INTO '
|| quote_ident(pNOME_VIEW)
|| ' ('
|| quote_ident(pCHAVE_1)
|| ', DAT_INICIO, DAT_FIM, COMENT) values ('
|| quote_literal(pVAL_CHAVE_1)
|| ', '
|| quote_literal(pVAL_CHAVE_2)
|| ', '
|| quote_literal(pVAL_CAMPO1)
|| ', '
|| quote_literal(pVAL_COMENT)
|| ')';
RAISE NOTICE 'dat_inicio: %', vDAT_INICIO_0;
RAISE NOTICE 'dat_fim: %', vDAT_FIM_0;
-- RAISE NOTICE 'select: %', vDEBUG;
-- Se já existirem registo, entra aqui
ELSEIF vCONTA > 0 THEN
RAISE NOTICE 'entrou aqui > 0';
-- Vou verificar que a dat_inicio agora inserida não é maior que a
-- última dat_inicio para o ID_QQ_COISA.
-- Vou ver qual a dat_inicio máxima para o ID_QQ_COISA
EXECUTE 'SELECT MAX(dat_inicio) AS max_dat_inicio FROM '
|| quote_ident(pNOME_VIEW)
|| ' WHERE '
|| quote_ident(pCHAVE_1)
|| ' = '
|| quote_literal(pVAL_CHAVE_1)
INTO STRICT vMAX_DAT_INICIO_MAI_0;
-- Vou verificar que a nova data inserida agora não é inferior à data máxima.
IF pVAL_CHAVE_2 < vMAX_DAT_INICIO_MAI_0 THEN
RAISE NOTICE 'A data inicio tem de ser maior que o campo data inicio anterior.';
RETURN; /* Sai da função */
END IF;
-- Vou inserir uma nova linha
-- SELECT dat_inicio FROM aae_hist_anuncios WHERE id_anuncio_externo = '5';
-- select max(dat_inicio) as max_dat_inicio from atae_hist_anuncios
END IF;
END;
$BODY$
LANGUAGE PLpgSQL
RETURNS NULL ON NULL INPUT
VOLATILE
EXTERNAL SECURITY INVOKER;
[/code]
I'm doing something wrong?
Best Regards,
On Tue, May 4, 2010 at 11:23 PM, Tom Lane <tgl@xxxxxxxxxxxxx> wrote:
Andre Lopes <lopes80andre@xxxxxxxxx> writes:Sure you can. Maybe you declared the function STRICT? That means to
> If I use NULL in any parameter the function does not RAISE any NOTICE. I
> can't pass NULL values in parameters?
not call it for a NULL.
regards, tom lane