[ danety @ 22.03.2011. 10:19 ] @
Pozdrav svima pokusavam da napravim poceduru za brisanje podataka znaci jako je jednostavna
DELETE FROM tabela1 WHERE kolona=vrednost;
medjutim u parametre procedure mogu jedino da stavim parametre za kolonu i vrednost ako pokusam da stavim parametar za tabela1 posto u toj bazi imam tri tabele hteo bi da mogu da pozovem proceduru ovako
CALL brisanje(tabela2,kolona4,vrednost5);
ali mi svaki put brlja nesto, tabelu2 trazi u kolonama...? umesto da samo prosledi vrednost na njeno mesto.. dobio sam savet da koristim naredbu prepare ali nikako ne mogu da nadjem nesto vise o njoj.. ako neko ima iskustvo u pravljenu procedura koje se odnose na vise tabela..
Hvala svima.
[ mret @ 22.03.2011. 13:48 ] @
Pogledaj na linku: http://dev.mysql.com/tech-reso...s/4.1/prepared-statements.html

da bi ti tabela bila ulazni parametar morasa da uradis prepraded statement tj. da generises string koji ce se izvrsiti.


ili (malko gluplje resenje) je da uradis sa CASE statementom.

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html
[ bogdan.kecman @ 22.03.2011. 14:31 ] @
Code:

delimiter //
DROP PROCEDURE IF EXISTS kukuriku//
CREATE PROCEDURE colavg(IN tbl CHAR(64), IN col CHAR(64), IN val CHAR(64))
BEGIN
SET @q = CONCAT('DELETE FROM ' , tb; , ' WHERE ' , col, ' = ', val);
PREPARE stmt FROM @q;
EXECUTE stmt;
END;
//
delimiter ;


[ danety @ 22.03.2011. 14:58 ] @
Mozda sam ja glup pa nemogu da skontam kako to da uradim...
mysql> PREPARE stmt_name FROM "SELECT name FROM Country WHERE code = ?";
ali meni treba da se odabere tabela iz koje se brisu podatci nemogu ovako da uradim u proceduri
mysql> PREPARE stmt_name FROM "DELETE FROM ? WHERE kolona=vrednost";
mysql> SET @test_parm = "param1";
mysql> EXECUTE stmt_name USING @test_parm;
ovde je param1 jedan uziman iz procedure, i tako mi isto javi da mu je nepoznata kolona tamo gde sam stavio ime tabele u kojoj se vrsi brisanje... pokusavam da shvatim kako ovo radi nadam se da nisam previse naporan
[ bogdan.kecman @ 22.03.2011. 15:08 ] @
da li si probao prilozeni kod?
[ danety @ 22.03.2011. 15:09 ] @
Code:
DROP procedure if exists brisanjeOsoblja;
delimiter //
create PROCEDURE brisanjeOsoblja(IN tabela VARCHAR(45) , IN newvrednost VARCHAR(45))
BEGIN
SET @q = CONCAT('DELETE FROM ' , tabela , ' WHERE ' , ime, ' = ', newvrednost);
PREPARE stmt FROM @q;
EXECUTE stmt;
END//
delimiter ;


ovako je napravi ali isto nece da odradi posao trazi kolonu umesto tabele
[ bogdan.kecman @ 22.03.2011. 15:18 ] @
ajmo ispocetka:

Code:

mysql> CREATE PROCEDURE kukuriku(IN tbl CHAR(64), IN col CHAR(64), IN val CHAR(64))
    -> BEGIN
    -> SET @q = CONCAT('DELETE FROM ' , tbl , ' WHERE ' , col, ' = ', val);
    -> PREPARE stmt FROM @q;
    -> EXECUTE stmt;
    -> END;
    -> //
Query OK, 0 rows affected (0.07 sec)

mysql> delimiter ;       
mysql> select * from t1;
+----+----------+
| id | a        |
+----+----------+
|  1 | kukuriku | 
|  2 | test1    | 
|  3 | alfa123  | 
|  4 | 1234     | 
|  5 | 0123     | 
|  6 | 4345     | 
|  7 | 555abc   | 
|  8 | 123.12   | 
|  9 | abcdef   | 
| 10 | -1234    | 
| 11 | -1234.43 | 
| 12 | 0        | 
| 13 | 0        | 
| 14 | 0        | 
| 15 | 0        | 
+----+----------+
15 rows in set (0.00 sec)

mysql> call kukuriku("t1", "id", "7");
Query OK, 1 row affected (0.00 sec)

mysql> call kukuriku("t1", "a", "'kukuriku'");
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+----+----------+
| id | a        |
+----+----------+
|  2 | test1    | 
|  3 | alfa123  | 
|  4 | 1234     | 
|  5 | 0123     | 
|  6 | 4345     | 
|  8 | 123.12   | 
|  9 | abcdef   | 
| 10 | -1234    | 
| 11 | -1234.43 | 
| 12 | 0        | 
| 13 | 0        | 
| 14 | 0        | 
| 15 | 0        | 
+----+----------+
13 rows in set (0.00 sec)



zar nisi to hteo?
[ danety @ 22.03.2011. 15:45 ] @
Hvala mnogo :)
ovo funkcionise medjutim pravilo mi je gresku jer sam uporno upisivao table umesto tbl...
uglavnom sam ja uhvatio nit.
Nadam se da cu se jednom oduziti :) hvala jos jednom.
[ bogdan.kecman @ 22.03.2011. 23:45 ] @
table je zasticena rec .... ima dobra fora, koristis srpske izraze za varijable i skoro si uvek siguran :D

Code:

CREATE PROCEDURE kukuriku(IN tabela CHAR(64), IN kolona CHAR(64), IN vrednost CHAR(64))
BEGIN
SET @q = CONCAT('DELETE FROM ' , tabela , ' WHERE ' , kolona, ' = ', vrednost);
PREPARE stmt FROM @q;
EXECUTE stmt;
END;
[ danety @ 23.03.2011. 17:52 ] @
Sada sam naucio a stalno sam mislio da je to losa praksa ...
Da li ima veze sto sam ja stavljao VARCHAR(45) umesto CHAR(64), jel moze to da izaziva problem?
[ bogdan.kecman @ 23.03.2011. 19:09 ] @
da li je bolje trcati uz stepenice ili plivati uzvodno?

zavisi sta hoces da postignes, char() je dobar ako hoces da imas fiksnu duzinu sloga, varchar() cuva prostor (i na disku i u ramu)
[ danety @ 23.03.2011. 21:30 ] @
Pomislio sam da mozda tu imaju pravila za nazive tabela... ja jesam pretpostavio da nece praviti problem ali opet bolje da pitam dok sam na pravom mestu :)
[ bogdan.kecman @ 23.03.2011. 22:17 ] @
klljucne reci postoje, doduse mysql moze da koristi i kljucne reci za imena ali mora da se stave u `` (backtick) .. dakle ovo je ok


create table `table` (`int` int, `char` char(10));

nije bas ni pametno ni zgodno ni korisno ali ...