[ *Winy* @ 29.08.2011. 15:53 ] @
Molim Vas za pomoc. Problematika je sledeca:

Imam jednu tabelu koje sadrzi xml definicije drugih tabela. Postoji software koji pomocu te tabele kreira druge tabele u koje se unose podatci nekih merenja.
Medjutim u jednoj tabeli jedan red sadrzi podatke npr 3 sata(npr pritisak01 temperatura01 pritisak02 temperatura02 pritisak03 temperatura03)(broj sati varira od tabele do tabele), koje treba prebaciti u trecu tabelu tako da u jednom redu budu vrednosti jednog sata.

Kako to da odradim dinamicki. Znaci kada se pojavi nova definicija tabele u prvoj tabeli da generise trecu tabelu i popuni podatcima od jednog sata?
[ bogdan.kecman @ 29.08.2011. 15:56 ] @
najlakse ti je to da odradis na strani klijenta. teoretski bi verovatno moglo u stored procedure sa pepapre mada je realno lakse u klijentu
[ *Winy* @ 29.08.2011. 16:07 ] @
Hvala na brzom udgovoru ali bi mi bila potrebna pomoc u resavanju sa procedurama i trigerima.
[ bogdan.kecman @ 29.08.2011. 16:17 ] @
napravis trigger na on insert za tu tabelu "gde treba da se pojavi" koji bi to onda trebao da odradi ..

ali su ti informacije preopsirne za detaljniju pomoc od toga ...

ako ti se u tabeli X nalazi ceo alter onda on insert uradis prepare sa vrednoscu koja je poslata i exec onda toga ...

samo generalno - to je prilicno los koncept, ako hoces pomoc, aj objasni zasto to radis posto sam siguran da ima bolje resenje, to sto si zamislio, ako sam te dobro razumeo, ce da dangne ceo sistem vrlo brzo i ostavlja milion mesta za gresku
[ *Winy* @ 29.08.2011. 19:07 ] @
Hvala lepo jos jednom.
Radi se o php stranici koja cita vrednosti iz baze i prikazuje korisnicima. Ali svako ima svoju vrstu izvestaja jer ne zanimaju svakog iste stvari. Redove u prvoj tebli sa xml definicijama generise program na koji nemam uticaj isti popunjava i drugu tabelu ali u formi koja mi ne odgovara.
[ bogdan.kecman @ 29.08.2011. 20:34 ] @
cek mislim da sam te pogresno razumeo ... ti imas u nekoj tabeli definiciju u nekom varchar/text polju koja je XML i od tog xml-a treba da uradis create table ovo ono ... zaboravi na trigere i stored procedure, napisi php koji ce to da radi (ili c ili c++ ili piton ili perl ili sta god ti je omiljeni skripting jezik), to ce se otelis u SP a pitanje da li uopste i moze da se napravi (mislim da ne moze)
[ *Winy* @ 30.08.2011. 06:40 ] @
Ok hvala,
Da li postoji nacin da trigger pozove php funkciju ili c funkciju?
[ bogdan.kecman @ 30.08.2011. 06:50 ] @
teoretski - da - ti mozes da napravis UDF i da ga pozoves iz trigera, pogledaj dokumentaciju i primer
[ *Winy* @ 04.09.2011. 11:25 ] @
Hvala na pomoci, ali jos uvek nisam uspeo da resim svoj problem.
Da li neko moze detaljno da mi opise kako da napravim UDF u C++ ili C posto ne mogu da nadjem opsirnu dokumentaciju za to.
[ bogdan.kecman @ 04.09.2011. 16:27 ] @
prvo - imas primer u postu pre tvog pitanja
drugo - google je tvoj prijatelj

da ne kazem da u mysql manualu imas sve sto ti treba samo isprati manual od pocetka do kraja
http://dev.mysql.com/doc/refman/5.5/en/adding-udf.html
http://dev.mysql.com/doc/refman/5.5/en/udf-calling.html
http://dev.mysql.com/doc/refman/5.5/en/udf-compiling.html


Gomilu primera udf funkcija imas u repozitorijumu mysql udf funkcija: http://www.mysqludf.org/

[ *Winy* @ 04.09.2011. 19:19 ] @
Hvala!
[ *Winy* @ 07.09.2011. 14:28 ] @
Da li mozda neko ima ideju kako da resim ovu gresku.

errno: 22 /usr/lib/CrTable.so: undefined symbol: mysql_query

Greska se javlja nakon kompajliranja udf-a i postavljanja u direktorijum za shared objekte, pri kreiranju funkcije u MySQL-u.
[ bogdan.kecman @ 07.09.2011. 14:47 ] @
lose si kompajlirao crTable

