Ir para conteúdo

POWERED BY:

Arquivado

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

_Patrícia_

[Resolvido] Executar Procedure dentro de Procedure em Oracle

Recommended Posts

Boa Tarde Galera,

Estou começando agora a trabalhar com Oracle PL/SQL,

e estou tendo problemas para executar uma procedure dentro de outra procedure!

 

criei uma procedure,

 

e fiz o seguinte select

 

SELECT DATAAGENDAHOR, HORAAGENDAHOR
INTO DATAAGENDA, HORAAGENDA
FROM RET_VAGAAGENDAPREHOR; 

RET_VAGAAGENDAPREHOR

É O PROCEDIMENTO O QUAL TERIA QUE SER EXECUTADO,

 

SEGUE ABAIXO O CÓDIGO DA PROCEDURE:

 

create or replace
PROCEDURE GER_EXAMEAUDIO 
(
  CODIAGENDAPRE IN NUMBER,
  IDGUIASPSADTPROC IN NUMBER,
  CODIUSUARIO IN NUMBER,
  AGENDAMENTOFON OUT SMALLINT,
  CODIESPECIALIDADE OUT NUMBER,
  QTDEESPECIALIDADE OUT NUMBER,
  DATAAGENDA IN OUT DATE,
  HORAAGENDA IN OUT TIMESTAMP,
  PERIAGENDA OUT INTEGER,
  VALIAGENDA OUT DATE,
  CODIPROFISSIONAL  IN OUT INTEGER,
  NOMEPROFISSIONAL OUT VARCHAR2,
  IDAGENDAPRE OUT INTEGER
  ) AS 
