Re: Function not RAISE NOTICE if a parameter is NULL

From: Andre Lopes <lopes80andre(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: postgresql Forums <pgsql-general(at)postgresql(dot)org>
Subject: Re: Function not RAISE NOTICE if a parameter is NULL
Date: 2010-05-05 00:12:47
Message-ID: t2w18f98e681005041712i8e2fec6ct3af77d38969f65e6@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

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 <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:

> Andre Lopes <lopes80andre(at)gmail(dot)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
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2010-05-05 00:25:50 Re: Function not RAISE NOTICE if a parameter is NULL
Previous Message Craig Ringer 2010-05-04 23:39:02 Re: Please help me debug regular segfaults on 8.3.10