Sziaszok!
Adott egy egyszerű MySQL lekérdezés, amit tárolt eljárásban kéne használnom a továbbiakban
Pl.: SELET * FROM tabla WHERE szulo=2;
A problémát az okozza,hogy ezt több táblára használnom jeleneg a mostani programomban ezért a tábla nevét, mint paramétert kéne kezelni, itt kezdődnek a gondok. Az alábbi kód megcsinálja, amit szeretnék, viszont csak egyetlen rekorddal tér vissza! Nekem az összes rekord kéne, ami az adott feltételnek megfelel.
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetMenuChild`(IN `vszulo` BIGINT(20), IN `tname` VARCHAR(25))
BEGIN
SET @sql = CONCAT('SELECT * FROM ',tname,' WHERE szulo=?;');
PREPARE s1 from @sql;
SET @paramA = vszulo;
EXECUTE s1 USING @paramA;
SELECT * FROM s1;
END#
Ha valakinek van ötlete azt szívesen venném, mert már órák óta keresgélek a neten, de nem igazán találok megoldást.
- 7120 megtekintés
Hozzászólások
Nem egészen értem, hogy mi lenne ennek a célja? Valami performance okokból szét van particionálva egy tábla több különbözőre vagy mi indokolja azt, hogy a táblanevet módosítani kell?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
A lényeg, hogy több táblában van hasonló felépítés, amik kezeléséhez 1 közös modult használok és nem akarok ugyanarra több fv-t írni csak azért , mert más a tábla neve és nem akarok plusz redundanciát a rendszerbe.
Ami igazából érthetetlen, hogy miért nem tudja az execute függvény visszaadni az összes rekordot, ami megfelel a feltételnek.
- A hozzászóláshoz be kell jelentkezni
Nem tudom mi a pontos szitu vagy mennyire bonyolult az a szures, de nem tunik egy jo megoldasnak mar csak a teljesitmenyvonzata miatt sem.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Én is ettől féltem, azt gondoltam ez nem lesz ilyen bonyolult.
- A hozzászóláshoz be kell jelentkezni
Az utókor kedvéért: nekem ezen a téren régebbről vannak tapasztalataim, azóta valószínűleg már fejlődött a MySQL itt, azonban nekem úgy tűnt, hogy a MySQL egy picit komplexebb egymásba ágyazásnál már kezd lassulni, szemben pl. egy PostgreSQL-hez. Viszont az explain alapján még az is messze van attól, amit mondjuk egy MSSQL megcsinál jelenleg.
Ami viszont mindenre igaznak tűnt eddig, hogy a kézzel épített Query-knek mindig csúnya teljesítményvonzata volt.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Két dolog:
DEFINER=`root`@`localhost`
Ilyet nem csinálunk. Tessék külön felhasználóval létrehozni, nem pedig rootként.
BIGINT(20)
Ez előjeles egész, úgyhogy "csak" 9223372036854775807 a plafon. Erre biztos szükség van? Nem elég egy unsigned int(10)?
Megoldásként pedig a http://forums.mysql.com/read.php?102,50520,50520 linket tudom figyelmedbe ajánlani.
Egyébként a * kifejezést ajánlott kerülni, ha van rá egy mód, akkor a mezőneveket ki kell fejteni.
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni
Köszi a jó tanácsokat.
Az éles rendszeren nem ezt akarom alkalmazni "DEFINER=`root`@`localhost`" ez most egy teszt gépen van így csak még kísérletezem..:).
Az unsigned int 10 is elég lenne, majd optimalizálom a mezőket.
Linknél, ettől félte,hogy a kurzor használatán kívül nem marad semmi más lehetőség, nem érdemes így továbbvinni ezt a gondolatot, ehhez kevés a mysql.
Meg fogadom a tanácsod, köszi:)
- A hozzászóláshoz be kell jelentkezni
Köszönöm mindenkinek a hozzászólásokat. A téma lezárva :)
- A hozzászóláshoz be kell jelentkezni
Mi lett végül a megoldás? Btw a MySQL-t felvértezték már cursorral?
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni