AJUDA ... Erros na FUNCTION ( Erro: PLS-00103 )

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Selecionar tudo

CREATE OR REPLACE FUNCTION FC_TUSS_EMISSAO_SERVICO_GUIA (vNRAUTORIZACAO IN NUMBER)   -- Table AUTORIZACAO
                                                        RETURN NUMBER
                                                        IS vNRAUTORIZACAO  AUTORIZACAO.NRAUTORIZACAO%TYPE;

CURSOR cPROCURA IS SELECT CDSERVICO FROM SERVICO_DA_AUTORIZACAO
                          WHERE NRAUTORIZACAO = vNRAUTORIZACAO AND NRSEQ_SERV_AUTORIZACAO
                          IN (SELECT NRSEQ_SERV_AUTORIZACAO FROM SERVICO_DA_AUTORIZACAO);

/*
****************************************************************************************************************************
Criagco          : Daniel Rodrigo Marques Vitellozzi
Data             : 14/09/2010
Msdulo Principal : Produgco Midica - Autorizagco
Msdulos          : PM60FMAut
Objetivo         : Validar o campo CDSERVICO da tabela SERVICO_DA_AUTORIZACAO de uma determinada guia da tabela AUTORIZACAO.
Alteragues       :
+--------------------------------------------------------------------------------------------------------------------------+
| DATA       | RESPONSAVEL      | VERSAO | PENDJNCIA | ALTERACAO                                                           |
|------------+------------------+--------+-----------+---------------------------------------------------------------------|
| 14/09/2010 | Evandro Mizobuti |        |           |                                                                     |
+--------------------------------------------------------------------------------------------------------------------------+
Scripts         : SELECT * FROM AUTORIZACAO WHERE NRAUTORIZACAO = '385227'
                  SELECT * FROM SERVICO where CDSERVICO = '10106014'
                  SELECT * FROM SERVICO_TAB_REFER WHERE CDSERVICO = '10106014' -- TUSS
                  SELECT CDSERVICO FROM SERVICO_DA_AUTORIZACAO WHERE NRAUTORIZACAO LIKE '%385227%'
                         AND NRSEQ_SERV_AUTORIZACAO IN ( SELECT NRSEQ_SERV_AUTORIZACAO FROM SERVICO_DA_AUTORIZACAO )
****************************************************************************************************************************
*/
BEGIN
        OPEN cPROCURA;
                     IF NOT CDSERVICO IN ('40201171','40202690','40201180','40202720') AND (CDSERVICO = '40201082') AND (CDSERVICO <> '40202666')
                        OR NOT CDSERVICO IN ('40201082','40202690','40201180','40202720') AND (CDSERVICO = '40201171')
                        OR NOT CDSERVICO IN ('40201171','40201082','40201180','40202720') AND (CDSERVICO = '40202690')
                        OR NOT CDSERVICO IN ('40201171','40202690','40201082','40202720') AND (CDSERVICO = '40201180')
                        OR NOT CDSERVICO IN ('40201171','40202690','40201180','40201082') AND (CDSERVICO = '40202720')
                        OR (CDSERVICO = '40202666' AND CDSERVICO <> '40201082') THEN
                        IF (CDSERVICO = '20103263' AND CDSERVICO <> '20103271') OR (CDSERVICO = '20103271' AND CDSERVICO <> '20103263') THEN
                           IF (CDSERVICO = '40301354' AND CDSERVICO <> '40301362') OR (CDSERVICO = '40301362' AND CDSERVICO <> '40301354')
                           OR (CDSERVICO = '40701042' AND CDSERVICO <> '40701050') OR (CDSERVICO = '40701050' AND CDSERVICO <> '40701042')
                           OR (CDSERVICO = '40809099' AND CDSERVICO <> '41002024') OR (CDSERVICO = '41002024' AND CDSERVICO <> '40809099')
                           OR (CDSERVICO = '41001036' AND CDSERVICO <> '41001044') OR (CDSERVICO = '41001044' AND CDSERVICO <> '41001036') THEN
                              IF (CDSERVICO = '41203100' AND CDSERVICO <> '41203119') OR (CDSERVICO = '41203119' AND CDSERVICO <> '41203100') THEN
                                 IF (CDSERVICO = '41203020' AND NOT CDSERVICO IN ('41203038','41203046'))
                                 OR (CDSERVICO = '41203038' AND NOT CDSERVICO IN ('41203020','41203046'))
                                 OR (CDSERVICO = '41203046' AND NOT CDSERVICO IN ('41203038','41203020')) THEN
                                    IF (CDSERVICO = '41101014' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101081','41101090'))
                                    OR (CDSERVICO = '41101022' AND NOT CDSERVICO IN ('41101014','41101030','41101073','41101081','41101090'))
                                    OR (CDSERVICO = '41101030' AND NOT CDSERVICO IN ('41101022','41101014','41101073','41101081','41101090'))
                                    OR (CDSERVICO = '41101073' AND NOT CDSERVICO IN ('41101022','41101030','41101014','41101081','41101090'))
                                    OR (CDSERVICO = '41101081' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101014','41101090'))
                                    OR (CDSERVICO = '41101090' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101081','41101014')) THEN
                                       IF (CDSERVICO = '41101138' AND CDSERVICO <> '41101154') OR (CDSERVICO = '41101154' AND CDSERVICO <> '41101138') THEN
                                          IF (CDSERVICO = '41101189' AND NOT CDSERVICO IN ('41101200','41101219','41101278'))
                                          OR (CDSERVICO = '41101200' AND NOT CDSERVICO IN ('41101189','41101219','41101278'))
                                          OR (CDSERVICO = '41101219' AND NOT CDSERVICO IN ('41101200','41101189','41101278'))
                                          OR (CDSERVICO = '41101278' AND NOT CDSERVICO IN ('41101200','41101219','41101189')) THEN
                                             IF (CDSERVICO = '41101251' AND NOT CDSERVICO IN ('41101260','41101286','41101294'))
                                             OR (CDSERVICO = '41101260' AND NOT CDSERVICO IN ('41101251','41101286','41101294'))
                                             OR (CDSERVICO = '41101286' AND NOT CDSERVICO IN ('41101260','41101251','41101294'))
                                             OR (CDSERVICO = '41101294' AND NOT CDSERVICO IN ('41101260','41101286','41101251')) THEN
                                                IF (CDSERVICO = '30912059' AND CDSERVICO <> '30912067') OR (CDSERVICO = '30912067' AND CDSERVICO <> '30912059') THEN
                                                   IF (CDSERVICO = '30101492' AND CDSERVICO <> '30210119') OR (CDSERVICO = '30210119' AND CDSERVICO <> '30101492') THEN
                                                      IF (CDSERVICO = '31004113' AND CDSERVICO <> '31004130') OR (CDSERVICO = '31004130' AND CDSERVICO <> '31004113') THEN
                                                         IF (CDSERVICO = '30214041' AND CDSERVICO <> '30214050') OR (CDSERVICO = '30214050' AND CDSERVICO <> '30214041') THEN
                                                            IF (CDSERVICO = '31309020' AND CDSERVICO <> '31309062') OR (CDSERVICO = '31309062' AND CDSERVICO <> '31309020') THEN
                                                               IF (CDSERVICO = '20104081' AND CDSERVICO <> '20104103') OR (CDSERVICO = '20104103' AND CDSERVICO <> '20104081') THEN
                                                                  IF (CDSERVICO = '40103749' AND CDSERVICO <> '41401492') OR (CDSERVICO = '41401492' AND CDSERVICO <> '40103749') THEN
                                                                     IF (CDSERVICO = '40201210' AND CDSERVICO <> '40201228') OR (CDSERVICO = '40201228' AND CDSERVICO <> '40201210') THEN
                                                                        IF (CDSERVICO = '40201198' AND CDSERVICO <> '40201201') OR (CDSERVICO = '40201201' AND CDSERVICO <> '40201198') THEN
                                                                           IF (CDSERVICO = '40201252' AND CDSERVICO <> '40201260') OR (CDSERVICO = '40201260' AND CDSERVICO <> '40201252') THEN
                                                                              IF (CDSERVICO = '40201236' AND CDSERVICO <> '40201244') OR (CDSERVICO = '40201244' AND CDSERVICO <> '40201236') THEN
                                                                                 IF (CDSERVICO = '30205085' AND CDSERVICO <> '30403014') OR (CDSERVICO = '30403014' AND CDSERVICO <> '30205085') THEN
                                                                                    IF (CDSERVICO = '30201063' AND CDSERVICO <> '30203015') OR (CDSERVICO = '30203015' AND CDSERVICO <> '30201063') THEN
                                                                                       IF (CDSERVICO = '30724066' AND CDSERVICO <> '30724279') OR (CDSERVICO = '30724279' AND CDSERVICO <> '30724066') THEN
                                                                                          IF (CDSERVICO = '30724040' AND CDSERVICO <> '30724139') OR (CDSERVICO = '30724139' AND CDSERVICO <> '30724040') THEN
                                                                                             IF (CDSERVICO = '30725020' AND CDSERVICO <> '30725054') OR (CDSERVICO = '30725054' AND CDSERVICO <> '30725020') THEN
                                                                                                IF (CDSERVICO = '30725011' AND CDSERVICO <> '30725135') OR (CDSERVICO = '30725135' AND CDSERVICO <> '30725011') THEN
                                                                                                   IF (CDSERVICO = '30101220' AND CDSERVICO <> '30101239') OR (CDSERVICO = '30101239' AND CDSERVICO <> '30101220') THEN
                                                                                                      IF (CDSERVICO = '30601037' AND CDSERVICO <> '30601045') OR (CDSERVICO = '30601045' AND CDSERVICO <> '30601037') THEN
                                                                                                         IF (CDSERVICO = '30601096' AND CDSERVICO <> '30601150') OR (CDSERVICO = '30601150' AND CDSERVICO <> '30601096') THEN
                                                                                                            IF (CDSERVICO = '31103235' AND CDSERVICO <> '31103472') OR (CDSERVICO = '31103472' AND CDSERVICO <> '31103235') THEN
                                                                                                              Raise_Application_Error(-20101,'Guia Liberada !!!'); 
                                                                                                            END IF;
                                                                                                         END IF;
                                                                                                      END IF;
                                                                                                   END IF;
                                                                                                END IF;
                                                                                             END IF;
                                                                                          END IF;
                                                                                       END IF;
                                                                                    END IF;
                                                                                 END IF;
                                                                              END IF;
                                                                           END IF;
                                                                        END IF;
                                                                     END IF;
                                                                  END IF;
                                                               END IF;
                                                            END IF;
                                                         END IF;
                                                      END IF;
                                                   END IF;
                                                END IF;
                                             END IF;
                                          END IF;
                                       END IF;
                                    END IF;
                                 END IF;
                              END IF;
                           END IF;
                        END IF;
                     END IF;
          CLOSE cPROCURA;

          EXCEPTION WHEN OTHERS THEN
          IF cPROCURA%ISOPEN THEN
             RAISE_APPLICATION_ERROR(-20101,'Guia Liberada !!!');
             CLOSE cPROCURA;
          END IF;

RETURN(AcdErro = ('V049')); -- Retorna Erro de Guia Recusada !!!

END;

END FC_TUSS_EMISSAO_SERVICO_GUIA;

Por gentileza, estou elaborando uma FUNCTION para verificar se um determinado guia pode passar. Mas, está ocorrendo o erro PLS-00103
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

po cara..

eu contei.. são 31 IF e todos os 31 END IF.. rsrsrs

não tem como você saber a linha não?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Erro:

Selecionar tudo

    PLS-00103 found 'string' but expected one of the following: 'string'"},

    Cause: This error message is from the parser. It found a token (language element) that is inappropriate in this context.

    Action: Check previous tokens as well as the one given in the error message. The line and column numbers given in the error message refer to the end of the faulty language construct.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Desculpe o comentário, mas você tem diversas redundancias de código não acha?

Já no primeiro if você tem os seguintes controles:

Selecionar tudo

  If Not cdservico In ('40201171', '40202690', '40201180', '40202720')
     And (cdservico = '40201082')
     And (cdservico <> '40202666')
     Or Not cdservico In ('40201082', '40202690', '40201180', '40202720')
     And (cdservico = '40201171')
     Or Not cdservico In ('40201171', '40201082', '40201180', '40202720')
     And (cdservico = '40202690')
     Or Not cdservico In ('40201171', '40202690', '40201082', '40202720')
     And (cdservico = '40201180')
     Or Not cdservico In ('40201171', '40202690', '40201180', '40201082')
     And (cdservico = '40202720')
     Or (cdservico = '40202666' And cdservico <> '40201082') Then
Lendo a rotina numa rapida leitura ficou confuso quando que deveria entrar nesta cláusula. Pos acaso não faltam parenteses?

Mais uma coisa, o parametro da função tem o mesmo nome de uma variavel isto tende a causar erros... Como você sabe qual valor esta utilizando dentro do cursor??
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá Victor, Bom Dia.

Selecionar tudo

CREATE OR REPLACE FUNCTION FC_TUSS_EMISSAO_SERVICO_GUIA (vNRAUTORIZACAO IN NUMBER)   -- Table AUTORIZACAO
                                                        RETURN NUMBER
                                                        IS vNRAUTORIZACAO  AUTORIZACAO.NRAUTORIZACAO%TYPE;

CURSOR cPROCURA IS SELECT CDSERVICO FROM SERVICO_DA_AUTORIZACAO
                          WHERE NRAUTORIZACAO = vNRAUTORIZACAO AND NRSEQ_SERV_AUTORIZACAO
                          IN (SELECT NRSEQ_SERV_AUTORIZACAO FROM SERVICO_DA_AUTORIZACAO);

/*
****************************************************************************************************************************
Criagco          : Daniel Rodrigo Marques Vitellozzi
Data             : 14/09/2010
Msdulo Principal : Produgco Midica - Autorizagco
Msdulos          : PM60FMAut
Objetivo         : Validar o campo CDSERVICO da tabela SERVICO_DA_AUTORIZACAO de uma determinada guia da tabela AUTORIZACAO.
Alteragues       :
+--------------------------------------------------------------------------------------------------------------------------+
| DATA       | RESPONSAVEL      | VERSAO | PENDJNCIA | ALTERACAO                                                           |
|------------+------------------+--------+-----------+---------------------------------------------------------------------|
| 14/09/2010 | Evandro Mizobuti |        |           |                                                                     |
+--------------------------------------------------------------------------------------------------------------------------+
Scripts         : SELECT * FROM AUTORIZACAO WHERE NRAUTORIZACAO = '385227'
                  SELECT * FROM SERVICO where CDSERVICO = '10106014'
                  SELECT * FROM SERVICO_TAB_REFER WHERE CDSERVICO = '10106014' -- TUSS
                  SELECT CDSERVICO FROM SERVICO_DA_AUTORIZACAO WHERE NRAUTORIZACAO LIKE '%385227%'
                         AND NRSEQ_SERV_AUTORIZACAO IN ( SELECT NRSEQ_SERV_AUTORIZACAO FROM SERVICO_DA_AUTORIZACAO )
****************************************************************************************************************************
*/
BEGIN
        OPEN cPROCURA;
                     IF NOT CDSERVICO IN ('40201171','40202690','40201180','40202720') AND (CDSERVICO = '40201082') AND (CDSERVICO <> '40202666')
                        OR NOT CDSERVICO IN ('40201082','40202690','40201180','40202720') AND (CDSERVICO = '40201171')
                        OR NOT CDSERVICO IN ('40201171','40201082','40201180','40202720') AND (CDSERVICO = '40202690')
                        OR NOT CDSERVICO IN ('40201171','40202690','40201082','40202720') AND (CDSERVICO = '40201180')
                        OR NOT CDSERVICO IN ('40201171','40202690','40201180','40201082') AND (CDSERVICO = '40202720')
                        OR (CDSERVICO = '40202666' AND CDSERVICO <> '40201082') THEN
                        IF (CDSERVICO = '20103263' AND CDSERVICO <> '20103271') OR (CDSERVICO = '20103271' AND CDSERVICO <> '20103263') THEN
                           IF (CDSERVICO = '40301354' AND CDSERVICO <> '40301362') OR (CDSERVICO = '40301362' AND CDSERVICO <> '40301354')
                           OR (CDSERVICO = '40701042' AND CDSERVICO <> '40701050') OR (CDSERVICO = '40701050' AND CDSERVICO <> '40701042')
                           OR (CDSERVICO = '40809099' AND CDSERVICO <> '41002024') OR (CDSERVICO = '41002024' AND CDSERVICO <> '40809099')
                           OR (CDSERVICO = '41001036' AND CDSERVICO <> '41001044') OR (CDSERVICO = '41001044' AND CDSERVICO <> '41001036') THEN
                              IF (CDSERVICO = '41203100' AND CDSERVICO <> '41203119') OR (CDSERVICO = '41203119' AND CDSERVICO <> '41203100') THEN
                                 IF (CDSERVICO = '41203020' AND NOT CDSERVICO IN ('41203038','41203046'))
                                 OR (CDSERVICO = '41203038' AND NOT CDSERVICO IN ('41203020','41203046'))
                                 OR (CDSERVICO = '41203046' AND NOT CDSERVICO IN ('41203038','41203020')) THEN
                                    IF (CDSERVICO = '41101014' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101081','41101090'))
                                    OR (CDSERVICO = '41101022' AND NOT CDSERVICO IN ('41101014','41101030','41101073','41101081','41101090'))
                                    OR (CDSERVICO = '41101030' AND NOT CDSERVICO IN ('41101022','41101014','41101073','41101081','41101090'))
                                    OR (CDSERVICO = '41101073' AND NOT CDSERVICO IN ('41101022','41101030','41101014','41101081','41101090'))
                                    OR (CDSERVICO = '41101081' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101014','41101090'))
                                    OR (CDSERVICO = '41101090' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101081','41101014')) THEN
                                       IF (CDSERVICO = '41101138' AND CDSERVICO <> '41101154') OR (CDSERVICO = '41101154' AND CDSERVICO <> '41101138') THEN
                                          IF (CDSERVICO = '41101189' AND NOT CDSERVICO IN ('41101200','41101219','41101278'))
                                          OR (CDSERVICO = '41101200' AND NOT CDSERVICO IN ('41101189','41101219','41101278'))
                                          OR (CDSERVICO = '41101219' AND NOT CDSERVICO IN ('41101200','41101189','41101278'))
                                          OR (CDSERVICO = '41101278' AND NOT CDSERVICO IN ('41101200','41101219','41101189')) THEN
                                             IF (CDSERVICO = '41101251' AND NOT CDSERVICO IN ('41101260','41101286','41101294'))
                                             OR (CDSERVICO = '41101260' AND NOT CDSERVICO IN ('41101251','41101286','41101294'))
                                             OR (CDSERVICO = '41101286' AND NOT CDSERVICO IN ('41101260','41101251','41101294'))
                                             OR (CDSERVICO = '41101294' AND NOT CDSERVICO IN ('41101260','41101286','41101251')) THEN
                                                IF (CDSERVICO = '30912059' AND CDSERVICO <> '30912067') OR (CDSERVICO = '30912067' AND CDSERVICO <> '30912059') THEN
                                                   IF (CDSERVICO = '30101492' AND CDSERVICO <> '30210119') OR (CDSERVICO = '30210119' AND CDSERVICO <> '30101492') THEN
                                                      IF (CDSERVICO = '31004113' AND CDSERVICO <> '31004130') OR (CDSERVICO = '31004130' AND CDSERVICO <> '31004113') THEN
                                                         IF (CDSERVICO = '30214041' AND CDSERVICO <> '30214050') OR (CDSERVICO = '30214050' AND CDSERVICO <> '30214041') THEN
                                                            IF (CDSERVICO = '31309020' AND CDSERVICO <> '31309062') OR (CDSERVICO = '31309062' AND CDSERVICO <> '31309020') THEN
                                                               IF (CDSERVICO = '20104081' AND CDSERVICO <> '20104103') OR (CDSERVICO = '20104103' AND CDSERVICO <> '20104081') THEN
                                                                  IF (CDSERVICO = '40103749' AND CDSERVICO <> '41401492') OR (CDSERVICO = '41401492' AND CDSERVICO <> '40103749') THEN
                                                                     IF (CDSERVICO = '40201210' AND CDSERVICO <> '40201228') OR (CDSERVICO = '40201228' AND CDSERVICO <> '40201210') THEN
                                                                        IF (CDSERVICO = '40201198' AND CDSERVICO <> '40201201') OR (CDSERVICO = '40201201' AND CDSERVICO <> '40201198') THEN
                                                                           IF (CDSERVICO = '40201252' AND CDSERVICO <> '40201260') OR (CDSERVICO = '40201260' AND CDSERVICO <> '40201252') THEN
                                                                              IF (CDSERVICO = '40201236' AND CDSERVICO <> '40201244') OR (CDSERVICO = '40201244' AND CDSERVICO <> '40201236') THEN
                                                                                 IF (CDSERVICO = '30205085' AND CDSERVICO <> '30403014') OR (CDSERVICO = '30403014' AND CDSERVICO <> '30205085') THEN
                                                                                    IF (CDSERVICO = '30201063' AND CDSERVICO <> '30203015') OR (CDSERVICO = '30203015' AND CDSERVICO <> '30201063') THEN
                                                                                       IF (CDSERVICO = '30724066' AND CDSERVICO <> '30724279') OR (CDSERVICO = '30724279' AND CDSERVICO <> '30724066') THEN
                                                                                          IF (CDSERVICO = '30724040' AND CDSERVICO <> '30724139') OR (CDSERVICO = '30724139' AND CDSERVICO <> '30724040') THEN
                                                                                             IF (CDSERVICO = '30725020' AND CDSERVICO <> '30725054') OR (CDSERVICO = '30725054' AND CDSERVICO <> '30725020') THEN
                                                                                                IF (CDSERVICO = '30725011' AND CDSERVICO <> '30725135') OR (CDSERVICO = '30725135' AND CDSERVICO <> '30725011') THEN
                                                                                                   IF (CDSERVICO = '30101220' AND CDSERVICO <> '30101239') OR (CDSERVICO = '30101239' AND CDSERVICO <> '30101220') THEN
                                                                                                      IF (CDSERVICO = '30601037' AND CDSERVICO <> '30601045') OR (CDSERVICO = '30601045' AND CDSERVICO <> '30601037') THEN
                                                                                                         IF (CDSERVICO = '30601096' AND CDSERVICO <> '30601150') OR (CDSERVICO = '30601150' AND CDSERVICO <> '30601096') THEN
                                                                                                            IF (CDSERVICO = '31103235' AND CDSERVICO <> '31103472') OR (CDSERVICO = '31103472' AND CDSERVICO <> '31103235') THEN
                                                                                                              Raise_Application_Error(-20101,'Guia Liberada !!!'); 

                     END IF;
          CLOSE cPROCURA;

          EXCEPTION WHEN OTHERS THEN

          IF cPROCURA%ISOPEN THEN
             RAISE_APPLICATION_ERROR(-20101,'Guia Recusada !!!');
             CLOSE cPROCURA;
          END IF;

-- RETURN(AcdErro = ('V049'));
END FC_TUSS_EMISSAO_SERVICO_GUIA;
As linhas agora são 87 e 95 - PLS-00103 ... o que pode ser feito para melhorar essa FUNCTION? Realmente não sabia que apenas um END IF para vários IF. Desde já agradeço a ajuda !!!
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

o que eu quis dizer que tem muitos ifs porem todos estavam fechados corretamente..

isso que você falou somente vale se você usar o ELSIF..

Selecionar tudo

IF <condition_1> THEN ...

ELSIF <condition_2> THEN ...

... ...

ELSIF <condition_n> THEN ...

ELSE ...

END IF;
quais são as linhas q ta o erro??
pelo que vi e onde fecha o cursor e onde fecha a function.. estou certo?

alem da linha seria bom verificar a msg que e dada junto com o codigo do erro..

você ta com um ero de sintaxe meu brother.. tenha calma e matenha os olhos bem abertos..

:lol:
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Apenas mais um questionamento, eu entendi errado ou a regra da função seria algo como:

Se SERVICO_DA_AUTORIZACAO.CDSERVICO estiver dentre os códigos:

Selecionar tudo

'40201171','40202690','40201180','40202720','40201082','40202666','20103263','20103271',
'40301354','40301362','40701042','40701050','40809099','41002024','41001036','41001044',
'41203100','41203119','41203020','41203038','41203046','41101014','41101022','41101030',
'41101073','41101081','41101090','41101138','41101154','41101189','41101200','41101219',
'41101278','41101251','41101260','41101286','41101294','30912059','30912067','30101492',
'30210119','31004113','31004130','30214041','30214050','31309020','31309062','20104081',
'20104103','40103749','41401492','40201210','40201228','40201198','40201201','40201252',
'40201260','40201236','40201244','30205085','30403014','30201063','30203015','30724066',
'30724279','30724040','30724139','30725020','30725054','30725011','30725135','30101220',
'30101239','30601037','30601045','30601096','30601150','31103235','31103472'

a guia foi liberada?
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá Victor, Bom Dia.

Vejamos muito calma nessa hora ... vou precisar muito da sua ajuda ... realmente programar não é fácil !!!
Colocquei alguns exemplos e segui suas dicas, diminuiu bem as linhas ... mas, com o ELSIF ocorreu um erro abaixo ...

Agradeço sua atenção em me ajudar.

Selecionar tudo

CREATE OR REPLACE FUNCTION FC_TUSS_EMISSAO_SERVICO_GUIA (vNRAUTORIZACAO IN NUMBER)   -- Table AUTORIZACAO
                                                        RETURN NUMBER
                                                        IS vNRAUTORIZACAO  AUTORIZACAO.NRAUTORIZACAO%TYPE; -- Exemplo vNRAUTORIZACAO = 1000

CURSOR cPROCURA IS SELECT CDSERVICO FROM SERVICO_DA_AUTORIZACAO
                          WHERE NRAUTORIZACAO = vNRAUTORIZACAO /*vNRAUTORIZACAO = 1000*/ AND NRSEQ_SERV_AUTORIZACAO
                          IN (SELECT NRSEQ_SERV_AUTORIZACAO FROM SERVICO_DA_AUTORIZACAO); -- Exemplo Para a Guia 1000 com os códigos CDSERVICO = ( '99999999','88888888'

BEGIN
   OPEN cPROCURA; -- Exemplo ao alterar a vNRAUTORIZACAO = 1000 adicionando um novo código CDSERVICO = '40201082'
   BEGIN
      IF NOT ( CDSERVICO IN ('40201171','40202690','40201180','40202720') AND (CDSERVICO = '40201082') AND (CDSERVICO <> '40202666'))
         OR NOT ( CDSERVICO IN ('40201082','40202690','40201180','40202720') AND (CDSERVICO = '40201171')) 
         OR NOT ( CDSERVICO IN ('40201171','40201082','40201180','40202720') AND (CDSERVICO = '40202690'))
         OR NOT ( CDSERVICO IN ('40201171','40202690','40201082','40202720') AND (CDSERVICO = '40201180')) 
         OR NOT ( CDSERVICO IN ('40201171','40202690','40201180','40201082') AND (CDSERVICO = '40202720'))
         OR (CDSERVICO = '40202666' AND CDSERVICO <> '40201082') THEN
            ELSIF (CDSERVICO = '20103263' AND CDSERVICO <> '20103271') OR (CDSERVICO = '20103271' AND CDSERVICO <> '20103263') THEN

             ELSIF (CDSERVICO = '40301354' AND CDSERVICO <> '40301362') OR (CDSERVICO = '40301362' AND CDSERVICO <> '40301354') THEN
              ELSIF (CDSERVICO = '40701042' AND CDSERVICO <> '40701050') OR (CDSERVICO = '40701050' AND CDSERVICO <> '40701042') THEN
               ELSIF (CDSERVICO = '40809099' AND CDSERVICO <> '41002024') OR (CDSERVICO = '41002024' AND CDSERVICO <> '40809099') THEN
                ELSIF (CDSERVICO = '41001036' AND CDSERVICO <> '41001044') OR (CDSERVICO = '41001044' AND CDSERVICO <> '41001036') THEN
                 ELSIF (CDSERVICO = '41203100' AND CDSERVICO <> '41203119') OR (CDSERVICO = '41203119' AND CDSERVICO <> '41203100') THEN
                  ELSIF (CDSERVICO = '41203020' AND NOT CDSERVICO IN ('41203038','41203046'))
                     OR (CDSERVICO = '41203038' AND NOT CDSERVICO IN ('41203020','41203046')) 
                     OR (CDSERVICO = '41203046' AND NOT CDSERVICO IN ('41203038','41203020')) THEN
                   ELSIF (CDSERVICO = '41101014' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101081','41101090'))
                      OR (CDSERVICO = '41101022' AND NOT CDSERVICO IN ('41101014','41101030','41101073','41101081','41101090'))
                      OR (CDSERVICO = '41101030' AND NOT CDSERVICO IN ('41101022','41101014','41101073','41101081','41101090'))
                      OR (CDSERVICO = '41101073' AND NOT CDSERVICO IN ('41101022','41101030','41101014','41101081','41101090'))
                      OR (CDSERVICO = '41101081' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101014','41101090'))
                      OR (CDSERVICO = '41101090' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101081','41101014')) THEN
                    ELSIF (CDSERVICO = '41101138' AND CDSERVICO <> '41101154') OR (CDSERVICO = '41101154' AND CDSERVICO <> '41101138') THEN
                     ELSIF (CDSERVICO = '41101189' AND NOT CDSERVICO IN ('41101200','41101219','41101278'))
                        OR (CDSERVICO = '41101200' AND NOT CDSERVICO IN ('41101189','41101219','41101278'))
                        OR (CDSERVICO = '41101219' AND NOT CDSERVICO IN ('41101200','41101189','41101278'))
                        OR (CDSERVICO = '41101278' AND NOT CDSERVICO IN ('41101200','41101219','41101189')) THEN
                      ELSIF (CDSERVICO = '41101251' AND NOT CDSERVICO IN ('41101260','41101286','41101294'))
                         OR (CDSERVICO = '41101260' AND NOT CDSERVICO IN ('41101251','41101286','41101294'))
                         OR (CDSERVICO = '41101286' AND NOT CDSERVICO IN ('41101260','41101251','41101294'))
                         OR (CDSERVICO = '41101294' AND NOT CDSERVICO IN ('41101260','41101286','41101251')) THEN
                       ELSIF (CDSERVICO = '30912059' AND CDSERVICO <> '30912067') OR (CDSERVICO = '30912067' AND CDSERVICO <> '30912059') THEN
                        ELSIF (CDSERVICO = '30101492' AND CDSERVICO <> '30210119') OR (CDSERVICO = '30210119' AND CDSERVICO <> '30101492') THEN
                         ELSIF (CDSERVICO = '31004113' AND CDSERVICO <> '31004130') OR (CDSERVICO = '31004130' AND CDSERVICO <> '31004113') THEN
                          ELSIF (CDSERVICO = '30214041' AND CDSERVICO <> '30214050') OR (CDSERVICO = '30214050' AND CDSERVICO <> '30214041') THEN
                           ELSIF (CDSERVICO = '31309020' AND CDSERVICO <> '31309062') OR (CDSERVICO = '31309062' AND CDSERVICO <> '31309020') THEN
                            ELSIF (CDSERVICO = '20104081' AND CDSERVICO <> '20104103') OR (CDSERVICO = '20104103' AND CDSERVICO <> '20104081') THEN
                             ELSIF (CDSERVICO = '40103749' AND CDSERVICO <> '41401492') OR (CDSERVICO = '41401492' AND CDSERVICO <> '40103749') THEN
                              ELSIF (CDSERVICO = '40201210' AND CDSERVICO <> '40201228') OR (CDSERVICO = '40201228' AND CDSERVICO <> '40201210') THEN
                               ELSIF (CDSERVICO = '40201198' AND CDSERVICO <> '40201201') OR (CDSERVICO = '40201201' AND CDSERVICO <> '40201198') THEN
                                ELSIF (CDSERVICO = '40201252' AND CDSERVICO <> '40201260') OR (CDSERVICO = '40201260' AND CDSERVICO <> '40201252') THEN
                                 ELSIF (CDSERVICO = '40201236' AND CDSERVICO <> '40201244') OR (CDSERVICO = '40201244' AND CDSERVICO <> '40201236') THEN
                                  ELSIF (CDSERVICO = '30205085' AND CDSERVICO <> '30403014') OR (CDSERVICO = '30403014' AND CDSERVICO <> '30205085') THEN
                                   ELSIF (CDSERVICO = '30201063' AND CDSERVICO <> '30203015') OR (CDSERVICO = '30203015' AND CDSERVICO <> '30201063') THEN
                                    ELSIF (CDSERVICO = '30724066' AND CDSERVICO <> '30724279') OR (CDSERVICO = '30724279' AND CDSERVICO <> '30724066') THEN
                                     ELSIF (CDSERVICO = '30724040' AND CDSERVICO <> '30724139') OR (CDSERVICO = '30724139' AND CDSERVICO <> '30724040') THEN
                                      ELSIF (CDSERVICO = '30725020' AND CDSERVICO <> '30725054') OR (CDSERVICO = '30725054' AND CDSERVICO <> '30725020') THEN
                                       ELSIF (CDSERVICO = '30725011' AND CDSERVICO <> '30725135') OR (CDSERVICO = '30725135' AND CDSERVICO <> '30725011') THEN
                                        ELSIF (CDSERVICO = '30101220' AND CDSERVICO <> '30101239') OR (CDSERVICO = '30101239' AND CDSERVICO <> '30101220') THEN
                                         ELSIF (CDSERVICO = '30601037' AND CDSERVICO <> '30601045') OR (CDSERVICO = '30601045' AND CDSERVICO <> '30601037') THEN
                                          ELSIF (CDSERVICO = '30601096' AND CDSERVICO <> '30601150') OR (CDSERVICO = '30601150' AND CDSERVICO <> '30601096') THEN
                                           ELSIF (CDSERVICO = '31103235' AND CDSERVICO <> '31103472') OR (CDSERVICO = '31103472' AND CDSERVICO <> '31103235') THEN
      ELSE
         Raise_Application_Error(-20101,'Guia Liberada !!!'); -- Pois a regra foi aceita na primeira condição onde a guia só possuia os códigos CDSERVICO = ( '99999999','88888888'
      END IF;
         CLOSE cPROCURA;

      IF cPROCURA%ISOPEN THEN
         RAISE_APPLICATION_ERROR(-20101,'Guia Inexistente !!!');
         CLOSE cPROCURA;
      END IF;

-- RETURN(AcdErro = ('V049'));
END FC_TUSS_EMISSAO_SERVICO_GUIA;

Selecionar tudo

Compilation errors for FUNCTION CUSTOM.FC_TUSS_EMISSAO_SERVICO_GUIA

Error: PLS-00103: Encontrado o simbolo "OR" quando um dos seguintes simbolos era esperado:
       
          := . ( % ;
Line: 39
Text: OR (CDSERVICO = '41101260' AND NOT CDSERVICO IN ('41101251','41101286','41101294'))

Error: PLS-00103: Encontrado o simbolo "THEN" quando um dos seguintes simbolos era esperado:
       
          * & = - + ; < / > at in is mod not rem return returning
          <an exponent (**)> <> or != or ~= >= <= <> and or like
          between overlaps || year DAY_
Line: 39
Text: OR (CDSERVICO = '41101260' AND NOT CDSERVICO IN ('41101251','41101286','41101294'))

Error: Hint: Function 'FC_TUSS_EMISSAO_SERVICO_GUIA' does not return a value
Line: 22
Text: ELSIF (CDSERVICO = '41001036' AND CDSERVICO <> '41001044') OR (CDSERVICO = '41001044' AND CDSERVICO <> '41001036') THEN
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Vou tentar te ajudar.

Pelo começo:

1 - você esta criando uma função então é obrigado a ter ao menus um comando Return!

2 - você ainda esta com uma variavel com o mesmo nome de um parametro da função.

3 - Você usar elsif significa que pra cada comando Then você previsa de uma ação antes de chamar o próximo elsif.

4 - Sua função possui erros de sintaxe por isso não compila.

Qual é a regra a ser atingida pela função?
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Olá Vitellozi,

Como o gfkauer já mencionou... você precisa repensar esse código todo, pois os IFs estão sem sentido.

Por exemplo:

Selecionar tudo

(CDSERVICO = '40301354' AND CDSERVICO <> '40301362')
O que você quer dizer com isso acima? Obviamente que, se CDSERVICO for igual a X ele vai ser sempre diferente de Y. CDSERVICO só pode possuir um valor num dados instante.

Recomendo fortemente repensar toda a lógica, explicar para nós o que você gostaria de alcançar, em português, não em código, e de repente podemos auxiliá-lo.
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá Pessoal, Boa Tarde.

Desde já agradeço a ajuda de todos.

1 - você esta criando uma função então é obrigado a ter ao menus um comando Return!

Selecionar tudo

CREATE OR REPLACE FUNCTION FC_TUSS_EMISSAO_SERVICO_GUIA (vGUIATUSS IN NUMBER)   -- Table AUTORIZACAO
                                                        RETURN NUMBER
2 - você ainda esta com uma variavel com o mesmo nome de um parametro da função.

Mudei a vNRAUTORIZACAO para vGUIATUSS

3 - Você usar elsif significa que pra cada comando Then você previsa de uma ação antes de chamar o próximo elsif.

Acrescentei a mensagem e finalizei o CURSOR para cada condição.

4 - Sua função possui erros de sintaxe por isso não compila.



Qual é a regra a ser atingida pela função?

A Regra é ao incluir ou alterar uma determinada guia (NRAUTORIZACAO).
Se a guia possuir por exemplo o código '40201082' (CDSERVICO) na primeira condição.
Pode incluir qualquer outro código mas, diferente de '40202666', além dos outros '40201171','40202690','40201180','40202720'.
E assim por adiante ... ou seja para incluir um código em uma determinada guia, só dentro dessas condições criadas.

SEGUE NOVAMENTE COM AS ALTERAÇÕES

Selecionar tudo

CREATE OR REPLACE FUNCTION FC_TUSS_EMISSAO_SERVICO_GUIA (vGUIATUSS IN NUMBER)   -- Table AUTORIZACAO

                                                        RETURN NUMBER
                                                        IS vGUIATUSS  AUTORIZACAO.NRAUTORIZACAO%TYPE;

CURSOR cPROCURA IS SELECT CDSERVICO FROM SERVICO_DA_AUTORIZACAO
                          WHERE NRAUTORIZACAO = vGUIATUSS AND NRSEQ_SERV_AUTORIZACAO
                          IN (SELECT NRSEQ_SERV_AUTORIZACAO FROM SERVICO_DA_AUTORIZACAO);

BEGIN
   OPEN cPROCURA;

      IF cPROCURA%ISOPEN THEN
         RAISE_APPLICATION_ERROR(-20101,'Guia Inexistente !!!');
         CLOSE cPROCURA;
      END IF;

      IF NOT ( CDSERVICO IN ('40201171','40202690','40201180','40202720') AND (CDSERVICO = '40201082') AND (CDSERVICO <> '40202666'))
         OR NOT ( CDSERVICO IN ('40201082','40202690','40201180','40202720') AND (CDSERVICO = '40201171')) 
         OR NOT ( CDSERVICO IN ('40201171','40201082','40201180','40202720') AND (CDSERVICO = '40202690'))
         OR NOT ( CDSERVICO IN ('40201171','40202690','40201082','40202720') AND (CDSERVICO = '40201180')) 
         OR NOT ( CDSERVICO IN ('40201171','40202690','40201180','40201082') AND (CDSERVICO = '40202720'))
         OR (CDSERVICO = '40202666' AND CDSERVICO <> '40201082') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
         CLOSE cPROCURA;
            ELSIF (CDSERVICO = '20103263' AND CDSERVICO <> '20103271') OR (CDSERVICO = '20103271' AND CDSERVICO <> '20103263') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
            CLOSE cPROCURA;
             ELSIF (CDSERVICO = '40301354' AND CDSERVICO <> '40301362') OR (CDSERVICO = '40301362' AND CDSERVICO <> '40301354') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
             CLOSE cPROCURA;
              ELSIF (CDSERVICO = '40701042' AND CDSERVICO <> '40701050') OR (CDSERVICO = '40701050' AND CDSERVICO <> '40701042') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
              CLOSE cPROCURA;
               ELSIF (CDSERVICO = '40809099' AND CDSERVICO <> '41002024') OR (CDSERVICO = '41002024' AND CDSERVICO <> '40809099') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
               CLOSE cPROCURA;
                ELSIF (CDSERVICO = '41001036' AND CDSERVICO <> '41001044') OR (CDSERVICO = '41001044' AND CDSERVICO <> '41001036') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                CLOSE cPROCURA;
                 ELSIF (CDSERVICO = '41203100' AND CDSERVICO <> '41203119') OR (CDSERVICO = '41203119' AND CDSERVICO <> '41203100') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                 CLOSE cPROCURA;
                  ELSIF (CDSERVICO = '41203020' AND NOT CDSERVICO IN ('41203038','41203046'))
                     OR (CDSERVICO = '41203038' AND NOT CDSERVICO IN ('41203020','41203046')) 
                     OR (CDSERVICO = '41203046' AND NOT CDSERVICO IN ('41203038','41203020')) THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                     CLOSE cPROCURA;
                   ELSIF (CDSERVICO = '41101014' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101081','41101090'))
                      OR (CDSERVICO = '41101022' AND NOT CDSERVICO IN ('41101014','41101030','41101073','41101081','41101090'))
                      OR (CDSERVICO = '41101030' AND NOT CDSERVICO IN ('41101022','41101014','41101073','41101081','41101090'))
                      OR (CDSERVICO = '41101073' AND NOT CDSERVICO IN ('41101022','41101030','41101014','41101081','41101090'))
                      OR (CDSERVICO = '41101081' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101014','41101090'))
                      OR (CDSERVICO = '41101090' AND NOT CDSERVICO IN ('41101022','41101030','41101073','41101081','41101014')) THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                      CLOSE cPROCURA;
                    ELSIF (CDSERVICO = '41101138' AND CDSERVICO <> '41101154') OR (CDSERVICO = '41101154' AND CDSERVICO <> '41101138') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                    CLOSE cPROCURA;
                     ELSIF (CDSERVICO = '41101189' AND NOT CDSERVICO IN ('41101200','41101219','41101278'))
                        OR (CDSERVICO = '41101200' AND NOT CDSERVICO IN ('41101189','41101219','41101278'))
                        OR (CDSERVICO = '41101219' AND NOT CDSERVICO IN ('41101200','41101189','41101278'))
                        OR (CDSERVICO = '41101278' AND NOT CDSERVICO IN ('41101200','41101219','41101189')) THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                        CLOSE cPROCURA;
                      ELSIF (CDSERVICO = '41101251' AND NOT CDSERVICO IN ('41101260','41101286','41101294'))
                         OR (CDSERVICO = '41101260' AND NOT CDSERVICO IN ('41101251','41101286','41101294'))
                         OR (CDSERVICO = '41101286' AND NOT CDSERVICO IN ('41101260','41101251','41101294'))
                         OR (CDSERVICO = '41101294' AND NOT CDSERVICO IN ('41101260','41101286','41101251')) THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                         CLOSE cPROCURA;
                       ELSIF (CDSERVICO = '30912059' AND CDSERVICO <> '30912067') OR (CDSERVICO = '30912067' AND CDSERVICO <> '30912059') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                       CLOSE cPROCURA;
                        ELSIF (CDSERVICO = '30101492' AND CDSERVICO <> '30210119') OR (CDSERVICO = '30210119' AND CDSERVICO <> '30101492') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                        CLOSE cPROCURA;
                         ELSIF (CDSERVICO = '31004113' AND CDSERVICO <> '31004130') OR (CDSERVICO = '31004130' AND CDSERVICO <> '31004113') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                         CLOSE cPROCURA;
                          ELSIF (CDSERVICO = '30214041' AND CDSERVICO <> '30214050') OR (CDSERVICO = '30214050' AND CDSERVICO <> '30214041') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                          CLOSE cPROCURA;
                           ELSIF (CDSERVICO = '31309020' AND CDSERVICO <> '31309062') OR (CDSERVICO = '31309062' AND CDSERVICO <> '31309020') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                           CLOSE cPROCURA;
                            ELSIF (CDSERVICO = '20104081' AND CDSERVICO <> '20104103') OR (CDSERVICO = '20104103' AND CDSERVICO <> '20104081') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                            CLOSE cPROCURA;
                             ELSIF (CDSERVICO = '40103749' AND CDSERVICO <> '41401492') OR (CDSERVICO = '41401492' AND CDSERVICO <> '40103749') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                             CLOSE cPROCURA;
                              ELSIF (CDSERVICO = '40201210' AND CDSERVICO <> '40201228') OR (CDSERVICO = '40201228' AND CDSERVICO <> '40201210') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                              CLOSE cPROCURA;
                               ELSIF (CDSERVICO = '40201198' AND CDSERVICO <> '40201201') OR (CDSERVICO = '40201201' AND CDSERVICO <> '40201198') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                               CLOSE cPROCURA;
                                ELSIF (CDSERVICO = '40201252' AND CDSERVICO <> '40201260') OR (CDSERVICO = '40201260' AND CDSERVICO <> '40201252') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                CLOSE cPROCURA;
                                 ELSIF (CDSERVICO = '40201236' AND CDSERVICO <> '40201244') OR (CDSERVICO = '40201244' AND CDSERVICO <> '40201236') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                 CLOSE cPROCURA;
                                  ELSIF (CDSERVICO = '30205085' AND CDSERVICO <> '30403014') OR (CDSERVICO = '30403014' AND CDSERVICO <> '30205085') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                  CLOSE cPROCURA;
                                   ELSIF (CDSERVICO = '30201063' AND CDSERVICO <> '30203015') OR (CDSERVICO = '30203015' AND CDSERVICO <> '30201063') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                   CLOSE cPROCURA;
                                    ELSIF (CDSERVICO = '30724066' AND CDSERVICO <> '30724279') OR (CDSERVICO = '30724279' AND CDSERVICO <> '30724066') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                    CLOSE cPROCURA;
                                     ELSIF (CDSERVICO = '30724040' AND CDSERVICO <> '30724139') OR (CDSERVICO = '30724139' AND CDSERVICO <> '30724040') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                     CLOSE cPROCURA;
                                      ELSIF (CDSERVICO = '30725020' AND CDSERVICO <> '30725054') OR (CDSERVICO = '30725054' AND CDSERVICO <> '30725020') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                      CLOSE cPROCURA;
                                       ELSIF (CDSERVICO = '30725011' AND CDSERVICO <> '30725135') OR (CDSERVICO = '30725135' AND CDSERVICO <> '30725011') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                       CLOSE cPROCURA;
                                        ELSIF (CDSERVICO = '30101220' AND CDSERVICO <> '30101239') OR (CDSERVICO = '30101239' AND CDSERVICO <> '30101220') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                        CLOSE cPROCURA;
                                         ELSIF (CDSERVICO = '30601037' AND CDSERVICO <> '30601045') OR (CDSERVICO = '30601045' AND CDSERVICO <> '30601037') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                         CLOSE cPROCURA;
                                          ELSIF (CDSERVICO = '30601096' AND CDSERVICO <> '30601150') OR (CDSERVICO = '30601150' AND CDSERVICO <> '30601096') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                          CLOSE cPROCURA;
                                           ELSIF (CDSERVICO = '31103235' AND CDSERVICO <> '31103472') OR (CDSERVICO = '31103472' AND CDSERVICO <> '31103235') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
                                           CLOSE cPROCURA;
      ELSE
         Raise_Application_Error(-20101,'Guia Recusada !!!');
         CLOSE cPROCURA;
      END IF;

      RETURN 'AcdErro = V049';
END FC_TUSS_EMISSAO_SERVICO_GUIA;
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Se a guia possuir por exemplo o código '40201082' (CDSERVICO) na primeira condição.
Pode incluir qualquer outro código mas, diferente de '40202666', além dos outros '40201171','40202690','40201180','40202720'.
E assim por adiante ... ou seja para incluir um código em uma determinada guia, só dentro dessas condições criadas.
Como assim?
Se o código for 40201082 pode-se incluir qualquer outro código onde?
Não esta claro isso pra mim...
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Sobre a lógica, eu não sei.
Mas eu nunca colocaria um monte de informações assim hard-code dentro de uma procedure, por vários motivos:

1. Quase impossível de entender o que faz um IF desses
2. Cada vez que criarem um código novo, vai ter que editar esse monstro e compilar.
3. Quase impossível de debugar isso
4. Chance de ter bug e dar tudo errado é de 80% ou mais. (ok, esse 80% eu chutei :-) )

Eu criaria uma tabelinha (se é que já não existe uma), pra configurar esses códigos todos, ou flegar). Daí tudo fica mais facil e configurável :-S
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Tambem pensei nisto dr_gori, mas antes de sugerir isto eu estava tentando entender o que realmente deveria fazer esta rotina, pois lendo todas as versões postadas aqui até agora ela poderia ser escrita com um unico If de uma cláusula, mas não sei se entendi a regra de negócio...
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Cadê o FETCH?
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Pelo CURSOR com a GUIA a ser incluída ou alterada não obtenho um ou mais valores no campo CDSERVICO, para comparar com as condições abaixo ... Não sei se consigo explicar ... mas,

Vou alterar uma guia de numero 1000 que possui mais de uma seqüência, digamos que nessa guia exista duas seqüências com código
'40202666' e '99999999' ... estou no momento tentando alterar incluindo um outro código que irá adicionar uma nova seqüência mas, esse código não pode ser : '40201171','40202690','40201180','40202720', inclusive '40201082' ... agora se o código digitado novo for por exemplo '88888888' o sistema deverá aceitar ... Esse é um exemplo pegando como referência a primeira condição :

Selecionar tudo

IF NOT ( CDSERVICO IN ('40201171','40202690','40201180','40202720') AND (CDSERVICO = '40201082') AND (CDSERVICO <> '40202666'))
         OR NOT ( CDSERVICO IN ('40201082','40202690','40201180','40202720') AND (CDSERVICO = '40201171')) 
         OR NOT ( CDSERVICO IN ('40201171','40201082','40201180','40202720') AND (CDSERVICO = '40202690'))
         OR NOT ( CDSERVICO IN ('40201171','40202690','40201082','40202720') AND (CDSERVICO = '40201180')) 
         OR NOT ( CDSERVICO IN ('40201171','40202690','40201180','40201082') AND (CDSERVICO = '40202720'))
         OR (CDSERVICO = '40202666' AND CDSERVICO <> '40201082') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
         CLOSE cPROCURA;
Não sei se desenvolvi um IF correto ou se existe uma forma mais simples para o que estou precisando ... Desde já agradeço a ajuda ...
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Mais uma pergunta, como você sabe qual é o novo valor para CDSERVICO?
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Selecionar tudo

    Select cdservico
      From servico_da_autorizacao
     Where nrautorizacao = vguiatuss
este select deve retornar quantos registros? 1 ou N?
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Isso ... com esse SELECT de uma determinada guia posso obter 1 ou N seqüências com seus respectivos códigos ... para isso fiz um SUB-SELECT para obter 1 ou N códigos para depois comparar com os futuros a serem ou não incluidos em uma determinada guia.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Bom enquanto lia e relia a sua lógica eu imaginei que o que você realmente queria era algo assim:

Selecionar tudo

Create Or Replace Function fc_tuss_emissao_servico_guia(p_nro_autorizacao In Number,
                                                        p_novo_cdservico  In servico_da_autorizacao.cdservico%Type)
 Return Number Is
  --
  v_cdservico    servico_da_autorizacao.cdservico%Type;
  --
  Cursor cprocura Is
    Select cdservico
      From servico_da_autorizacao
     Where nrautorizacao = p_nro_autorizacao;
  --
Begin
  --
  Open cprocura;
  Fetch cprocura Into v_cdservico;
  Close cprocura;
  --
  If v_cdservico = '40201082'
    And p_novo_cdservico Not In ('40201171', '40202690', '40201180', '40202720', '40202666') Then
    raise_application_error(-20101, 'Guia Liberada !!!');
  Elsif v_cdservico = '40201171'
    And p_novo_cdservico Not In ('40202690', '40201180', '40202720', '40202666', '40201082') Then
    raise_application_error(-20101, 'Guia Liberada !!!');
  Elsif v_cdservico = '40202690'
    And p_novo_cdservico Not In ('40201171', '40201180', '40202720', '40202666', '40201082') Then
    raise_application_error(-20101, 'Guia Liberada !!!');
  Elsif v_cdservico = '40201180'
    And p_novo_cdservico Not In ('40201171', '40202690', '40202720', '40202666', '40201082') Then
    raise_application_error(-20101, 'Guia Liberada !!!');
  Elsif v_cdservico = '40202720'
    And p_novo_cdservico Not In ('40201171', '40202690', '40201180', '40202666', '40201082') Then
    raise_application_error(-20101, 'Guia Liberada !!!');
  Elsif v_cdservico = '40202666'
    And p_novo_cdservico Not In ('40201171', '40202690', '40201180', '40202720', '40201082') Then
    raise_application_error(-20101, 'Guia Liberada !!!');
  End If;
  --
  Return 1;
End fc_tuss_emissao_servico_guia;
Isto seria as tratativas apenas para o primeiro If e deveria ir replicando conforme a nescessidade das regras.

Nâo sei se isto lhe será útil, mas espero que pelo menos uma idéia lhe de.

Qualquer coisa estou a disposição.
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Para não falar que fiz uma cópia exata do seu exemplo ... ficou assim :
Assim que consegui elaborar essa FUNCTION, adiciono as demais condições. Desde já agradeço ...

Selecionar tudo

CREATE OR REPLACE FUNCTION FC_TUSS_EMISSAO_SERVICO_GUIA (p_NRO_AUTORIZACAO IN NUMBER,   -- Table AUTORIZACAO

                                                         p_NOVO_CDSERVICO  IN SERVICO_DA_AUTORIZACAO.CDSERVICO%TYPE) -- Table SERVICO_DA_AUTORIZACAO
                                                        RETURN NUMBER
                                                        IS v_CDSERVICO  SERVICO_DA_AUTORIZACAO.CDSERVICO%TYPE;

CURSOR cPROCURA IS SELECT CDSERVICO FROM SERVICO_DA_AUTORIZACAO
                          WHERE NRAUTORIZACAO = p_NRO_AUTORIZACAO;
       -- AND NRSEQ_SERV_AUTORIZACAO IN (SELECT NRSEQ_SERV_AUTORIZACAO FROM SERVICO_DA_AUTORIZACAO);
                          
BEGIN
   OPEN cPROCURA;
   FETCH cPROCURA INTO v_CDSERVICO;
   CLOSE cPROCURA;
   
      IF cPROCURA%ISOPEN THEN
         RAISE_APPLICATION_ERROR(-20101,'Guia Inexistente !!!');
         CLOSE cPROCURA;
      END IF;

      IF       v_CDSERVICO = '40201082' AND p_NOVO_CDSERVICO NOT IN ('40201171','40202690','40201180','40202720','40202666') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
         ELSIF v_CDSERVICO = '40202666' AND p_NOVO_CDSERVICO NOT IN ('40201171','40202690','40201180','40202720','40201082') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
         ELSIF v_CDSERVICO = '40201171' AND p_NOVO_CDSERVICO NOT IN ('40201082','40202690','40201180','40202720') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
         ELSIF v_CDSERVICO = '40202690' AND p_NOVO_CDSERVICO NOT IN ('40201171','40201082','40201180','40202720') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
         ELSIF v_CDSERVICO = '40201180' AND p_NOVO_CDSERVICO NOT IN ('40201171','40202690','40201082','40202720') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
         ELSIF v_CDSERVICO = '40202720' AND p_NOVO_CDSERVICO NOT IN ('40201171','40202690','40201180','40201082') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
      ELSE
         Raise_Application_Error(-20101,'Guia Recusada !!!');
         CLOSE cPROCURA;
      END IF;

      RETURN 1;
END FC_TUSS_EMISSAO_SERVICO_GUIA;
Mas, ocorreu o seguinte erro :

Selecionar tudo

Compilation errors for FUNCTION CUSTOM.FC_TUSS_EMISSAO_SERVICO_GUIA

Error: PLS-00201: o identificador 'SERVICO_DA_AUTORIZACAO.CDSERVICO' deve ser declarado
Line: 23
Text: ELSIF v_CDSERVICO = '40202690' AND p_NOVO_CDSERVICO NOT IN ('40201171','40201082','40201180','40202720') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');

Error: PL/SQL: Compilation unit analysis terminated
Line: 21
Text: ELSIF v_CDSERVICO = '40202666' AND p_NOVO_CDSERVICO NOT IN ('40201171','40202690','40201180','40202720','40201082') THEN Raise_Application_Error(-20101,'Guia Liberada !!!');
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Poderia dar um describe da tabela servico_da_autorizacao e postar aqui?

Apenas para evitar erros, retire todo o IF que contem o %IsOpen.
Pode retirar aquele ultimo close que esta dentro do else, por 2 motivos:
1 - o raise que esta antes dele faz com que saia da função então nunca será executado
2 - o close foi dalo abaixo do fetch, então é tecnicamente impossivel ele ainda estar aberto.
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá gfkauer, Boa Tarde.

Compiled Successfull !!!

Vou fazer os testes e informo nesse tópico se obtive êxito !!!

Agradeço a atenção e ajuda de todos, principalmente a sua ...
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Não é por nada não, mas o primeiro código merece ser passado para o tópico dos códigos duvidosos... O ultimo já está bem melhor! :-o
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Depois de um bom tempo ... mas, como prometido !!!

No final das contas não fiz uma FUNCTION e optei por uma TRIGGER.

Selecionar tudo

CREATE OR REPLACE TRIGGER TR_GLUFKE_NET
  BEFORE INSERT ON NOME_DA_TABELA  
  FOR EACH ROW
DECLARE

... Variaveis ...

BEGIN 

... + as condicoes elaboradas pela ajuda do fórum ...

END TRIGGER TR_GLUFKE_NET
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

A forma que foi feita a implementação não importa na minha opinião. O que importa é o resultada e o tempo de execução no final.

Se tu conseguiste alcançar o objetivo da rotina com trigger esta perfeito =)

Qualquer coisa grita.
Responder
  • Informação