BEGIN
    --SELECIONA FORMA DE AGENDAMENTO
     SELECT P.AGENDAMENTOFON
     INTO AGENDAMENTOFON
     FROM PARAMETRO P;
     --VERIFICA SE AGENDAMENTO AUTOMATICO DA AUDIO
     IF (AGENDAMENTOFON = 1) THEN BEGIN
     --SELECIONA DATA E HORA DISPONIVEL
     SELECT AP.DATAAGENDA, AP.HORAAGENDA, AP.PERIAGENDA, AP.VALIAGENDA
     INTO DATAAGENDA, HORAAGENDA, PERIAGENDA, VALIAGENDA
     FROM AGENDAPRE AP
     WHERE AP.IDAGENDAPRE = CODIAGENDAPRE;
     --SELECIONA DADOS DA ESPECIALIDADE
      CODIESPECIALIDADE := NULL;
      SELECT PROFISSIONALESP.CODIESPECIALIDADE, COUNT(PROFISSIONALESP.CODIESPECIALIDADE)
      INTO CODIESPECIALIDADE, QTDEESPECIALIDADE
      FROM PROFISSIONALESP
      INNER JOIN ESPECIALIDADE ON (PROFISSIONALESP.CODIESPECIALIDADE = ESPECIALIDADE.IDESPECIALIDADE)
      INNER JOIN PROFISSIONAL ON (PROFISSIONALESP.CODIPROFISSIONAL = PROFISSIONAL.CODIPROFISSIONAL)
      WHERE ESPECIALIDADE.TIPOESPECIALIDADE = 1
      AND PROFISSIONAL.DISPPROFISSIONAL IN (0,1,2)
      GROUP BY PROFISSIONALESP.CODIESPECIALIDADE
      HAVING (COUNT(PROFISSIONALESP.CODIESPECIALIDADE)) = 1;
      
      --VERIFICA SE QUANTIDADE IGUAL A 1
       IF (QTDEESPECIALIDADE = 1) THEN BEGIN
       --SELECIONA DADOS DO PROFISSIONAL
       SELECT PROFISSIONALESP.CODIPROFISSIONAL, PROFISSIONAL.NOMEPROFISSIONAL
       INTO CODIPROFISSIONAL, NOMEPROFISSIONAL
       FROM PROFISSIONALESP
       INNER JOIN PROFISSIONAL ON (PROFISSIONALESP.CODIPROFISSIONAL = PROFISSIONAL.CODIPROFISSIONAL)
       WHERE PROFISSIONALESP.CODIESPECIALIDADE = CODIESPECIALIDADE;
       END;
       END IF; 
       --SELECIONA DATA E HORA DISPONIVEL
       BEGIN
      
       BEGIN  
         SELECT DATAAGENDAHOR, HORAAGENDAHOR
         INTO DATAAGENDA, HORAAGENDA
         FROM RET_VAGAAGENDAPREHOR; 
       END;
        BEGIN
        --SETA DADOS DO PROFISSIONAL
        CODIPROFISSIONAL := 0;
        NOMEPROFISSIONAL := NULL;
        CODIESPECIALIDADE := 0;
        HORAAGENDA := NULL;
        END;
        --INSERE NA AGENDA DA AUDIO
         BEGIN
         IDAGENDAPRE := (IDAGENDAPRE + 1);
         END;
         INSERT INTO AGENDAPRE (IDAGENDAPRE, CODIAGENDA, DATAAGENDA, HORAAGENDA,
        TIPOAGENDA, MOTIAGENDA, CODIEMPRESA, NOMEEMPRESA, CODIFUNCIONARIO,
        NOMEFUNCIONARIO, CODIFUNCIONARIOFUNCAO, NOMEFUNCIONARIOFUNCAO,
        CODIMEDICO, NOMEMEDICO, CODIESPECIALIDADE, CODICIDADE, CODIPCMSO,
        CODILTCAT, CODIRECFUNCAO, FILHOFUNCAO, NOMEFUNCAO, CBO_FUNCAO,
        CODIMEDICOPCMSO, SITUAGENDA, SOLIAGENDA, ENTRAGENDA, PERIAGENDA,
        VALIAGENDA, OBSEAGENDA, OPCIONAL, CODICONVENCAO, CODIPROCEDIMENTO,
        CODIAGENDAMENTO, CODIGUIASPSADTPROC, CODIUSUARIO)
        SELECT IDAGENDAPRE, 14 AS CODIAGENDA, DATAAGENDA, HORAAGENDA,
        AP.TIPOAGENDA, AP.MOTIAGENDA, AP.CODIEMPRESA, AP.NOMEEMPRESA,
        AP.CODIFUNCIONARIO, AP.NOMEFUNCIONARIO, AP.CODIFUNCIONARIOFUNCAO,
        AP.NOMEFUNCIONARIOFUNCAO, CODIPROFISSIONAL, NOMEPROFISSIONAL,
        CODIESPECIALIDADE, AP.CODICIDADE, AP.CODIPCMSO, AP.CODILTCAT,
        AP.CODIRECFUNCAO, AP.FILHOFUNCAO, AP.NOMEFUNCAO, AP.CBO_FUNCAO,
        AP.CODIMEDICOPCMSO, 0 AS SITUAGENDA, 4 AS SOLIAGENDA, AP.ENTRAGENDA,
        PERIAGENDA, VALIAGENDA, AP.OBSEAGENDA, 14 AS OPCIONAL,
        0 AS CODICONVENCAO, 0 AS CODIPROCEDIMENTO, 0 AS CODIAGENDAMENTO,
        IDGUIASPSADTPROC, AP.CODIUSUARIO
        FROM AGENDAPRE AP
        WHERE AP.IDAGENDAPRE = CODIAGENDAPRE;      
     END;
     END;
     END IF;

END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basta isto para chamar uma SP.

 

BEGIN 
  RET_VAGAAGENDAPREHOR;
END; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Motta,

 

Certo, para executar uma SP

ela deve estar dentro de um Begin End;

 

mas e no caso

 

SELECT DATAAGENDAHOR, HORAAGENDAHOR

INTO DATAAGENDA, HORAAGENDA

FROM RET_VAGAAGENDAPREHOR;

 

que é usado o from ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí é um select, RET_VAGAAGENDAPREHOR é uma tabela ou uma view.

 

Qual sua dúvida ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ret_vagaagendaprehor

é uma procedure,

essa é a minha duvida,

quero que seja seleciona o campo DATAAGENDAHOR e o campo HORAAGENDAHOR

da procedure Ret_vagaagendaprehor, mas,

 

quando executo o select obtenho o seguinte erro:

 

Erro(56,13): PL/SQL: ORA-04044: procedimento, função, pacote ou tipo não é permitido aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para se chamar uma SP basta o nome dela e os parametros (se houver)

 

RET_VAGAAGENDAPREHOR(p1,p2,p3);

Você tem experiência com algum Banco de Dados ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No Oracle algumas coisas são mais chatinhas, uma SP não pode ser chamada como tabela via Select.

 

O que esta SP (a RET_VAGAAGENDAPREHOR) fazia no FB ?

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.