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
Responder
alexandreizumi
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sáb, 05 Jun 2004 11:45 pm

Olá a todos.

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

Agradeço se alguém puder me responder.

Obrigado.
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

Vamos testar e já vamos descobrir:

Selecionar tudo

SQL> select * from a;

no rows selected
Ou seja, nada na minha tabela A.

Selecionar tudo

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!
jce
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Sex, 26 Ago 2011 9:38 am
Localização: porto alegre - rs

Selecionar tudo

/*
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
/// 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.
Responder
  • Informação
  • Quem está online

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