ti iz udf-a radis konekciju na mysql ?
[ *Winy* @ 07.09.2011. 15:00 ] @
Hvala!

Iskreno receno pokusavam na bilo koji nacin. Znam osnovne stvari u MySQL-u, a ovo daleko prelazi tu granicu. Moram srediti to dodavanje tabele a nemam dovoljno znanja.
Ako imas kakvu ideju molim te napisi, a bio bih zahvalan i za objasnjenje.
[ bogdan.kecman @ 07.09.2011. 15:54 ] @
neka ti udf funkcija vraca sql string za kreiranje tabele ...

za test uradi samo "SELECT tvojafunkcija(stagod)" i vidi da li dobijas nazads to kako treba

onda sa prepare to sto si dobio izvrsi
[ *Winy* @ 08.09.2011. 13:31 ] @
Hvala!

Kada ubacim funkciju u prepare sa select-om:
PREPARE stmt FROM 'SELECT UDF()';
I pozovem EXECUTE stmt stampa mi return udf() funkcije.

Kada koristim bez select:
PREPARE stmt 'UDF()';
Stampa mi gresku pri inicijalizaciji:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'calc_distance_udf()' at line 1

Gde gresim?



[ bogdan.kecman @ 08.09.2011. 13:46 ] @
sta ti kaze samo SELECT tvojudf(); ?
[ *Winy* @ 08.09.2011. 13:49 ] @
Takodje mi stampa return udf() funkcije:

CREATE TABLE Proba (id int primary key, name varchar(40))engine=InnoDB;
[ *Winy* @ 08.09.2011. 17:09 ] @
U prethodnim porukama si rekao da to odradim php-om ili nekim drugim jezikom. Mozes mi opisati kakva ti je bila zamisao.
Hvala!
[ bogdan.kecman @ 09.09.2011. 02:37 ] @
u "drugom" jeziku je bilo da pozoves tvoj udf koji ce onda trigerovati neki tvoj jezik koji ce odraditi sta treba, drugi nacin je da imas tvoj app koji zoves iz krona svakih sat vremena ili jednom dnevno ili ... i koji odradi sta treba ..


... no to je sve moguce direkt iz stored procedure / trigera .. ne znam gde si zaglavio, evo ti primer kako to radi

Code:

mysql> drop table if exists t1;
Query OK, 0 rows affected (0.10 sec)

mysql> drop table if exists t2;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table if exists t3;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table if exists t4;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table if exists t5;
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> CREATE TABLE t1 (a varchar(500) );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t1 VALUES
    ->   ("CREATE TABLE t2 (x int, y int) engine=innodb"), 
    ->   ("CREATE TABLE t3 (x int, y int) engine=myisam"),
    ->   ("CREATE TABLE t4 (x int, y int) engine=myisam"),
    ->   ("CREATE TABLE t5 (x int, y int) engine=innodb");
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> 
mysql> DROP PROCEDURE IF EXISTS simpleproc;
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> delimiter //
mysql> 
mysql> CREATE PROCEDURE simpleproc ()
    -> BEGIN
    ->   DECLARE var1 VARCHAR(500);
    ->   DECLARE gotovo BOOLEAN;
    ->   DECLARE cur1 CURSOR FOR SELECT a FROM t1;
    -> 
    ->   DECLARE CONTINUE HANDLER FOR NOT FOUND 
    ->   SET gotovo = TRUE;
    -> 
    ->   SET gotovo = FALSE;
    ->   OPEN cur1;
    -> 
    ->   glavna_petlja: LOOP
    -> 
    ->     FETCH cur1 INTO var1;
    -> 
    ->     IF gotovo THEN
    ->       CLOSE cur1;
    ->       LEAVE glavna_petlja;
    ->     END IF;
    -> 
    ->     SET @temp = var1;
    ->     PREPARE stmt1 FROM @temp;
    ->     EXECUTE stmt1;
    ->     DEALLOCATE PREPARE stmt1;
    -> 
    ->   END LOOP glavna_petlja;
    -> 
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> delimiter ;
mysql> 
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)

mysql> call simpleproc();
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
| t2             |
| t3             |
| t4             |
| t5             |
+----------------+
5 rows in set (0.00 sec)

mysql> 


Sve sto ti ovde treba da uradis je da, posto nemas CREATE ovo ono u tabeli sa podacima nego negi XML, napravis svoju funkciju koja ce od XML-a napraviti CREATE i u ovoj skripti samo zamenis

SET @temp = var1;

sa

SET @temp = tvojudf(var1);

tvom udf-u se prosledi taj xml string i on vrati nazad create table ovo ono ...

