Procedura per alterare e tabella di aggiornamento sul rapporto gerarchico per vedere se ci sono i bambini
-
20-09-2019 - |
Domanda
Ho una tabella gerarchica su Oracle PL / SQL. qualcosa di simile:
create table hierarchical (
id integer primary key,
parent_id references hierarchical ,
name varchar(100));
Ho bisogno di creare una procedura per modificare tale tavolo, così ho ottenere un nuovo campo che racconta, per ogni nodo, se ha dei figli o meno.
E 'possibile fare l'alter e l'aggiornamento in una procedura unica? Eventuali esempi di codice sarebbe molto apprezzato.
Grazie
Soluzione
Non si può fare il ALTER TABLE
( DDL ) e il UPDATE
( LMD ) in un unico passaggio.
Si dovrà fare lo ALTER TABLE
, seguito dal UPDATE
.
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE hierarchical ADD child_count INTEGER';
--
EXECUTE IMMEDIATE '
UPDATE hierarchical h
SET child_count = ( SELECT COUNT(*)
FROM hierarchical h2
WHERE h2.parent_id = h.id )';
END;
Pensaci due volte prima di fare questo però. Si può facilmente scoprire ora se un id
ha qualche bambino con una query.
Questo darebbe al bambino-conteggio di tutti i nodi piú ad esempio:
SELECT h.id, h.name, COUNT(childs.id) child_count
FROM hierarchical h
LEFT JOIN hierarchical childs ON ( childs.parent_id = h.id )
WHERE h.parent_id IS NULL
GROUP BY h.id, h.name
L'aggiunta di una colonna in più con i dati ridondanti farà cambiare i dati più difficile, come si avrà sempre per aggiornare il genitore anche, quando l'aggiunta / rimozione del bambino.
Altri suggerimenti
Se avete solo bisogno di sapere se esistano i bambini, la seguente interrogazione può farlo senza il loop o la colonna denormalizzato.
select h.*, connect_by_isleaf as No_children_exist
from hierarchical h
start with parent_id is null
connect by prior id = parent_id;
CONNECT_BY_LEAF restituisce 0 se la riga ha figli, 1 se non lo fa.
Penso che probabilmente si potrebbe ottenere il numero esatto dei bambini attraverso un uso intelligente delle funzioni analitiche e la pseudo-colonna di livello, ma non sono sicuro.