PDA

View Full Version : Oracle: ricerca su tutte le tabelle si uno schema


xirc85
24-01-2011, 14:16
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?

gokan
24-01-2011, 20:43
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

gugoXX
24-01-2011, 21:04
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.

xirc85
25-01-2011, 07:54
Grazi mille,
adesso provo a fare la query, ma sarà alquanto lunga, dato che sono più di 140 tabelle :D

xirc85
25-01-2011, 08:42
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:

gugoXX
25-01-2011, 09:01
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.

xirc85
25-01-2011, 09:16
Ho fatto così:
SELECT 'SELECT id FROM '||tname||' UNION ALL ' FROM tab
e adesso funziona a meraviglia :D

Grazie mille!!!

shinya
25-01-2011, 09:17
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 :(