[ *Winy* @ 09.09.2011. 09:44 ] @
Hvala ti lepo na odgovoru.
Da li mozes da mi kazes kako mogu da prosledim neki parametar recimo sadrzaj neke celije udf-u?
Dobijem Unknown table 'poll' in field list. Medjutim tabela postoji.
[ *Winy* @ 09.09.2011. 10:48 ] @
Uspeo sam uz pomoc promeljive.
[ *Winy* @ 13.09.2011. 15:36 ] @
Opet muka... Pokusavam da parsiram XML i da ukljucim libxml biblioteke u UDF kod kompajliranja prodje dobro medjutim kod mysql dobijem undefined symbol: xmlNewReaderFilename.
[ bogdan.kecman @ 13.09.2011. 17:44 ] @
probaj da ulinkujes staticki xml biblioteku u taj plugin
[ *Winy* @ 26.09.2011. 12:23 ] @
Evo me nakon duzeg vremena, sve to pojedinacno radi extra ali kad spojim dobijam:

Error Code: 1336. Dynamic SQL is not allowed in stored function or trigger

za kreiranje tabele koristih proceduru koju si napisao na prethodnoj strani. Kada je pozovem iz terminala sve se lepo odradi medjutim kad pozovem iz triggera pocinju problemi.
Ima li nacina da ga prevarim?

Hvala na dosadasnjoj pomoci!
[ bogdan.kecman @ 26.09.2011. 12:32 ] @
zaboravio sam sta bese ideja, zasto / kad kreiras te tabele ... da li moras da ih kreiras iz trigera ili mozes da ih kreiras "na svakih xyz minuta/sati/dana" ... posto ti mozes da dodas event koji ce da izvrsava stored proceduru koja moze da ima dinamicki sql. Eventualno iz trigera mozes da probas da zovnes SP (mada to nikad nisam probao).
[ *Winy* @ 26.09.2011. 14:50 ] @
Moram triggerom pokrenuti ali ne znam kako jer ovako nece.
[ bogdan.kecman @ 26.09.2011. 21:52 ] @
napisi stored proceduru i pozovi je iz trigera
[ *Winy* @ 27.09.2011. 07:22 ] @
Jurim po netu sta je razlika zimedju procedure i stored procedure. Posto ne nalazim, da li mozes da mi objasnis? ili da mi kazes kako se ona pravi.
[ bogdan.kecman @ 27.09.2011. 13:07 ] @
nema razlike, napisi proceduru - to si valjda vec probao i radi ti .. onda tu proceduru zovi iz trigera
[ *Winy* @ 27.09.2011. 14:16 ] @
aha pa onda ne moze tako jer dobijem:

Detaljnije:
Napisao sam trigger koji parsira iz XML podatke potrebne za kreiranje nove tabele i koji takodje sve to spoji i stavi u novu tabelu, pa poziva proceduru koja cita iz tabele i na osnovu tih podataka kreira tabelu.
Posebno radi sve kako treba kada spojim Dynamic SQL is not allowed.

Probao sam da triggerom parsiram XML pa da pozovem proceduru koja ce ubaciti u taj text u tabelu i pozove trecu proceduru da napravi tabelu medjutim rezultat isti.

Error Code: 1336. Dynamic SQL is not allowed in stored function or trigger

neka druga ideja?

Ili ideja kako da resim undefined symbol:mysql_query prilikom deklaracije UDF u mysql.
Imam C program koji prihvata parametar iz triggera, kompajlira se bez greske medjutim kod deklaracije u MySQL-u dobijam gore navedenu gresku.
[ bogdan.kecman @ 27.09.2011. 14:23 ] @
zar nisi uspeo da odradis to iz klasicne stored procedure ?!
[ *Winy* @ 27.09.2011. 14:28 ] @
Napravio sam proceduru koja kada se iz terminala pozove napravi tabelu kako treba, medjutim kada iz triggera pozovem proceduru nece.
Malo sam dopunio prethodni odgovor.
[ bogdan.kecman @ 27.09.2011. 14:59 ] @
hm izgleda da kada pozoves proceduru iz trigera on i dalje ima zabranu za dynamic :( steta ...

za simbol mora da ulinkujes -lmysqlclient_r
[ *Winy* @ 27.09.2011. 17:59 ] @
Mali razvoj situacije, UDF pisan u C-u radi ali ima gresku prilikom konekcije. Koristim standardni nacin pristupa iz C-a:
Code:
 MYSQL *conn;

  conn = mysql_init(NULL);
  if (!mysql_real_connect(conn, "localhost", "root", "pass", "database", 0, NULL, 0)) {
      query= "Greska";
      
   }
  
  mysql_query(conn, args->args[0]);

  mysql_close(conn);
[ bogdan.kecman @ 28.09.2011. 09:58 ] @
vrati mysql_error() umesto "greska"