Fórum Procedure - Oracle #483678
26/06/2014
0
Eu sempre executo uma SQL em meu banco de dados:
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:
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..
Alguem tem idéia?
Gustavo Clepardi
Curtir tópico
+ 0Posts
26/06/2014
Marisiana Battistella
Tenta remover os parenteses que vc colocou no like..
and ofi_servico.maodeobra like '%' || maodeobra || '%'
Eu acho que o erro que está ocorrendo é por causa disso...
Gostei + 0
26/06/2014
Gustavo Clepardi
[img]http://arquivo.devmedia.com.br/forum/imagem/375426-20140626-141141.png[/img]
Gostei + 0
26/06/2014
Marisiana Battistella
Vc não definiu as colunas que o select tem que pegar...
SELECT res.empresa,
res.revenda,
res.situacao_os,
res.chassi,
res.dta_encerramento
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 || '%'
) res
GROUP BY res.empresa,
res.revenda,
res.situacao_os,
res.chassi,
res.dta_encerramento;
Gostei + 0
26/06/2014
Gustavo Clepardi
Gostei + 0
26/06/2014
Marisiana Battistella
Gostei + 0
26/06/2014
Gustavo Clepardi
[img]http://arquivo.devmedia.com.br/forum/imagem/375426-20140626-153959.png[/img]
Gostei + 0
26/06/2014
Marisiana Battistella
Gostei + 0
26/06/2014
Marisiana Battistella
[url]http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6009.htm[/url]
Gostei + 0
27/06/2014
Lourival Queiroz
create or replace procedure retorna_chassi_recall_certo
(maodeobra IN VARCHAR2)
is
-- Declaração de variáveis aqui
Begin
end;
/
não existe a declaração "Declare" no corpo de uma procedure
Caso queira declarar variáveis de saida só acrescentar "," após a variável de "IN" veja o seguinte exemplo: (maodeobra IN VARCHAR2, Chave OUT VARCHAR2, Chave1 OUT NUMBER)
mas sempre aconselho a todos utilizar o json no oracle pois minimiza o conteudo das procedures além de torna-las mais eficientes.
Gostei + 0
27/06/2014
Marisiana Battistella
As variáveis de saída (OUT) não são utilizadas apenas quando retorna um valor único?
Fiquei com essas dúvidas, poderia me explicar?
Gostei + 0
27/06/2014
Lourival Queiroz
Exemplo:
Cursor : olha o exemplo nessa página: http://glufke.net/oracle/viewtopic.php?t=3825
Exemplo usando o PL/JSON (versão 1.0.4):
create or replace procedure Monta_Json (Campo OUT VARCHAR2)
is
ObjJson json;
Num1 NUMBER:=1;
Num VARCHAR2(10);
Ip VARCHAR2(100);
Campo VARCHAR2(30000);
begin
-- Acha o Ip
select TRIM(substr(SYS_CONTEXT ('USERENV', 'IP_ADDRESS'),1,100))
into Ip
from dual;
num1:=Num1 +1;
Num:=null;
-- Monta Objeto Json
for r in (select produto from tabela)
loop
ObjJson:=json();
ObjJson.put('FAT50_DEPOSITO', 'VEN'); - Montando variavel fixa
ObjJson.put('USUARIO', TO_CHAR(Num1)); - variavel acumulada
ObjJson.put('FAT50_PRODUTO_IE', r.Produto); - Variavel do cursor
ObjJson.Put('IP', IP); - Variavel de um select
ObjJson.put('FAT50_NARRATIVA', Num); - Variavel fixa
Campo:=json.to_char(ObjJson); - Criando Json
end loop;
end;/
Então como pode ver eu posso sair com vários campos em uma só variável de saída o qual me facilita bastante, esse exemplo acima é sobre uma única tabela, mas pode ser utilizando diversas tabelas, as possibilidade são muitas. Eu pelo menos nunca precisei utilizar retorno de cursor em procedures o pl/json resolveu todos os meus problemas.
Gostei + 0
27/06/2014
Lourival Queiroz
Gostei + 0
27/06/2014
Marisiana Battistella
Eu ainda não conhecia o PL/JSON, por isso fiquei com a dúvida...
Gostei + 0
27/06/2014
Marisiana Battistella
Por exemplo:
Quando eu estava trabalhando em uma determinada aplicação, eu criava um Package pra armazenar todas as procedures e functions que aquela aplicação iria utilizar.
Assim, eu declarava um tipo de cursor pra ser utilizado na package...
-- Declaração de tipos públicos
TYPE t_refcur IS REF CURSOR; E depois utilizava esse cursor nos procedimentos:
PROCEDURE prc_gettipobolsa(in_codtipobolsa IN acdesenv.pestipobolsa.codtipobolsa%TYPE,
out_result OUT t_refcur) IS
BEGIN
IF (in_codtipobolsa IS NULL) THEN
OPEN out_result FOR
SELECT tb.codtipobolsa,
tb.descricao,
tb.abreviatura
FROM acdesenv.pestipobolsa tb
ORDER BY tb.codtipobolsa;
ELSE
OPEN out_result FOR
SELECT tb.codtipobolsa,
tb.descricao,
tb.abreviatura
FROM acdesenv.pestipobolsa tb
WHERE tb.codtipobolsa = in_codtipobolsa
ORDER BY tb.codtipobolsa;
END IF;
END prc_gettipobolsa;O retorno de um procedimento assim eu utilizava em aplicações desenvolvidas em Delphi ou PHP, conforme a necessidade.
Gostei + 0
27/06/2014
Gustavo Clepardi
Eu na verdade executo consultas diretamente no banco de dados, então nao uso nenhum programa ou codifico nada, isso é puro e simplesmente PL/SQL direto pelo SqlDeveloper.
Ainda está dando problema!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)