Dickson,

seguem as modificações e o erro que estou tentando resolver no final. Veja
se consegui entender o que você me disse, por favor?

CREATE FUNCTION doc_pendentes() Returns void AS
$$

DECLARE
    doc_matric  varchar(15);
    doc_men1    varchar(76);
    doc_men2    varchar(76);
    doc_nomedoc varchar(50);

BEGIN

SELECT men_cal1||men_cal2, men_men1, men_men2

INTO doc_matric, doc_men1, doc_men2

FROM fai__men;


 WHILE doc_matric is not null

LOOP

if (UPPER(COALESCE(doc_men1,'')|| COALESCE(doc_men2,''))) LIKE
'%NASCIMENTO%' then

doc_nomedoc := 'Certidão de nascimento';

EXECUTE 'INSERT INTO' ||gvc_docpend|| '(' ||dcp_alumatric,dcp_aludocdescr||
') VALUES ('||doc_matric, doc_nomedoc|| )';

endif;

if (UPPER(COALESCE(doc_men1,'') || COALESCE(doc_men2,''))) LIKE
'%CASAMENTO%' then

doc_nomedoc := 'Certidão de casamento';

EXECUTE 'INSERT INTO'||gvc_docpend||' VALUES'||(doc_matric, doc_nomedoc)||;

endif;

if (UPPER(COALESCE(doc_men1,'') || COALESCE(doc_men2,''))) LIKE
'%HISTORICO%' then

doc_nomedoc := 'Histórico Escolar';

EXECUTE 'INSERT INTO'||gvc_docpend||' VALUES'||(doc_matric, doc_nomedoc)||;

endif;

if (UPPER(COALESCE(doc_men1,'') || COALESCE(doc_men2,''))) LIKE
'%IDENTIDADE%' then

doc_nomedoc := 'Documento de Identidade';

EXECUTE 'INSERT INTO'||gvc_docpend||' VALUES'||(doc_matric, doc_nomedoc)||;

endif;

if (UPPER(COALESCE(doc_men1,'') || COALESCE(doc_men2,''))) LIKE '%TITULO%'
then

doc_nomedoc := 'Título de eleitor';

EXECUTE 'INSERT INTO'||gvc_docpend||' VALUES'||(doc_matric, doc_nomedoc)||;

endif;

if (UPPER(COALESCE(doc_men1,'') || COALESCE(doc_men2,''))) LIKE
'%RESERVISTA%' then

doc_nomedoc := 'Certificado de Reservista';

EXECUTE 'INSERT INTO'||gvc_docpend||' VALUES'||(doc_matric, doc_nomedoc)||;

endif;

if (UPPER(COALESCE(doc_men1,'') || COALESCE(doc_men2,''))) LIKE '%FOTOS%'
then

doc_nomedoc := 'Fotos 3x4';

EXECUTE 'INSERT INTO'||gvc_docpend||' VALUES'||(doc_matric, doc_nomedoc)||;

endif

END LOOP;

END WHILE;

END FUNCTION $$ language plpgsql;


*Erro obtido:*

*Erro de SQL:*

ERRO:  mismatched parentheses
CONTEXT:  compile of PL/pgSQL function "doc_pendentes" near line 17


[]'s

Jeanne

Em 1 de julho de 2011 14:40, Jeanne Louize Emygdio <[email protected]
> escreveu:

> Boa tarde Dickson!
>
> Vou respondendo às suas colocações abaixo, ok?
>
> Em 1 de julho de 2011 13:45, Dickson S. Guedes <[email protected]>escreveu:
>
> Em 1 de julho de 2011 11:32, Jeanne Louize Emygdio
>> <[email protected]> escreveu:
>> [ ... ]
>> > Talvez uma rápida olhada de vocês já será suficiente para orientar meus
>> > primeiros passos.
>>
>> Vou tentar comentar o código por partes
>>
>>
>> > CREATE FUNCTION doc_pendentes() Returns void AS '
>>
>> Troque o apostofro por  $$.
>>
>>  Já corrigi essa falha de principiante!
>
>  > DECLARE
>> >     doc_matric  varchar(15);
>> >     doc_men1    varchar(76);
>> >     doc_men2    varchar(76);
>> >     gvc_docpend RECORD;
>>
>> gvc_docpend é uma tabela existente?
>>
>
> Sim, removi a declaração de RECORD que havia feito antes. Para usar a
> sugestão do JotaComm de usar o 'EXECUTE'.
>
>
>> > BEGIN
>> >
>> > SELECT men_cal1||men_cal2, men_men1, men_men2
>> > INTO doc_matric, doc_men1, doc_men2
>> > FROM fai__men;
>> > WHILE doc_matric is not null
>>
>> Percebo que nos IFs seguintes você testa se doc_men2 é null, voce já
>> poderia usar um COALESCE(doc_men2,'') ali acima.
>>
>> >
>> > LOOP
>> >
>> > if doc_men2 is not null then
>> >
>> > if UPPER(doc_men1||doc_men2) LIKE “%NASCIMENTO%” then
>> >
>> > INSERT INTO gvc_docpend (dcp_alumatric,dcp_aludocdescr,dcp_docentregue)
>> > VALUES (doc_matric,“Certidão de nascimento”)
>> >
>> > endif;
>>
>> Voce poderia evitar, com o COALESCE acima, este IF: 'if doc_men2 is
>> not null then'. A sua concatenação funcionaria dentro do UPPER sem
>> problemas e voce reduziria a duplicação de codigo depois do 'else if
>> is null then'.
>>
>
> Muito interessante isso, realmente o código está todo duplicado mesmo, eu
> iria posteriormente buscar uma forma de otimizar. Eu separei os dois
> blocos porque quando concatenava os campos e um era nulo, ficava tudo nulo e
> o resultado comprometido. Vou modificar e testar.
>
>
>>
>> /gvc_docpend/ espera 3 (três) atributos
>> (dcp_alumatric,dcp_aludocdescr,dcp_docentregue) mas voce só esta
>> passando 2 (dois) (doc_matric,“Certidão de nascimento”). Se um dos
>> valores tem um valor default definido ou voce omite ele do INSERT
>> INTO.. ou adiciona default no VALUES, como por exemplo:
>>
>> INSERT INTO gvc_docpend (dcp_alumatric,dcp_aludocdescr,dcp_docentregue)
>> VALUES (doc_matric,default, 'Certidão de nascimento');
>>
>
> Ok. Já retirei a chamada ao campo que está com valor default no banco.
>
>
>> Em tempo ';' após as instruções.
>>
>
> Pode puxar minhas orelhas, mas mesmo para as instruções dentro dos IFs
> tenho que colocar ';' no final? Sei que é uma pergunta muito básica, mas
> quando trabalhamos com várias linguagens a gente acaba se confundindo um
> pouco. Vou pesquisar no manual, ok?
>
>
>>
>> > END FUNCTION' language plpgsql;
>>
>> Utilize $$ no lugar deste apostrofo.
>>
>
> Já fiz isso também, seguindo a sua orientação anterior.
>
>>
>> Por fim, mas não menos importante, outra alternativa eh fazer via
>> SELECT. Um exemplo seria fazer em SQL mesmo e o seu código acima
>> poderia ser resumido para algo assim:
>>
>> INSERT INTO  gvc_docpend (dcp_alumatric, dcp_aludocdescr, dcp_docentregue)
>> SELECT doc_matric,
>>              'nao sei',
>>              CASE
>>                   WHEN COALESCE(doc_men1,'') || COALESCE(doc_men2,'')
>> LIKE “%NASCIMENTO%” THEN 'Certidão de nascimento'
>>                   WHEN COALESCE(doc_men1,'') || COALESCE(doc_men2,'')
>> LIKE “%CASAMENTO%” THEN 'Certidão de casamento'
>>                    ...
>>                    ...
>>                    ...
>>                   WHEN COALESCE(doc_men1,'') || COALESCE(doc_men2,'')
>> LIKE “%IDENTIDADE%” THEN 'Documento de identidade'
>>                   ELSE 'um valor default'
>>              END as documento
>> FROM fai__men
>> WHILE doc_matric is not null;
>>
>> Não tive tempo pra testar o exemplo acima, mas a logica seria mais ou
>> menos essa.
>>
>>
> Adorei esta sugestão, até porque, tirando a função COALESCE que eu não
> conhecia, já migrei dados de outras tabelas utilizando esta forma de
> sentença. Porém, receio que ela não poderia ser aplicada para este novo caso
> porque preciso verificar todas as condições para cada registro que for
> migrar de uma tabela para a outra e o case só me deixaria tratar uma
> condição por registro, não é? Por este  motivo tive que vir para o plpgsql.
>
>
>> []s
>> --
>> Dickson S. Guedes
>> mail/xmpp: [email protected] - skype: guediz
>> http://guedesoft.net - http://www.postgresql.org.br
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>
> Estou reorganizando o meu código e testando. Já, já posto novos resultados
> ou novas dúvidas. Muito obrigada pela atenção e pela educação dos assinantes
> desta lista. Há tempos que não contacto com pessoas assim.
>
> Grande abraço,
>
>
> Jeanne
>
> --
> "O bem que praticas em qualquer lugar será teu advogado em toda parte."
> Emmanuel
>



-- 
"O bem que praticas em qualquer lugar será teu advogado em toda parte."
Emmanuel
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a