[ biske86 @ 22.08.2010. 15:06 ] @
Izvinjavam se što postavljam duple teme ali mi je potreban odgovor a nisam ga dobio u prethodnom podforumu. Doduše gvozden je rekao da ne može ali rekoh da pitam i ovde, možda je neko upućen.

Evo i pitanja:
Imam proceduru koja vraća select upit (tj. resultset u php). Ta procedura ima out parametar. Da li je moguće da pozovem proceduru, da uzmem rekordset i da onda izvučem iz procedure out parametre? Može li neko da mi pomogne sa ovim?

Ne treba da mi neko napiše skriptu koja ovo radi već mi je potrebna samo informacija da li je ovako nešto moguće. Ne znam php a radim na nekom mysql projektu pa me interesuje zbog logike aplikacije da li ovo može da radi na ovakav način.

Kompletna tema se nalazi na adresi http://www.elitesecurity.org/t407177-0#2674869

[ bogdan.kecman @ 22.08.2010. 15:20 ] @
PROCEDURA je "podprogram" koji izvrsava skup naredbi u odnosu na ulazne parametre i koji ne vraca nikakav rezultat
FUNKCIJA je "podprogram" koji izvrsava skup naredbi u odnosu na ulazne parametre i vraca rezultat

dakle mozes da uradis

a = f(b) + c;

ako je f() funkcija

ali ne mozes da uradis

a = p(b) + c;

ako je p() procedura.

mysql definise "izlazne parametre" za proceduru sto su "recimo pointeri" na externe varijable te moze da se proceduri prosledi varijabla u koju ce procedura upisati neku vrednost. I dalje procedura "ne vraca rezultat" vec samo popunjava vrednosti nekih varijabli.

Na zalost, za sada, mysql procedura moze da radi samo sa jednostavnim varijablama, dakle ne moze da popuni NIZ.

Kada ti u proceduri uradis

SELECT 10;

To 10 nije nikakav rezultat, to sto ti tu desetku pokupis na "ovu i onu foru" moze sutra da prestane da radi kada upgradeujes mysql!!!

Jedini validan nacin da iz procedure aplikaciji prosledis niz bi bio da u proceduri kreiras temporary tabelu a onda po izlasku iz procedure tu temporary tabelu procitas (sa select iz tvog klijenta) i onda tabelu dropnes.

Dakle resenje tvog pitanja je "pravilno"

Procedura koja ima OUT parametar
Procedura koja kreira temp tabelu

ti iz klijenta uradis

CALL procedura(a);
SELECT @a;

pa ako je a ovoliko onda

SELECT * from TMP1;
DROP TABLE TMP1;

a ako je a onoliko onda samo

DROP TABLE TMP1;

tj. ako ti procedura upise u a onoliko onda mozda nije ni kreirana TMP1 pa ne moras da je brises ...

a da ne bi razmisljao da li je klijent inteligentan da obrise sam tabelu u proceduru na pocetak stavis jedno DROP TEMPORARY TABLE IF EXISTS TMP1;

[ bogdan.kecman @ 22.08.2010. 15:27 ] @
sto se tice pitanja sa drugog foruma:
Citat:

Znači proverim sesiju preko poziva CALL SP_SESIJA_PROCEDURA. Ova procedura proveri da li imam prava pristupa i ako imam postavi p_status=0. Ja to iz php-a pročitam i ako je p_status=0 onda pročitam resultset tj. ono što daje upit SELECT naziv FROM KATEDRA;


ovo je opet pogresan koncept. ako imas proceduru koja "vadi podatke" i proceduru koja "pita da li smes da dobijes podatke" - zasto onda proveru radis na php-u ? procedura koja vadi podatke treba da proveri da li imas ili nemas pravo da dobijes podatke pa da ti ih da ili ne. U tvom slucaju klijent moze da uradi sledece

1. pita da li sme da pristupi podacima
2. dobije odgovor da ne sme, izignorise taj odgovor
3. pristupi podacima

[ biske86 @ 22.08.2010. 17:26 ] @
Citat:
bogdan.kecman: sto se tice pitanja sa drugog foruma:


ovo je opet pogresan koncept. ako imas proceduru koja "vadi podatke" i proceduru koja "pita da li smes da dobijes podatke" - zasto onda proveru radis na php-u ? procedura koja vadi podatke treba da proveri da li imas ili nemas pravo da dobijes podatke pa da ti ih da ili ne. U tvom slucaju klijent moze da uradi sledece

1. pita da li sme da pristupi podacima
2. dobije odgovor da ne sme, izignorise taj odgovor
3. pristupi podacima


Ovo je pravilan pristup pošto mysql nema baš moćan jezik kao što ima orakl PL/SLQ. Ovo si mi predlagao na početku u tamo nekoj temi ali ja nisam poslušao pošto mi je ovako sa izlaznim parametrom bilo prirodnije. Ali šta da se radi, idemo dalje.

Nego nisam pročitao da si eksplicitno naveo da u mysql-u ne može da se odradi ovo što je postavljeno u nalovu teme. Molim te potvrdi mi.
[ bogdan.kecman @ 22.08.2010. 18:18 ] @
explicitno - mysql ne podrzava vracanje rezultata osim kroz izlazni parametar.

sada, sta mozes da izvadis "na foru", zavisi od trenutne verzije konektora i aplikacije koja implementira taj konektor kao i od verzije servera ... sto znaci, ako ti ne radi znaci da u tvojoj kombinaciji ne moze, u nekoj drugoj kombinaciji mozda proradi. generalno bi trebalo da mozes da u istoj konekciji posaljes jos jedan upit sa select @a; i da pokupis vrednost out parametra ... ali toliko stvari u tom celom konceptu nije u redu da je to zastrasujuce. sve i da si na oraklu sa pl/sql-om nista to ne bi trebalo drugacije da se radi... jedino deo oko preuzimanja niza ne bi morao da radis kroz temp tabelu, ali i dalje osnvni koncept kako se to radi u oraclu, mysql-u, pgsql-u .. koncept je isti, samo se sintaksa eventualno razlikuje - tvoj koncept je pogresan - ili ti je logika na bazi ili na klijentu, zamena select-ova sa call-ovima nema nikakvog smisla