Querys Recursivas no Oracle
Segue um exemplo prático de como fazer querys recursivas no Oracle, usando genealogia.
artefato/Programa..: querys_recursivas_no_oracle -- Empresa.................:
-- Data Inicio ............: 07/04/2011
-- Data Atual..............: 22/07/2011-- Versao..................: 0.01-- Compilador/Interpretador: Oracle-- Sistemas Operacionais...: Linux/Windows/Outros SOs-- SGBD....................: Oracle 9i/10g/11g-- Kernel..................: Nao informado!-- Finalidade..............: uso de querys recursivas no oracle com com start with ... connect by ... -- ........................: -- OBS.....................: --/* testando no oracle com start with ... connect by */--DROP TABLE genealogia;CREATE TABLE genealogia( id_genealogia integer PRIMARY KEY , nome varchar2(25) NOT NULL , id_genealogia_pai integer NULL --FOREIGN KEY fk_genealogia REFERENCES genealogia(id_genealogia));--TRUNCATE TABLE genealogia;SELECT * FROM genealogia;INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (1,'ABRAÃO',NULL);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (2,'ISAC',1);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (3,'ESAÚ',2);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (4,'JACÓ',2);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (5,'RÚBEN',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (6,'SIMEÃO',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (7,'LEVI',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (8,'JUDÁ',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (9,'ISSACAR',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (10,'ZEBULON',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (11,'JOSÉ',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (12,'BENJAMIM',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (13,'DÃ',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (14,'NAFTALI',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (15,'GADE',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (16,'ASER',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (17,'DINÁ',4);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (18,'PEREZ',8);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (19,'ZERA',8);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (20,'ESRON',18);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (21,'ARÃO ',20);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (22,'AMINADABE',21);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (23,'NASSON',22);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (24,'SALMON',23);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (25,'BOAZ',24);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (26,'OBEDE',25);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (27,'JESSÉ',26);INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (28,'DAVI',27);SELECT * FROM genealogia;--query 1, AUTO RELACIONAMENTO SELECT g1.nome , g1.id_genealogia , g2.id_genealogia_pai FROM genealogia g1 LEFT JOIN genealogia g2 ON g1.id_genealogia = g2.id_genealogia_pai ; --query 2, CONNECT BY PRIOR SELECT nome , id_genealogia , id_genealogia_pai FROM genealogia CONNECT BY PRIOR id_genealogia = id_genealogia_pai ; --query 3, LEVEL SELECT nome , id_genealogia , id_genealogia_pai , LEVEL FROM genealogia CONNECT BY PRIOR id_genealogia = id_genealogia_pai ; --query 4, START WITH SELECT nome , id_genealogia , id_genealogia_pai , LEVEL FROM genealogia START WITH id_genealogia = 4 --JACÓ CONNECT BY PRIOR id_genealogia = id_genealogia_pai ORDER BY LEVEL ASC ; --query 5, COM ARVORE SELECT RPAD(LPAD(' ', 5*(LEVEL-1))||nome,30) AS arvore , nome , id_genealogia , id_genealogia_pai , LEVEL FROM genealogia START WITH id_genealogia = 1 CONNECT BY PRIOR id_genealogia = id_genealogia_pai ORDER BY LEVEL ASC ;--query 6, SYS_CONNECT_BY_PATH SELECT LPAD(' ', 5*(LEVEL-1)) || nome AS representacao_arvore1 , SYS_CONNECT_BY_PATH(nome, '/') AS represencao_arvore2 , nome , id_genealogia , id_genealogia_pai , LEVEL FROM genealogia START WITH id_genealogia = 1 CONNECT BY PRIOR id_genealogia = id_genealogia_pai ORDER BY LEVEL ASC ;--query 7, ORDER SIBLINGS BY SELECT LPAD(' ', 5*(LEVEL-1)) || nome AS representacao_arvore1 , SYS_CONNECT_BY_PATH(nome, '/') AS represencao_arvore2 , nome , id_genealogia , id_genealogia_pai , LEVEL FROM genealogia START WITH id_genealogia = 1 CONNECT BY PRIOR id_genealogia = id_genealogia_pai ORDER SIBLINGS BY nome ASC ; --query 8, CONNECT_BY_ROOTCREATE OR REPLACE VIEW vw_genealogia AS SELECT LPAD('>', 5*(LEVEL-1)) || nome AS representacao_arvore1 , SYS_CONNECT_BY_PATH(nome, '\') AS represencao_arvore2 , CONNECT_BY_ROOT nome AS raiz , nome , id_genealogia , id_genealogia_pai , LEVEL AS nivel FROM genealogia START WITH id_genealogia = 1--CONNECT BY NOCYCLE PRIOR id_genealogia = id_genealogia_pai CONNECT BY PRIOR id_genealogia = id_genealogia_pai --ORDER SIBLINGS BY level ASCORDER BY level ASC;SELECT * FROM vw_genealogia;
Nenhum comentário:
Postar um comentário