|
|
|
 |
|  |
 |
elessard |
[plpgsql] usare nomi dinamici per le tabelle |
22-03-2012 00:46 |
|
 |
elessard |
.novellino.
Registered: Aug 2011
Posts: 7 (0.00 al dì)
Location:
Corso:
Anno:
Time Online: 2:05:12 [...]
Status: Offline
Edit | Report | IP: Logged |
[plpgsql] usare nomi dinamici per le tabelle
sto cercando di finire il progetto di quest'anno degli annunci immobiliari e ho riscontrato problemi nell'utilizzare all'interno di funzioni in plpgsql, nomi dinamici assegnati a tabelle, nel caso specifico quando tento di fare una select di una tabella ( il cui nome è inserito come argomento della funzione) per poi scorrerla con un FOR.
questo è il mio codice:
CREATE OR REPLACE FUNCTION create_view_criterio_2 (id integer, citta varchar, metratura integer) RETURNS SETOF sel_annunci AS $$
DECLARE
nome_t varchar;
range_a integer = metratura - 20;
range_b integer = metratura + 20;
annunci sel_annunci;
BEGIN
nome_t = 'view_id_' || id;
EXECUTE 'CREATE TABLE '|| nome_t || '(id_annuncio varchar PRIMARY KEY, titolo varchar, tipo contratto_domain, costo integer, mensile integer, id_unita integer, metratura integer, num_locali integer, categoria cat_domain, citta varchar)';
EXECUTE 'INSERT INTO ' || nome_t || '(SELECT A.id_annuncio, A.titolo, A.tipo, A.costo, A.mensile, U.id_unita, U.metratura, U.num_locali, U.categoria, UB.citta FROM annuncio A, unita_immobiliare U, ubicazione UB WHERE (A.unita_immobiliare = U.id_unita) AND (U.id_unita = UB.id_unita) AND (UB.citta = citta) AND (A.id_annuncio <> '|| id||') AND (U.metratura BETWEEN ' || range_a ||' AND ' || range_b ||'))';
FOR annunci IN SELECT * FROM view_id_5 LOOP
return next annunci;
END LOOP;
return;
EXCEPTION WHEN duplicate_table THEN
RETURN;
END;
$$ LANGUAGE plpgsql;
brevemente, ogni volta che io seleziono un annuncio, questa funzione (che prende come argomento l'annuncio, più altri parametri) crea una vista materializzata che ha come nome 'view_id_' più l'id dell'annuncio.
il mio problema è che non riesco a far girare nel FOR il risultato della select della vista materializzata che ho creato con un nome dinamico, infatti nella riga 'FOR annunci IN SELECT * FROM view_id_5 LOOP' ho messo 'view_id_5' giusto per testare la funzione ma tecnicamente dovrebbe essserci 'view_id_' con il numero che cambia in base all'annuncio.
come posso risolvere? ringrazio in anticipo
|
22-03-2012 00:46 |
|
|
|  |
 |
aPiso |
pizzy sei un nabbo!! ... |
22-03-2012 17:35 |
|
 |
aPiso |
.illuminato.
Registered: Sep 2010
Posts: 158 (0.03 al dì)
Location: Milano
Corso: Informatica
Anno: 3
Time Online: 1 Day, 21:54:30 [...]
Status: Offline
Edit | Report | IP: Logged |
pizzy sei un nabbo!!
|
22-03-2012 17:35 |
|
|
|  |
 |
xSharKMaNx |
Prima del FOR hai già verificato che l'INSERT INT ... |
22-03-2012 19:45 |
|
 |
xSharKMaNx |
un gioco della follia

Registered: Sep 2007
Posts: 1477 (0.23 al dì)
Location:
Corso: F49
Anno: Laureato
Time Online: 10 Days, 17:15:29 [...]
Status: Offline
Edit | Report | IP: Logged |
Prima del FOR hai già verificato che l'INSERT INTO garantisce dei record ?
Poi il FOR dovrebbe essere ..... FROM '|| nome_t ||'
visto che hai utilizzato quella variabile.
__________________
Perché, mentre il manganello può sostituire il dialogo, le parole non perderanno mai il loro potere; perché esse sono il mezzo per giungere al significato, e per coloro che vorranno ascoltare, all'affermazione della verità. E la verità è che c'è qualcosa di terribilmente marcio in questo paese. (V)
I popoli non dovrebbero aver paura dei propri governi, sono i governi che dovrebbero aver paura dei popoli. (T.J)
|
22-03-2012 19:45 |
|
|
|  |
 |
CowBoy |
Re: [plpgsql] usare nomi dinamici per le tabelle |
23-03-2012 08:03 |
|
 |
CowBoy |
.arcimaestro.
Registered: May 2006
Posts: 294 (0.04 al dì)
Location: Milano
Corso: F49 - Informatica
Anno: Laureato F49
Time Online: 3 Days, 13:40:27 [...]
Status: Offline
Edit | Report | IP: Logged |
Re: [plpgsql] usare nomi dinamici per le tabelle
code: CREATE OR REPLACE FUNCTION create_view_criterio_2 (id integer, citta varchar, metratura integer) RETURNS SETOF sel_annunci AS $$
DECLARE
nome_t varchar;
range_a integer = metratura - 20;
range_b integer = metratura + 20;
annunci sel_annunci;
BEGIN
nome_t = 'view_id_' || id;
EXECUTE 'CREATE TABLE '|| nome_t || '(id_annuncio varchar PRIMARY KEY, titolo varchar, tipo contratto_domain, costo integer, mensile integer, id_unita integer, metratura integer, num_locali integer, categoria cat_domain, citta varchar)';
EXECUTE 'INSERT INTO ' || nome_t || '(SELECT A.id_annuncio, A.titolo, A.tipo, A.costo, A.mensile, U.id_unita, U.metratura, U.num_locali, U.categoria, UB.citta FROM annuncio A, unita_immobiliare U, ubicazione UB WHERE (A.unita_immobiliare = U.id_unita) AND (U.id_unita = UB.id_unita) AND (UB.citta = citta) AND (A.id_annuncio <> '|| id||') AND (U.metratura BETWEEN ' || range_a ||' AND ' || range_b ||'))';
FOR annunci IN SELECT * FROM view_id_5 LOOP
return next annunci;
END LOOP;
return;
EXCEPTION WHEN duplicate_table THEN
RETURN;
END;
$$ LANGUAGE plpgsql;
Prova come diceva xSharKMaNx prima oppure prova sostituendo code: annunci sel_annunci; con
annunci RECORD;
__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..
|
23-03-2012 08:03 |
|
|
|  |
 |
gionavisi |
Come si può fare a creare i cluster per la vicina ... |
11-04-2012 13:52 |
|
 |
gionavisi |
.amico.
Registered: Nov 2009
Posts: 35 (0.01 al dì)
Location: pizzighettone
Corso: informatica
Anno: 2
Time Online: 3:48:50 [...]
Status: Offline
Edit | Report | IP: Logged |
Come si può fare a creare i cluster per la vicinanza geografica?che funzione da inserire in trigger e funzioni si può usare?
come avete questo problema?
|
11-04-2012 13:52 |
|
|
|  |
 |
elessard |
io ho preso le coordinate e le ho usate come se fo ... |
12-04-2012 00:15 |
|
 |
elessard |
.novellino.
Registered: Aug 2011
Posts: 7 (0.00 al dì)
Location:
Corso:
Anno:
Time Online: 2:05:12 [...]
Status: Offline
Edit | Report | IP: Logged |
io ho preso le coordinate e le ho usate come se fossero le ordinate e ascisse in un sistema di assi cartesiano x e y; poi ho banalmente usato l'annuncio per il quale volevo creare un cluster, come centro di un quadrato.
tutto ciò che era all'interno di questo quadrato è considerato geograficamente adiacente a quell'unità immobiliare.
secondo me bisogna inserire altri parametri per rendere più preciso il concetto di similarità... ma non ho ancora deciso.
questo l'ho realizzato tutto come funzione, invece il trigger l'ho fato per aggiorare la tabella materializzata usando sempre questo criterio.
|
12-04-2012 00:15 |
|
|
|  |
 |
CowBoy |
In teoria per la soluzione ottima di questo proble ... |
12-04-2012 08:41 |
|
 |
CowBoy |
.arcimaestro.
Registered: May 2006
Posts: 294 (0.04 al dì)
Location: Milano
Corso: F49 - Informatica
Anno: Laureato F49
Time Online: 3 Days, 13:40:27 [...]
Status: Offline
Edit | Report | IP: Logged |
In teoria per la soluzione ottima di questo problema è suggerito l'implementazione dei grafi, ma non conosco le richieste del progetto per poterti dire di più.
__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..
|
12-04-2012 08:41 |
|
|
|  |
 |
elessard |
Mmm... ma perchè complicarsi la vita con i grafi? ... |
12-04-2012 09:28 |
|
 |
elessard |
.novellino.
Registered: Aug 2011
Posts: 7 (0.00 al dì)
Location:
Corso:
Anno:
Time Online: 2:05:12 [...]
Status: Offline
Edit | Report | IP: Logged |
Mmm... ma perchè complicarsi la vita con i grafi? Lo scopo non è far vedere che sai utilizzare le viste materializzate?
|
12-04-2012 09:28 |
|
|
|  |
 |
gionavisi |
@elessard
... |
18-04-2012 16:31 |
|
 |
gionavisi |
.amico.
Registered: Nov 2009
Posts: 35 (0.01 al dì)
Location: pizzighettone
Corso: informatica
Anno: 2
Time Online: 3:48:50 [...]
Status: Offline
Edit | Report | IP: Logged |
@elessard
come hai fatto a vedere se una città è all'interno del tuo quadrato? hai fatto una differenza di un valore da te deciso e le coordinate del punto preso in considerazione immagino
|
18-04-2012 16:31 |
|
|
|  |
 |
elessard |
Si praticamente ho fatto così, gli ho dato un ran ... |
19-04-2012 16:46 |
|
 |
elessard |
.novellino.
Registered: Aug 2011
Posts: 7 (0.00 al dì)
Location:
Corso:
Anno:
Time Online: 2:05:12 [...]
Status: Offline
Edit | Report | IP: Logged |
Si praticamente ho fatto così, gli ho dato un range di 0,03 e poi ho visto se il punto era interno a queso segmento immaginario sia per l'asse delle x che per le y; certo sarebbe stata una cosa più fine controllare se si trovava all'interno di un cerchio ma... troppa sbatta xD
|
19-04-2012 16:46 |
|
|
|  |
 |
gionavisi |
ti ringrazio per la risposta, volevo chiedervi sap ... |
19-04-2012 23:19 |
|
 |
gionavisi |
.amico.
Registered: Nov 2009
Posts: 35 (0.01 al dì)
Location: pizzighettone
Corso: informatica
Anno: 2
Time Online: 3:48:50 [...]
Status: Offline
Edit | Report | IP: Logged |
ti ringrazio per la risposta, volevo chiedervi sapete dichiarare un tipo record? perchè io ho trovato e provato a fare cosi :
TYPE mio_studente IS RECORD
(nome VARCHAR(30),
cognome VARCHAR(30),
data_nascita DATE);
studente mio_studente;
ma non me lo permette. io vorrei un campo record cn dentro citta long e lat.
|
19-04-2012 23:19 |
|
|
|  |
 |
elessard |
non ci ho mai provato, però mi è stato detto che ... |
20-04-2012 09:54 |
|
 |
elessard |
.novellino.
Registered: Aug 2011
Posts: 7 (0.00 al dì)
Location:
Corso:
Anno:
Time Online: 2:05:12 [...]
Status: Offline
Edit | Report | IP: Logged |
non ci ho mai provato, però mi è stato detto che se passi da postgres a php un record poi da porblemi quando devi fare il parsing del risultato.
io ho fattto tutto con create type:
code:
CREATE TYPE tipo_prova AS (attributo_1 INTEGER, attributo_2 varchar .....);
|
20-04-2012 09:54 |
|
|
|  |
 |
gionavisi |
come si possono usare old e new con le tabelle a n ... |
23-04-2012 15:20 |
|
 |
gionavisi |
.amico.
Registered: Nov 2009
Posts: 35 (0.01 al dì)
Location: pizzighettone
Corso: informatica
Anno: 2
Time Online: 3:48:50 [...]
Status: Offline
Edit | Report | IP: Logged |
come si possono usare old e new con le tabelle a nomi dinamici?
|
23-04-2012 15:20 |
|
|
|  |
 |
All times are GMT. The time now is 03:30. |
|
|
 |
|
 |
|
|
|  |
Forum Rules:
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
|
HTML code is OFF
vB code is ON
Smilies are ON
[IMG] code is ON
|
|
|
|
|
|