Hi, 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 <t...@sss.pgh.pa.us> wrote: > Andre Lopes <lopes80an...@gmail.com> writes: > > If I use NULL in any parameter the function does not RAISE any NOTICE. I > > can't pass NULL values in parameters? > > Sure you can. Maybe you declared the function STRICT? That means to > not call it for a NULL. > > regards, tom lane >