Ajuda - Procedure - Oracle

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
clepardi
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 26 Jun 2014 1:31 pm

Bom dia,

Eu sempre executo uma SQL em meu banco de dados:

Selecionar tudo

Select empresa, revenda, situacao_os, chassi, dta_encerramento from
(
select ofi_atendimento.empresa, ofi_atendimento.revenda, ofi_ordem_servico.situacao_os, ofi_atendimento.chassi, ofi_ordem_servico.dta_encerramento
from ofi_servico_os, ofi_servico, ofi_atendimento, ofi_ordem_servico
where ofi_atendimento.contato = ofi_servico_os.contato
and ofi_atendimento.empresa = ofi_servico_os.empresa
and ofi_atendimento.revenda = ofi_servico_os.revenda
and ofi_ordem_servico.empresa = ofi_atendimento.empresa
and ofi_ordem_servico.revenda = ofi_atendimento.revenda
and ofi_ordem_servico.contato = ofi_atendimento.contato
and ofi_servico_os.empresa = ofi_servico.empresa
and ofi_servico_os.servico = ofi_servico.servico 
and ofi_servico.maodeobra like '%M0011%'
)
group by empresa, revenda, situacao_os, chassi, dta_encerramento;

Porém eu gostaria de criar uma procedure para isso.
Na penultima linha final, onde está escrito: and ofi_servico.maodeobra like '%M0011%'
esse M0011, eu gostaria que fosse dinamico, ou seja, repassado via parametro, pois ele é variavel.

Queria alguma coisa que fosse do tipo assim:
select chassi(M0011);

E ele retornasse tudo o que está ai.

Já tentei alguns códigos, como este por exemplo:

Selecionar tudo

create or replace
procedure retorna_chassi_recall_certo (maodeobra VARCHAR2) 
is
Begin

Select into empresa, revenda, situacao_os, chassi, dta_encerramento from
(
select ofi_atendimento.empresa, ofi_atendimento.revenda, ofi_ordem_servico.situacao_os, ofi_atendimento.chassi, ofi_ordem_servico.dta_encerramento
from ofi_servico_os, ofi_servico, ofi_atendimento, ofi_ordem_servico
where ofi_atendimento.contato = ofi_servico_os.contato
and ofi_atendimento.empresa = ofi_servico_os.empresa
and ofi_atendimento.revenda = ofi_servico_os.revenda
and ofi_ordem_servico.empresa = ofi_atendimento.empresa
and ofi_ordem_servico.revenda = ofi_atendimento.revenda
and ofi_ordem_servico.contato = ofi_atendimento.contato
and ofi_servico_os.empresa = ofi_servico.empresa
and ofi_servico_os.servico = ofi_servico.servico 
and ofi_servico.maodeobra like ('%' || maodeobra || '%')
)
group by empresa, revenda, situacao_os, chassi, dta_encerramento;

END;
Mas dá erro!
E nunca retorna..

alguém tem idéia?
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

Quando você coloca uma query dentro duma procedure, tem que usar a cláusula INTO.
Ou seja, ele vai jogar o valor de cada campo em uma variável.
Ele só retorna 1 registro por vez. Se tiver mais que 1 registro, dá erro! (too many rows)

Outro detalhe:
A procedure executa dentro do banco de dados Oracle. Não é na sua máquina.
Então você precisa se preocupar em O QUE FAZER com a saída.
Se quiser que aparece na tela, precisa colocar:

Selecionar tudo

DBMS_OUTPUT.PUT_LINE ( 'ola aqui vai o texto' );
Isso é mais ou menos semelhante ao System.out.println do java.

Pra fazer com que a query retorne várias linhas, precisa colocar ela num CURSOR.
Dai o oracle retorna cada linha por vez.
Leia sobre isso! Aqui no forum deve ter inúmeros exemplos.

La no tutoriais deve ter algumas apostilas sobre isso inclusive.
Responder
  • Informação