Procedura per alterare e tabella di aggiornamento sul rapporto gerarchico per vedere se ci sono i bambini

StackOverflow https://stackoverflow.com/questions/2470543

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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top