Está en la página 1de 7

Querys Recursivas no Oracle

Querys Recursivas no Oracle

Segue um exemplo prático de como fazer querys recursivas no Oracle, usando genealogia.

Recomendado para quem está estudando para a obtenção da Certificação Oracle Database: SQL Expert (OCE – Oracle Certified Expert), Exame 1Z0-047
Oracle Database SQL Expert.

?
1 --
2 -- Nome Artefato/Programa..: querys_recursivas_no_oracle
-- Empresa.................:
3
-- Autor(es)...............: Emerson Hermann (emersonhermann@gmail.com)
4 -- Data Inicio ............: 07/04/2011
5 -- Data Atual..............: 22/07/2011
6 -- Versao..................: 0.01
7 -- Compilador/Interpretador: Oracle
-- Sistemas Operacionais...: Linux/Windows/Outros SOs
8 -- SGBD....................: Oracle 9i/10g/11g
9 -- Kernel..................: Nao informado!
10 -- Finalidade..............: uso de querys recursivas no oracle com com start with ... connect
11 by ...
12 -- ........................:
13 -- OBS.....................:
--
14
15
16 /* testando no oracle com start with ... connect by */
17
18 --DROP TABLE genealogia;
19 CREATE TABLE genealogia
20 (
21 id_genealogia integer PRIMARY KEY
, nome varchar2(25) NOT NULL
22 , id_genealogia_pai integer NULL --FOREIGN KEY fk_genealogia REFERENCES
23 genealogia(id_genealogia)
24
25 );
26
27 --TRUNCATE TABLE genealogia;
28
29 SELECT * FROM genealogia;
30
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (1,'ABRAÃO',NULL);
31 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (2,'ISAC',1);
32 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (3,'ESAÚ',2);
33 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (4,'JACÓ',2);
34 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);
35
INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (7,'LEVI',4);
36 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (8,'JUDÁ',4);
37 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (9,'ISSACAR',4);
38 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (10,'ZEBULON',4);
39 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);
40 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (13,'DÃ',4);
41 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (14,'NAFTALI',4);
42 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (15,'GADE',4);
43 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);
44 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (18,'PEREZ',8);
45 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (19,'ZERA',8);
46 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (20,'ESRON',18);
47 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);
48 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (23,'NASSON',22);
49 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (24,'SALMON',23);
50 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (25,'BOAZ',24);
51 INSERT INTO genealogia (id_genealogia, nome, id_genealogia_pai) VALUES (26,'OBEDE',25);
52 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);
53
54 SELECT * FROM genealogia;
55
56
57 --query 1, AUTO RELACIONAMENTO
58
59 SELECT g1.nome
60 , g1.id_genealogia
, g2.id_genealogia_pai
61 FROM genealogia g1
62 LEFT JOIN genealogia g2
63 ON g1.id_genealogia = g2.id_genealogia_pai
64 ;
65
66 --query 2, CONNECT BY PRIOR
67
SELECT nome
68 , id_genealogia
69 , id_genealogia_pai
70 FROM genealogia
71 CONNECT BY PRIOR id_genealogia = id_genealogia_pai
;
72
73 --query 3, LEVEL
74
75 SELECT nome
, id_genealogia
76 , id_genealogia_pai
77 , LEVEL
78 FROM genealogia
79 CONNECT BY PRIOR id_genealogia = id_genealogia_pai
;
80
81 --query 4, START WITH
82
83 SELECT nome
84 , id_genealogia
85 , id_genealogia_pai
86 , LEVEL
FROM genealogia
87 START WITH id_genealogia = 4 --JACÓ
88 CONNECT BY PRIOR id_genealogia = id_genealogia_pai
89 ORDER BY LEVEL ASC
90 ;
91
--query 5, COM ARVORE
92
93
SELECT RPAD(LPAD(' ', 5*(LEVEL-1))||nome,30) AS arvore
94 , nome
95 , id_genealogia
96 , id_genealogia_pai
97 , LEVEL
FROM genealogia
98 START WITH id_genealogia = 1
99 CONNECT BY PRIOR id_genealogia = id_genealogia_pai
100 ORDER BY LEVEL ASC
101 ;
102
103 --query 6, SYS_CONNECT_BY_PATH
104
105 SELECT LPAD(' ', 5*(LEVEL-1)) || nome AS representacao_arvore1
, SYS_CONNECT_BY_PATH(nome, '/') AS represencao_arvore2
106 , nome
107 , id_genealogia
108 , id_genealogia_pai
109 , LEVEL
FROM genealogia
110 START WITH id_genealogia = 1
111 CONNECT BY PRIOR id_genealogia = id_genealogia_pai
112 ORDER BY LEVEL ASC
113 ;
114
115 --query 7, ORDER SIBLINGS BY
116
SELECT LPAD(' ', 5*(LEVEL-1)) || nome AS representacao_arvore1
117 , SYS_CONNECT_BY_PATH(nome, '/') AS represencao_arvore2
118 , nome
119 , id_genealogia
120 , id_genealogia_pai
, LEVEL
121 FROM genealogia
122 START WITH id_genealogia = 1
123 CONNECT BY PRIOR id_genealogia = id_genealogia_pai
124 ORDER SIBLINGS BY nome ASC
125 ;
126
--query 8, CONNECT_BY_ROOT
127
128
CREATE OR REPLACE VIEW vw_genealogia AS
129 SELECT LPAD('>', 5*(LEVEL-1)) || nome AS representacao_arvore1
130 , SYS_CONNECT_BY_PATH(nome, '\') AS represencao_arvore2
131 , CONNECT_BY_ROOT nome AS raiz
132 , nome
133 , id_genealogia
, id_genealogia_pai
134 , LEVEL AS nivel
135 FROM genealogia
136 START WITH id_genealogia = 1
137 --CONNECT BY NOCYCLE PRIOR id_genealogia = id_genealogia_pai
CONNECT BY PRIOR id_genealogia = id_genealogia_pai
138 --ORDER SIBLINGS BY level ASC
139 ORDER BY level ASC;
140
141 SELECT * FROM vw_genealogia;
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164

También podría gustarte