- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 17 anos, 1 mês atrás por
Scheidt.
-
AutorPosts
-
20 de janeiro de 2009 às 3:23 pm #84805
Scheidt
ParticipanteBom dia.
Estou com uma missão em migrar para Oracle algumas procedures que se encontram escritas para Sybase/SQL Server, peguei alguns casos que o retorno é o result set.
A minha dúvida seria como retornar o result set em uma procedure no Oracle, visto que para cada campo retorno do SELECT se faz necessário um variável no INTO.
Aguardo retorno.
At.
Scheidt20 de janeiro de 2009 às 3:34 pm #84806Leonardo Litz
ParticipanteOlá Scheidt.
Teria como vc postar ai o código em Sysbase/ Sql Server para ver se entendo oque vc precisa?
20 de janeiro de 2009 às 3:51 pm #84807Scheidt
ParticipanteTem sim, segue um exemplo do código escrito em Sybase/SQL Server.
CREATE PROCEDURE proc_exp_s_partnumber0
(@w_ref_id CHAR(20) = NULL, @w_cli_id CHAR(6) = NULL)
AS
BEGIN
SELECT pn_referencia,cli_id,pn_descricao
FROM tab_partnumber
WHERE pn_referencia = @w_ref_id
AND cli_id = @w_cli_id
ENDMas para transformar o essa mesma procedure para Oracle fica da seguinte maneira.
— Criacao de procedure
CREATE OR REPLACE PROCEDURE dbo.proc_exp_s_partnumber0 (
vw_ref_id in CHAR := NULL ,
vw_cli_id in CHAR := null ) IS— Declaracoes de variaveis
v_pn_referencia CHAR(20);
v_cli_id CHAR(6);
v_pn_descricao VARCHAR(255);BEGIN
BEGIN
SELECT pn_referencia , cli_id , pn_descricao
INTO v_pn_referencia, v_cli_id, v_pn_descricao
FROM tab_partnumber
WHERE pn_referencia = vw_ref_id AND cli_id = vw_cli_id ;
END;
END;Neste caso para cada retorno de um campo do SELECT se faz necessário a declaração de variáveis e a inclusão das variávens após o INTO.
Só que neste caso vai sempre me trazer o último registro encontrado no SELECT, e o que eu preciso na realidade é o retorno de todo conteúdo do SELECT.Espero que tenha sido claro no exemplo!
At.
Scheidt20 de janeiro de 2009 às 4:26 pm #84808Leonardo Litz
ParticipanteSeguinte Scheidt.
Para este caso vc deverá criar uma função de pipelined.
1º Crie um type com as colunas que vc deseja retornar:
TYPE TYP_TESTE_PIPELINED IS RECORD(
ITEM_PRINCIPAL VARCHAR2(19),
ITEM VARCHAR2(19),
ORDEM NUMBER,
ORDEM_PRINCIPAL NUMBER,
GRUPO_VENDA VARCHAR2(20),
PRINCIPAL VARCHAR2(1)
);2º Crie um table deste type, desta forma vc terá o retorno de um objeto bidimensional:
TYPE TYP_TB_TESTE_PIPELINED IS TABLE OF TYP_TESTE_PIPELINED;
3º Crie a função de pipelined:
FUNCTION itensConsulta(P_COMPONENTE IN VARCHAR2)
RETURN TYP_TB_TESTE_PIPELINED PIPELINED
IS
c number:=0;
c2 number :=0;
BEGINFOR DD IN (select distinct c.item, c.componente, i.grupo_venda from componentes c, items i where c.item = i.codigo and (c.componente = P_COMPONENTE) order by i.grupo_venda asc,c.item asc) loop c2 := c2 + 1; registro.ITEM_PRINCIPAL := dd.componente; registro.ITEM := dd.item; registro.GRUPO_VENDA := dd.grupo_venda; registro.ORDEM := c; registro.ORDEM_PRINCIPAL := c2; registro.PRINCIPAL := 'N'; pipe row(registro);end loop;
return;
END itensConsulta;
4º – Para utilizar a função faça:
select ITEM_PRINCIPAL,
ORDEM,
ORDEM_PRINCIPAL,
PRINCIPAL
FROM TABLE(itensConsulta(‘1234’));Desta forma vc terá o retorno de uma tabela com n registros.
Vale lembrar tb que utilizando funções de pipelined vc pode descomplicar o código, além de serem mais rapidas que querys complexas.Vlw Leonardo Litz
20 de janeiro de 2009 às 4:30 pm #84809Regis Araujo
ParticipanteEi amigo.. bom dia!
pq vc não cria um cursor??? Ai ele irá lhe trazer todo o conteudo do select…
PROCEDURE SP_proc_exp_s_partnumber0(CCURSOR OUT SP_proc_exp_s_partnumber0.TCursor,
vw_ref_id in CHAR := NULL ,
vw_cli_id in CHAR := null) IS— Declaracoes de variaveis
v_pn_referencia CHAR(20);
v_cli_id CHAR(6);
v_pn_descricao VARCHAR(255);
BEGINOPEN CCURSOR FORSELECT pn_referencia , cli_id , pn_descricao
FROM tab_partnumber
WHERE pn_referencia = vw_ref_id AND cli_id = vw_cli_id ;END SP_proc_exp_s_partnumber0;
Abraços…
20 de janeiro de 2009 às 6:13 pm #84810Scheidt
ParticipanteMuito obrigado pelo retorno Leonardo e Regis.
Estarei repassando ao pessoal a solução.
At.
Scheidt -
AutorPosts
- Você deve fazer login para responder a este tópico.