Ref Cursor

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
fbarros300472
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 21 Set 2006 10:13 am
Localização: sp

Informações do Ambiente:
* Versão do Oracle: 10g
* Sistema Operacional: Red Hat 4

Boa tarde pessoal !

Estou tentando fazer esta procedure retornar um valor, mas dá um erro na hora que é executada. Fiz alguns testes e me parece que o erro está no SYS_REFCURSOR. Pesquisei, mas não encontrei algo que pudesse me exclarecer. Busquei um exemplo na net para montar essa proceudre. Se alguém puder me ajudar, desde já agradeço.

Selecionar tudo

SQL> execute nfiscal(334094);
 
begin nfiscal(334094); end;
 
ORA-06550: line 2, column 7:
PLS-00306: wrong number or types of arguments in call to 'NFISCAL'
ORA-06550: line 2, column 7:
PL/SQL: Statement ignored

Selecionar tudo

CREATE OR REPLACE PROCEDURE NFISCAL (MOV IN NUMBER, OBS OUT SYS_REFCURSOR)

IS

BEGIN
OPEN OBS FOR SELECT (CASE WHEN(SELECT TMOV.CODTB5FLX
        FROM TMOV
        WHERE IDMOV=MOV
              AND TMOV.CODFILIAL<=2)='01' AND (SELECT SUM(VALOR) FROM TTRBMOV
                                      WHERE IDMOV=388670
                                      AND CODTRB IN ('INSS','IRRF','ISS','ISSD'))=0 THEN
               'LOCAÇÃO ISENTO DE IRRF E ISS'
            WHEN (SELECT FCFO.RETENCAOISS
                  FROM TMOV,FCFO
                  WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=6)=1 THEN
                  'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei complementar nº 28 de 18/02/2003
                   - Art. 199 - Parágrafo Único - Inciso II - Item 7.09.'
             WHEN (SELECT FCFO.RETENCAOISS
                  FROM TMOV,FCFO
                  WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=5)=1 THEN
                  'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei Municipal nº 2.528/2003 -
                  Art. 8º - Inciso II - Item 7.09.'
              WHEN (SELECT FCFO.RETENCAOISS
                  FROM TMOV,FCFO
                  WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=4)=1 THEN
                  'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei Complementar nº 116/2003
                   - Art. 6º - Parágrafo 2º - Inciso II - Item 7.09.' END) 



FROM DUAL;

END;
gilbertoca
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 372
Registrado em: Ter, 24 Jan 2006 3:33 pm
Localização: Palmas - TO
Contato:

fbarros300472 escreveu:Informações do Ambiente:
* Versão do Oracle: 10g
* Sistema Operacional: Red Hat 4

Boa tarde pessoal !

Estou tentando fazer esta procedure retornar um valor, mas dá um erro na hora que é executada. Fiz alguns testes e me parece que o erro está no SYS_REFCURSOR. Pesquisei, mas não encontrei algo que pudesse me exclarecer. Busquei um exemplo na net para montar essa proceudre. Se alguém puder me ajudar, desde já agradeço.
Estatística comprovada: 80% dos desenvolvedores não lêem a documentação de referência

Passing Data with Cursor Variables

Para usá-lo implicitamente você precisar usar a palavra-chave CURSOR.
Caso contrário, terá que defini-lo no procedimento.

Declaring REF CURSOR Types and Cursor Variables

Gilberto
fbarros300472
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 21 Set 2006 10:13 am
Localização: sp

Valeu, muito obrigado. Os links ajudaram bastante.
fbarros300472
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 21 Set 2006 10:13 am
Localização: sp

Gilberto, consegui alterar e não está mais dando erro. O problema que a mensagem não aparece.

Selecionar tudo

CREATE OR REPLACE PROCEDURE NFISCAL (MOV  NUMBER )

IS

    MENS      SYS_REFCURSOR;
    NF  VARCHAR(200);

BEGIN
OPEN MENS FOR SELECT (
CASE WHEN(SELECT TMOV.CODTB5FLX
                  FROM TMOV
                 WHERE 
                 IDMOV=MOV AND TMOV.CODFILIAL<=2)='01' 
                 AND 
               (SELECT SUM(VALOR) 
                FROM TTRBMOV
                WHERE IDMOV=MOV  AND CODTRB IN ('INSS','IRRF','ISS','ISSD'))=0 
               THEN  'LOCAÇÃO ISENTO DE IRRF E ISS'
        WHEN (SELECT FCFO.RETENCAOISS
                   FROM TMOV,FCFO
                  WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=6)=1 
                THEN  'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei complementar nº 28 de 18/02/2003
                   - Art. 199 - Parágrafo Único - Inciso II - Item 7.09.'
         WHEN (SELECT FCFO.RETENCAOISS
                    FROM TMOV,FCFO
                    WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=5)=1 
              THEN 'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei Municipal nº 2.528/2003 -
                  Art. 8º - Inciso II - Item 7.09.'
         WHEN (SELECT FCFO.RETENCAOISS
                    FROM TMOV,FCFO
                    WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=4)=1 
              THEN 'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei Complementar nº 116/2003
                   - Art. 6º - Parágrafo 2º - Inciso II - Item 7.09.' END) 

FROM DUAL;  LOOP
        FETCH MENS INTO NF;
        EXIT WHEN MENS%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(NF);
    END LOOP;
    CLOSE MENS;
END;
gilbertoca
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 372
Registrado em: Ter, 24 Jan 2006 3:33 pm
Localização: Palmas - TO
Contato:

fbarros300472 escreveu:Gilberto, consegui alterar e não está mais dando erro. O problema que a mensagem não aparece.

Selecionar tudo

CREATE OR REPLACE PROCEDURE NFISCAL (MOV  NUMBER )

IS

    MENS      SYS_REFCURSOR;
    NF  VARCHAR(200);

BEGIN
OPEN MENS FOR SELECT (
CASE WHEN(SELECT TMOV.CODTB5FLX
                  FROM TMOV
                 WHERE 
                 IDMOV=MOV AND TMOV.CODFILIAL<=2)='01' 
                 AND 
               (SELECT SUM(VALOR) 
                FROM TTRBMOV
                WHERE IDMOV=MOV  AND CODTRB IN ('INSS','IRRF','ISS','ISSD'))=0 
               THEN  'LOCAÇÃO ISENTO DE IRRF E ISS'
        WHEN (SELECT FCFO.RETENCAOISS
                   FROM TMOV,FCFO
                  WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=6)=1 
                THEN  'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei complementar nº 28 de 18/02/2003
                   - Art. 199 - Parágrafo Único - Inciso II - Item 7.09.'
         WHEN (SELECT FCFO.RETENCAOISS
                    FROM TMOV,FCFO
                    WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=5)=1 
              THEN 'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei Municipal nº 2.528/2003 -
                  Art. 8º - Inciso II - Item 7.09.'
         WHEN (SELECT FCFO.RETENCAOISS
                    FROM TMOV,FCFO
                    WHERE TMOV.CODCFO=FCFO.CODCFO
                        AND TMOV.IDMOV=MOV
                        AND TMOV.CODTB5FLX <> 1
                        AND TMOV.CODFILIAL=4)=1 
              THEN 'Tomador do Serviço Responsável pelo Recolhimento de ISS, conforme Lei Complementar nº 116/2003
                   - Art. 6º - Parágrafo 2º - Inciso II - Item 7.09.' END) 

FROM DUAL;  LOOP
        FETCH MENS INTO NF;
        EXIT WHEN MENS%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(NF);
    END LOOP;
    CLOSE MENS;
END;
Acho que você não entendeu bem o uso do CASE: Using CASE Statements
Pelo que vi em seu código não há a necessidade de CURSOR.

Gilberto
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes