Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

_Patrícia_

[Resolvido] Problema ao executar função

Recommended Posts

Olá Pessoal,

 

Tenho a seguintee situação,

 

tenho uma função, que compila normalmente,

sem problema algum,

 

mas quando mando executar,

 

retorna o seguinte erro

 

ORA-00306:número incorreto de tipos de argumentos para chamada '||';

ORA-06550: Linha 143, coluna 24,

 

Porém as linhas e colunas às quais o erro se refere

tem a seguinte instrução:

 

ANO_PROCEDIMENTO := EXTRACT(YEAR FROM DATAAGENDA);

 

ja tentei de todas as formas possiveis, e não consegui corrigir o erro,

usei varias funções para converter a data e nada,

 

 

abaixo, segue o codigo da função,

 

 

_______________________________________

create or replace

FUNCTION GER_ASSISTENCIAL_1

(

CODIAGENDAPRE IN NUMBER,

CODIUSUARIO IN NUMBER,

DATAAGENDA OUT DATE,

HORAAGENDA OUT DATE,

CODIEMPRESA OUT INTEGER,

NOMEEMPRESA OUT VARCHAR2,

CODIFUNCIONARIO OUT INTEGER,

NOMEFUNCIONARIO OUT VARCHAR2,

CODIFUNCIONARIOFUNCAO OUT INTEGER,

CODIMEDICO OUT INTEGER,

NOMEMEDICO OUT VARCHAR2,

CODICIDADE OUT INTEGER,

IDCIDADE OUT INTEGER,

CODIPCMSO OUT INTEGER,

FILHOFUNCAO OUT VARCHAR2,

NOMEFUNCAO OUT VARCHAR2,

CBO_FUNCAO OUT VARCHAR2,

CODIMEDICOPCMSO OUT INTEGER,

SOLIAGENDA OUT SMALLINT,

ENTRAGENDA OUT SMALLINT,

OBSEAGENDA OUT BLOB,

CODIPROCEDIMENTO OUT INTEGER,

CODICONVENCAO OUT INTEGER,

CODIAGENDAMENTO OUT INTEGER,

GFIPFUNCAO OUT VARCHAR2,

FILHOSECAO OUT VARCHAR2,

NOMESECAO OUT VARCHAR2,

FILHOSETOR OUT VARCHAR2,

NOMESETOR OUT VARCHAR2,

IDENFUNCIONARIO OUT VARCHAR2,

OIDEFUNCIONARIO OUT VARCHAR2,

UIDEFUNCIONARIO OUT VARCHAR2,

DANAFUNCIONARIO OUT DATE,

IDADFUNCIONARIO OUT INTEGER,

NOMECIDADE OUT VARCHAR2,

CRMMEDICO OUT VARCHAR2,

MES_PROCEDIMENTO OUT VARCHAR2,

ANO_PROCEDIMENTO OUT SMALLINT,

NOMECONVENCAO OUT VARCHAR2,

ATESPROCEDIMENTO OUT INTEGER,

ATRAPROCEDIMENTO OUT INTEGER,

SITUPROCEDIMENTO OUT INTEGER,

FLAGFATURA OUT SMALLINT,

IDPROCEDIMENTOAMB OUT INTEGER,

FILHOREGISTRO OUT VARCHAR2,

NIVELREGISTRO OUT NUMBER,

PAIREGISTRO OUT VARCHAR2,

CONTAR OUT NUMBER,

TAMANHO OUT NUMBER,

NIVELPAI OUT NUMBER,

CARACTER OUT VARCHAR2,

DADOSTRING OUT VARCHAR2,

INICSTRING OUT NUMBER,

QTDESTRING OUT NUMBER,

RET_STRING OUT VARCHAR2,

INSTRUCAO OUT VARCHAR2,

TAMANHOX OUT NUMBER,

RETLETRA OUT CHAR

) RETURN VARCHAR2 AS

BEGIN

 

SELECT AP.DATAAGENDA, AP.HORAAGENDA, AP.CODIEMPRESA, AP.CODIFUNCIONARIO,

AP.NOMEFUNCIONARIO, AP.CODIFUNCIONARIOFUNCAO, AP.CODIMEDICO, AP.NOMEMEDICO,

AP.CODICIDADE, AP.CODIPCMSO, AP.FILHOFUNCAO, AP.NOMEFUNCAO, AP.CBO_FUNCAO,

AP.CODIMEDICOPCMSO, AP.SOLIAGENDA, AP.ENTRAGENDA, AP.OBSEAGENDA,

AP.CODIPROCEDIMENTO, AP.CODICONVENCAO, AP.CODIAGENDAMENTO

INTO DATAAGENDA, HORAAGENDA, CODIEMPRESA, CODIFUNCIONARIO, NOMEFUNCIONARIO,

CODIFUNCIONARIOFUNCAO, CODIMEDICO, NOMEMEDICO, CODICIDADE, CODIPCMSO,

FILHOFUNCAO, NOMEFUNCAO, CBO_FUNCAO, CODIMEDICOPCMSO, SOLIAGENDA,

ENTRAGENDA, OBSEAGENDA, CODIPROCEDIMENTO, CODICONVENCAO, CODIAGENDAMENTO

FROM AGENDAPRE AP

WHERE AP.IDAGENDAPRE = CODIAGENDAPRE;

 

IF (CODIAGENDAMENTO = 0) THEN BEGIN -- INSERIR ASO

CODIAGENDAMENTO := (IDPROCEDIMENTOAMB + 1);

END;

END IF;

 

SELECT E.NOMEEMPRESA

INTO NOMEEMPRESA

FROM EMPRESA E

WHERE E.IDEMPRESA = CODIEMPRESA;

 

SELECT ME.GFIPFUNCAO

INTO GFIPFUNCAO

FROM MAPAEMPRESA ME

WHERE ME.FILHO = FILHOFUNCAO;

BEGIN

SELECT RET_PAIREGISTRO_1 (FILHOREGISTRO, NIVELREGISTRO, PAIREGISTRO, CONTAR, TAMANHO,

NIVELPAI, CARACTER, DADOSTRING, INICSTRING, QTDESTRING, RET_STRING, INSTRUCAO, TAMANHOX,

RETLETRA)

INTO FILHOSECAO

FROM DUAL;

END;

SELECT RET_PAIREGISTRO_1 (FILHOREGISTRO, NIVELREGISTRO, PAIREGISTRO, CONTAR,

TAMANHO, NIVELPAI, CARACTER, DADOSTRING, INICSTRING, QTDESTRING,

RET_STRING, INSTRUCAO, TAMANHOX, RETLETRA)

INTO FILHOSETOR

FROM DUAL;

 

SELECT ME.DESCORIGEM

INTO NOMESETOR

FROM MAPAEMPRESA ME

WHERE ME.FILHO = FILHOSETOR;

 

SELECT CAST(F.IDENFUNCIONARIO AS VARCHAR(30)), F.OIDEFUNCIONARIO, F.UIDEFUNCIONARIO,

F.DANAFUNCIONARIO

INTO IDENFUNCIONARIO, OIDEFUNCIONARIO, UIDEFUNCIONARIO, DANAFUNCIONARIO

FROM FUNCIONARIO F

WHERE F.IDFUNCIONARIO = CODIFUNCIONARIO;

 

IF (OIDEFUNCIONARIO IS NOT NULL) THEN BEGIN

IDENFUNCIONARIO := IDENFUNCIONARIO ||'/'|| OIDEFUNCIONARIO;

END;

END IF;

 

IF (UIDEFUNCIONARIO IS NOT NULL) THEN BEGIN

IDENFUNCIONARIO := IDENFUNCIONARIO ||'-'|| UIDEFUNCIONARIO;

END;

END IF;

 

IDADFUNCIONARIO := (CAST('NOW' AS DATE) - DANAFUNCIONARIO)/365;

 

SELECT C.NOMECIDADE

INTO NOMECIDADE

FROM CIDADE C

WHERE C.IDCIDADE = IDCIDADE;

 

SELECT P.RPROPROFISSIONAL

INTO CRMMEDICO

FROM PROFISSIONAL P

WHERE P.CODIPROFISSIONAL = CODIMEDICO;

 

SELECT PC.DESCPROCEDIMENTOCONV

INTO NOMECONVENCAO

FROM PROCEDIMENTOCONV PC

WHERE PC.IDPROCEDIMENTOCONV = CODICONVENCAO;

 

MES_PROCEDIMENTO := EXTRACT(MONTH FROM DATAAGENDA);

ANO_PROCEDIMENTO := EXTRACT(YEAR FROM DATAAGENDA);

 

ATESPROCEDIMENTO := 0;

ATRAPROCEDIMENTO := 0;

SITUPROCEDIMENTO := 0;

FLAGFATURA := 0;

 

INSERT INTO PROCEDIMENTOAMB (IDPROCEDIMENTOAMB, CODIEMPRESA, NOMEEMPRESA,

CODIFUNCIONARIO, NOMEFUNCIONARIO, IDENFUNCIONARIO, IDADPROCEDIMENTO,

CODIFUNCIONARIOFUNCAO, FSETPROCEDIMENTO, SETOPROCEDIMENTO,

FSECPROCEDIMENTO, SECAPROCEDIMENTO, FFUNPROCEDIMENTO, FUNCPROCEDIMENTO,

CBO_PROCEDIMENTO, GFIPPROCEDIMENTO, CODIPCMSO, DATAPROCEDIMENTO,

HSINPROCEDIMENTO, MES_PROCEDIMENTO, ANO_PROCEDIMENTO, CODIPROCEDIMENTO,

CODIMEDICO, MEDIPROCEDIMENTO, RMEDPROCEDIMENTO, CODIPROCEDIMENTOCONV,

CONVPROCEDIMENTO, CODICIDADE, NOMECIDADE, COORPROCEDIMENTO,

ATESPROCEDIMENTO, ATRAPROCEDIMENTO, SITUPROCEDIMENTO, OBSEPROCEDIMENTO,

SOLIPROCEDIMENTO, ENTRPROCEDIMENTO, FLAGFATURA, CODIAGENDAPRE, CODIUSUARIO)

VALUES (CODIAGENDAMENTO, CODIEMPRESA, NOMEEMPRESA, CODIFUNCIONARIO,

NOMEFUNCIONARIO, IDENFUNCIONARIO, IDADFUNCIONARIO, CODIFUNCIONARIOFUNCAO,

FILHOSETOR, NOMESETOR, FILHOSECAO, NOMESECAO, FILHOFUNCAO, NOMEFUNCAO,

CBO_FUNCAO, GFIPFUNCAO, CODIPCMSO, DATAAGENDA, HORAAGENDA,

MES_PROCEDIMENTO, ANO_PROCEDIMENTO, CODIPROCEDIMENTO, CODIMEDICO,

NOMEMEDICO, CRMMEDICO, CODICONVENCAO, NOMECONVENCAO, CODICIDADE,

NOMECIDADE, CODIMEDICOPCMSO, ATESPROCEDIMENTO, ATRAPROCEDIMENTO,

SITUPROCEDIMENTO, OBSEAGENDA, SOLIAGENDA, ENTRAGENDA, FLAGFATURA,

CODIAGENDAPRE, CODIUSUARIO);

 

UPDATE AGENDAPRE AP SET AP.CODIAGENDAMENTO = CODIAGENDAMENTO, AP.SITUAGENDA = 1

WHERE AP.IDAGENDAPRE = CODIAGENDAPRE;

 

BEGIN -- ALTERAR ASO --

SELECT E.NOMEEMPRESA

INTO NOMEEMPRESA

FROM EMPRESA E

WHERE E.IDEMPRESA = CODIEMPRESA;

END;

 

SELECT ME.GFIPFUNCAO

INTO GFIPFUNCAO

FROM MAPAEMPRESA ME

WHERE ME.FILHO = FILHOFUNCAO;

 

SELECT RET_PAIREGISTRO_1(FILHOREGISTRO, NIVELREGISTRO, PAIREGISTRO, CONTAR, TAMANHO,

NIVELPAI, CARACTER, DADOSTRING, INICSTRING, QTDESTRING, RET_STRING, INSTRUCAO,

TAMANHOX, RETLETRA)

INTO FILHOSECAO

FROM DUAL;

 

SELECT ME.DESCORIGEM

INTO NOMESECAO

FROM MAPAEMPRESA ME

WHERE ME.FILHO = FILHOSECAO;

 

SELECT RET_PAIREGISTRO_1(FILHOREGISTRO, NIVELREGISTRO, PAIREGISTRO,

CONTAR, TAMANHO, NIVELPAI, CARACTER, DADOSTRING, INICSTRING, QTDESTRING,

RET_STRING, INSTRUCAO, TAMANHOX, RETLETRA)

INTO FILHOSETOR

FROM DUAL;

 

SELECT ME.DESCORIGEM

INTO NOMESETOR

FROM MAPAEMPRESA ME

WHERE ME.FILHO = FILHOSETOR;

 

SELECT F.IDENFUNCIONARIO, F.OIDEFUNCIONARIO, F.UIDEFUNCIONARIO,

F.DANAFUNCIONARIO

INTO IDENFUNCIONARIO, OIDEFUNCIONARIO, UIDEFUNCIONARIO, DANAFUNCIONARIO

FROM FUNCIONARIO F

WHERE F.IDFUNCIONARIO = CODIFUNCIONARIO;

 

IF (OIDEFUNCIONARIO IS NOT NULL) THEN BEGIN

IDENFUNCIONARIO := IDENFUNCIONARIO ||'/'|| OIDEFUNCIONARIO;

END;

END IF;

 

IF (UIDEFUNCIONARIO IS NOT NULL) THEN BEGIN

IDENFUNCIONARIO := IDENFUNCIONARIO ||'-'|| UIDEFUNCIONARIO;

END;

END IF;

 

IDADFUNCIONARIO := (CAST('NOW' AS DATE) - DANAFUNCIONARIO)/365;

 

SELECT C.NOMECIDADE

INTO NOMECIDADE

FROM CIDADE C

WHERE C.IDCIDADE = IDCIDADE;

 

SELECT P.RPROPROFISSIONAL

INTO CRMMEDICO

FROM PROFISSIONAL P

WHERE P.CODIPROFISSIONAL = CODIMEDICO;

 

SELECT PC.DESCPROCEDIMENTOCONV

INTO NOMECONVENCAO

FROM PROCEDIMENTOCONV PC

WHERE PC.IDPROCEDIMENTOCONV = CODICONVENCAO;

 

MES_PROCEDIMENTO := EXTRACT(MONTH FROM DATAAGENDA);

ANO_PROCEDIMENTO := EXTRACT(YEAR FROM DATAAGENDA);

ATESPROCEDIMENTO := 0;

ATRAPROCEDIMENTO := 0;

SITUPROCEDIMENTO := 0;

 

UPDATE PROCEDIMENTOAMB SET CODIEMPRESA = CODIEMPRESA,

NOMEEMPRESA = NOMEEMPRESA, CODIFUNCIONARIO = CODIFUNCIONARIO,

NOMEFUNCIONARIO = NOMEFUNCIONARIO, IDENFUNCIONARIO = IDENFUNCIONARIO,

IDADPROCEDIMENTO = IDADFUNCIONARIO, CODIFUNCIONARIOFUNCAO = CODIFUNCIONARIOFUNCAO,

FSETPROCEDIMENTO = FILHOSETOR, SETOPROCEDIMENTO = NOMESETOR,

FSECPROCEDIMENTO = FILHOSECAO, SECAPROCEDIMENTO = NOMESECAO,

FFUNPROCEDIMENTO = FILHOFUNCAO, FUNCPROCEDIMENTO = NOMEFUNCAO,

CBO_PROCEDIMENTO = CBO_FUNCAO, GFIPPROCEDIMENTO = GFIPFUNCAO,

CODIPCMSO = CODIPCMSO, DATAPROCEDIMENTO = DATAAGENDA,

HSINPROCEDIMENTO = HORAAGENDA, MES_PROCEDIMENTO = MES_PROCEDIMENTO,

ANO_PROCEDIMENTO = ANO_PROCEDIMENTO, CODIPROCEDIMENTO = CODIPROCEDIMENTO,

CODIMEDICO = CODIMEDICO, MEDIPROCEDIMENTO = NOMEMEDICO,

RMEDPROCEDIMENTO = CRMMEDICO, CODIPROCEDIMENTOCONV = CODICONVENCAO,

CONVPROCEDIMENTO = NOMECONVENCAO, CODICIDADE = CODICIDADE,

NOMECIDADE = NOMECIDADE, COORPROCEDIMENTO = CODIMEDICOPCMSO,

ATESPROCEDIMENTO = ATESPROCEDIMENTO, ATRAPROCEDIMENTO = ATRAPROCEDIMENTO,

SITUPROCEDIMENTO = SITUPROCEDIMENTO, OBSEPROCEDIMENTO = OBSEAGENDA,

SOLIPROCEDIMENTO = SOLIAGENDA, ENTRPROCEDIMENTO = ENTRAGENDA,

CODIUSUARIO = CODIUSUARIO

WHERE IDPROCEDIMENTOAMB = CODIAGENDAMENTO;

RETURN NULL;

END GER_ASSISTENCIAL_1;

______________________________________________________________________________

 

 

Att,

 

Patrícia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a versao do banco?

 

Tenta ae...

 

Substituir as ' ' por " " onde for utilizar string...

 

Ex: ||'/'||

 

por:||"/"||

 

ve se vai...

Compartilhar este post


Link para o post
Compartilhar em outros sites

troque

 

IDADFUNCIONARIO := (CAST('NOW' AS DATE) - DANAFUNCIONARIO)/365;

 

por

 

IDADFUNCIONARIO := sysdate - DANAFUNCIONARIO)/365;

 

é um palpite

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei as 2 tentativas,

 

substituir '' por "" e nada...

 

tbm substitui o

 

IDADFUNCIONARIO := (CAST('NOW' AS DATE) - DANAFUNCIONARIO)/365;

 

por

 

IDADFUNCIONARIO := sysdate - DANAFUNCIONARIO)/365;

 

e compila sem problema,

 

Mas quando executo o erro permanecee!!

:(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se nas chamadas como estas

 

SELECT RET_PAIREGISTRO_1(FILHOREGISTRO, NIVELREGISTRO, PAIREGISTRO,
CONTAR, TAMANHO, NIVELPAI, CARACTER, DADOSTRING, INICSTRING, QTDESTRING,
RET_STRING, INSTRUCAO, TAMANHOX, RETLETRA)
INTO FILHOSETOR
FROM DUAL;

Os parametros estão sendo passados de forma correta quantidade e tipos corretos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ANO_PROCEDIMENTO OUT SMALLINT,

 

Pode ser este tipo , não sei (nem achei seu range) mude para number e veja se resolve.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use a tática de separar a rotina por fases, depois dê um raise indicando a fase ajuda quando não se tem um depurador.

 

CREATE OR REPLACE PROCEDURE XXXXXXXX

  VS_FASE CHAR(3);

BEGIN
  VS_FASE := '001';
  ...

  VS_FASE := '005';
  ...

  VS_FASE := '010';
  ...
 
  VS_FASE := '090';
  ...

   

EXCEPTION
  WHEN OTHERS THEN
    RAISE_APLLICATION_ERROR(-20001,'FASE '||VS_FASE||' ERRO ' ||SQLERRM(SQLCODE));
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oláa,

 

Tento separar a rotina por fases ,

 

mas quando executo,

 

retorna o seguinte erro:

 

Erro(300,5): PLS-00201: o identificador 'RAISE_APLLICATION_ERROR' deve ser declarado

Compartilhar este post


Link para o post
Compartilhar em outros sites

a escrita está correta tbm,

 

olhei a ducumentação e está de acordo,

 

tentei eliminar a função e criar de novo,

 

mas persiste o mesmo erro,

 

mas as linhas as quais se referem o erro,

 

as vezes não tem código algum,

 

pode ser album problema com o banco criado, ou com o próprio oracle ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, o erro listado originalmente

ORA-00306:número incorreto de tipos de argumentos para chamada

é claro, ou se está passado campos a mais ou a menos para uma rotina ou um ou mais dos parametros tem tipos diferentes do esperado pela rotina ou ainda o tamanho passado é maior.

 

O problema é só saber aonde.

 

A ideia da fase é separar o local do possível problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vai ter de usar um site destes de compatilhar imagens.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Publica também a linha 193 e arredores.

 

Esta tá braba ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Patricia, boa noite.

Não acredite no número da linha.

Este número não é igual ao que você usa no texto de criação da procedure.

O problema está realmente nas 4 concatenações que você faz na procedure.

Para testar experimente tirar os 2 "||'/'|| OIDEFUNCIONARIO" e os 2 "||'/'|| UIDEFUNCIONARIO', compile e execute a procedure

Como estes são campos OUT sugiro que você use variaveis locais para fazer a concatenação e só ai transfira o conteudo para a variavel out

 

Se não der, me passa um desc das tabelas que você faz select

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia Ferr,

 

Mesmo usando variaveis locais o erro permanece,

será que pode ser algum problema com este select:

 

SELECT RET_PAIREGISTRO_1(FILHOREGISTRO, NIVELREGISTRO, PAIREGISTRO, CONTAR, TAMANHO, NIVELPAI,

CARACTER, DADOSTRING, INICSTRING, QTDESTRING, RET_STRING, INSTRUCAO, TAMANHOX, RETLETRA)

INTO FILHOSETOR

FROM DUAL;

 

pois ja verifiquei todas as tabelas e campos,

e não vejo problem algum!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.