Re: Function not RAISE NOTICE if a parameter is NULL - Mailing list pgsql-general

From Andre Lopes
Subject Re: Function not RAISE NOTICE if a parameter is NULL
Date
Msg-id t2w18f98e681005041712i8e2fec6ct3af77d38969f65e6@mail.gmail.com
Whole thread Raw
In response to Re: Function not RAISE NOTICE if a parameter is NULL  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Function not RAISE NOTICE if a parameter is NULL
List 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@sss.pgh.pa.us> wrote:
Andre Lopes <lopes80andre@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

pgsql-general by date:

Previous
From: Craig Ringer
Date:
Subject: Re: Please help me debug regular segfaults on 8.3.10
Next
From: Tom Lane
Date:
Subject: Re: Function not RAISE NOTICE if a parameter is NULL