View Full Version : Oracle: ricerca su tutte le tabelle si uno schema
Ciao a tutti,
avrei bisogno di ricercare in maniera efficiente il valore massimo utilizzato all'interno di uno schema come chiave primaria su tutte le tabelle. Il campo ha lo stesso nome e lo stesso tipo per tutte le tabelle.. Ho fatto alcune prove ma non riesco a venirne a capo.. qualcuno sa dirmi come si può fare?
magari esistono particolari funzioni, però potresti provare a :
- farti dare tutte le tabelle di uno schema (
- successivamente per ogni tabella fare una ricerca del max(column)
Non so se questa cosa la devi infilare dentro un programma che risiede sul db oppure devi realizzarla in un altro linguaggio di programmazione.
ciao
Trucchi valgono?
SELECT 'SELECT chiaveprimaria FROM '||name||' UNION ALL ' FROM tab
Questa ti restituisce una lunga stringa tipo
SELECT chiaveprimaria FROM ordini
UNION ALL
SELECT chiaveprimaria FROM clienti
UNION ALL
...
SELECT chiaveprimaria FROM fatture
UNION ALL
Ti bastera' quindi prendere questo risultato, giustapporci
SELECT MAX(chiaveprimaria) FROM (
cancellare l'ultimo UNION ALL
e postporre una parentesi chiusa )
per ottenre quindi
SELECT MAX(chiaveprimaria) FROM (
SELECT chiaveprimaria FROM ordini
UNION ALL
SELECT chiaveprimaria FROM clienti
UNION ALL
...
SELECT chiaveprimaria FROM fatture
)
Ti ritroverai con una nuova query, che potrai lanciare ed ottenere il risultato.
Togli eventuali riferimenti a tabelle che non servono.
Ovvero, fai scrivere le query dal database.
e, in generale, fai scrivere quanto piu' codice possibile da generatori di codice, eventualmente scritti da te.
Grazi mille,
adesso provo a fare la query, ma sarà alquanto lunga, dato che sono più di 140 tabelle :D
uhm.. ho provato con la prima query (SELECT 'SELECT id FROM '||name||' UNION ALL ' FROM tab) però mi da ORA-00904: "NAME": invalid identifier... :cry:
uhm.. ho provato con la prima query (SELECT 'SELECT id FROM '||name||' UNION ALL ' FROM tab) però mi da ORA-00904: "NAME": invalid identifier... :cry:
allora, "Name" come nome di colonna della tabella "tab" l'ho sparato, perche' non ricordo e non ho un'istanza oracle.
PRova
SELECT * from tab
e deduci da te il nome della colonna che contiene i nomi delle tabelle.
Ho fatto così:
SELECT 'SELECT id FROM '||tname||' UNION ALL ' FROM tab
e adesso funziona a meraviglia :D
Grazie mille!!!
Oh, non l'ho testata eh! Per compilare compila... prova un po'!
create or replace function max_tables_pk (p_owner in varchar2)
return number
is
l_max number := 0;
l_candidate number;
l_query varchar2(2000);
begin
for table_list in (select table_name from all_tables where owner = p_owner)
loop
l_query := 'select max(nome_campo_pk) from ' || table_list.table_name;
execute immediate l_query into l_candidate;
if l_candidate > l_max then
l_max := l_candidate;
end if;
end loop;
return l_max;
exception
when others then
raise_application_error(-20000, 'Holy shit! ' || sqlerrm);
end max_tables_pk;
/
Ovviamente alla riga 10 sostituisci 'nome_campo_pk' con il nome vero...
In input prende l'owner dello schema delle tabelle che ti interessano.
edit: niente, ho visto che hai risolto! Troppo tardi! Tempismo perfetto come al solito :(
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.