Recursividade

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Ter, 06 Jul 2004 5:43 pm

Olá a todos.

Tenho uma dúvida? Consigo realizar recursividade em PL/SQL?

Agradeço se alguém puder me responder.

Obrigado.
alexandreizumi

Mensagemem Qua, 07 Jul 2004 8:23 am

Vamos testar e já vamos descobrir:

Código: Selecionar todos
SQL> select * from a;

no rows selected

Ou seja, nada na minha tabela A.

Código: Selecionar todos
SQL> create or replace procedure rec (n number) is
  2  begin
  3    insert into a(nome) values (to_char(n));
  4    if n>0
  5    then rec(n-1);
  6    end if;
  7  end;
  8  /

Procedure created.

SQL> exec rec(5);

PL/SQL procedure successfully completed.

SQL> select * from a;

NOME     
----------
5
4
3
2
1
0

6 rows selected.

SQL>


Como você pode ver, o PL/SQL aceita recursividade. Chamei a própria procedure pra inserir as linhas na tabela!
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Sex, 26 Ago 2011 9:40 am

/*
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
/// Implementando Uma Solução Recursiva em Oracle para obter dados de uma tabela autorelacionada
///
/// Montei uma tabela para demostrar o exemplo baseado em uma hipotetica estrutura de dados porem a solução e apta a ser aplicada em
/// diversas areas onde se faça nescessario o uso de tabelas autorelacionadas como estruturas de produtos, menus hierarquicos entre muitas outras
/// soluções
///
/// Autor:Julio.Cesar.Eyras@gmail.com
///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
/// Estrutura de produtos (ou em inglês: Bill of materials (BOM)) pode ser uma lista de materiais brutos, pré-montados,
/// sub-componentes, componentes ou partes, e a quatidade necessária de cada um para manufaturar um produto por completo.
/// Pode ser usado para comunicação entre parceiros de negócios ou por simples organização de um projeto, a fim de realizar
/// uma estocagem prévia.
/// Pode ser definida de acordo com a intenção do projeto, variando seus tipos de estruturação, contendo desde propostas com
/// foco em engenharia ou ordenação por preço, até uma para a resolução de manutenções. No processo industrial, ela também é
/// conhecida como uma fórmula, receita ou lista de ingredientes. Na eletrônica, representa uma lista de componentes usados
/// numa placa de circuito impresso. Uma vez o projeto completado, a BOM é passada para para a equipe de compras ou engenheiros
/// de produção, como no caso da eletrônica, na qual irão obter os itens determinados.
/// Uma BOM é naturalmente hierárquica, com o nível superior representando o produto concluído, em que pode ser um subproduto
/// ou ele por inteiro.
///
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/

-- Criando a tabela hierarquica de forma simplificada apenas para demostrar os conceitos envolvidos
-- Drop table billofmaterials;
CREATE TABLE billofmaterials
(
id CHAR(32),
id_father CHAR(32),
description VARCHAR2(100) NOT NULL,
PRIMARY KEY (
id
) ENABLE NOVALIDATE
)

-- Populando os resgistro basicos
-- Truncate table billofmaterials;
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('1', NULL, 'Calhambeke Chines');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('2', 7, 'Motor 1.0');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('3', 16, 'Porta');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('4', 3, 'Estofamento de porta');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('5', 3, 'Maçaneta de Porta');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('6', 3, 'Vidros de Porta');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('7', 1, 'Chassis');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('8', 7, 'Barras Estruturais');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('9', 7, 'Eixos de roda');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('10', 16, 'Rodado');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('11', 10, 'Roda Liga Leve');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('14', 16, 'Vidros Dianteiro');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('15', 16, 'Vidros Traseiro');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('16', 1, 'Carroceria');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('12', 10, 'Pneu 175');
INSERT INTO billofmaterials (id, id_father, description)
VALUES ('13', 10, 'Parafusos de roda');

Select * from billofmaterials;

-- Uma forma estranha
SELECT *
FROM ( SELECT id,
id_father,
description,
SYS_CONNECT_BY_PATH (id,'.') tree,
CONNECT_BY_ROOT id children
FROM billofmaterials CONNECT BY PRIOR id_father = id )
WHERE id = 1


-- obtendo os dados estruturados hierarquicamente.
SELECT id,
id_father,
description
FROM billofmaterials
CONNECT BY PRIOR id = id_father
START WITH id = 1 --0


By J.C.E.



*Evite desperdícios, mas se precisar, imprima o conteúdo deste e-mail
tranquilo!*
O papel é biodegradável, renovável e provém de florestas plantadas.
Estas florestas são lavouras que dão emprego a milhares de pessoas.
As árvores plantadas combatem o efeito estufa, pois absorvem gás carbônico
durante o seu crescimento.
*Imprimir é dar vida!!*
Saiba mais: www.imprimiredarvida.org.br
jce
Localização: porto alegre - rs



Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes