[Lezárva] MYSQL tárolt eljárás, ami mindig egy rekordot ad vissza.

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.

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 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.

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™

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"

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:)

Köszönöm mindenkinek a hozzászólásokat. A téma lezárva :)