Elvileg hasznal az Oracle keep_alive-ot (ha szabvanyosan mukodik alatta a TCP/IP). A problema az szokott lenni, hogy nem minden gyarto tartja magat a szabvanyhoz.
Ezt a 'dead connection detection'-nel lehet athidalni.
A szerver oldali sqlnet.ora file-ba kell beirni: SQLNET.EXPIRE_TIME = [perc]
crockl! Köszi a választ! Közben rájöttem, hogy amivel az 1)-ben szenvedtem azt asszem megtudom oldani egy subquery-vel. Viszont ezt a CASE-t sehol nem találom a doksiban ami nekem van, tudnál irni egy egyszerű példát, hogy hogyan kell használni? Köszi!
2) Használhatod a decode-kifejezést.
decode(kif, kif-ért1, ért1 [, kif-ért2, ért2]... [, default-ért])
tehát egy kifejezés, aztán ha-akkor értékpárok.
Ha "kif" egyenlő valamelyik "kif-ért"-tel, akkor a decode-kifejezés értéke az "kif-ért" után következő "ért" lesz. Ha egyik sem, és van "default-ért", akkor az.
Esetedben decode(oszto, 0, 0, valami)
1)A kifelyezesed ami a select es a from kozott van, az where feltetel utani select eredmenyhalmazon hajtodik vegre, igy where feltetelben nem tudsz hivatkozni ra, de ertelme sincs, de order-nel mar meg tudod adni, mert az az eredmeny halamzon dolgozik mar. Ha ilyesmi kell, irj plsql-be ra procedurat, fguveny, es/vagy azt add where-be is.
Sziasztok!
Oracle sqlplus-ban kellene összehoznom 1-2 lekérdezést, de átkozottúl elakadtam vele. Két kérdésem lenne:
1) Select utasításban beírok oszlop definiciónak egy bazi hosszú képletet, és adok neki egy alias nevet. Tudok valahogy ezzel az alias névvel hivatkozni rá, vagy ha újra akarom használni akkor muszály megint kiírnom a képletet?
2) Szintén selectben lehet valahogy feltételes kifejezést beírni oszlop definíciónak? Mondjuk valami ilyenre gondolok (if oszto<>0 then valami/oszto else 0) :))
Ezt most úgy csináltam, hogy az osztómat a where részben vizsgálom, és unio-val hozzácsapom azokat a rekordokat ahol az osztó nulla. De egy olyan lekérdezésben ahol van 15 osztás ez már kb@szott nagy macera, pedig nekem most ilyen kell.
Lécci szánjatok meg valami válasszal ez most életet ment :))
hat sajnos az elmeletem meg nem mukodik a gyakorlatban :))
Szoval az a lenyege, hogy a select-emben, hogy olyan erteket is ki tudjak selectalni ami nem tabla-oszlop specifikus, ezert egy fuggveny altal visszaadott erteket selectalok. Ez a fuggveny az en altalam keszitett packageben van, de a lenyeg hogy mikor az igy atmodositott selectet tartalmazo reportot (ami szinten nem mas mint egy package - Portal megjegyzes..:) buildelem a kovetkezo hibauzenettel dob vissza:
'Function GET_ROWS_FUNC does not guarantee not to update database'
ahol GET_ROWS_FUNC termeszetesen az a fuggveny ami a selectben van es hat nincs benne semmilyen 'update..
Szoval miert nem tetszik ez a 'Oracle8 Enterprise Edition Release 8.0.5.0.0'- amnak ? Nem tudod esetleg a 8.0.5-el lenne baja, vagy probaltal mar altalad keszitett fuggvenyt selectbe rakni? Ha igen es mukodott, hogy csinaltad :)
OFF: ezen a Forumon nincs semmi olyan beallitas, hogy ha a hozzaszolasomra valasz erkezik kapjak 'mail notificationt' ?
Persze at lehet adni az eid-et is. Tehat eltekintettem attol hogy az oldalon megjeleno osszes sort updateljem egy clickel. Hanem csak soronkent akarom es az volt a bajom hogy adott sor oszlop ertekein kivul nem tudtam 'masfajta' erteket atadni a linkben.
De megoldottam :) a kovetkezo keppen:
tehat ha dolgoztal a Portal-al (bar en nem, csak WebDB-vel, de ugyanaz csak a Porttal egy joval tobbet tudo termek), mikor letrehozol egy reportot a legvegen felkinal tobb ablakot (before displaying page; before displaying form; after displayin footer; after displaying page) ahova PL/SQL blokkokat lehet irni. Csinaltam egy packaget aminek van egy valtozoja egy procedure (bemeno parametere a _max_row erteket kapja es atadja a sajat valtozojanak, es egy fuggvenye ami visszaadja a belso valtozo erteket (azaz _max_rows erteket). A before displaying page ablakban meghivom a packagem procedure-jet. Utana jon a tenyleges select es itt mar hasznalhatom a packagem fuggvenyet ami a select-ben visszaadja a _max_rows erteket barmelyik sorban igy a linkben is at tudom passzolni.
Nem tudom ha ertheto voltam.
Azert kosz a segitseget !
Huu.. ez egy kicsit velos volt :) de azert kosz !
Tehat a select-ben olyan parametereket tudok atadni az eljarasomnak jobban mondva olyan ertekeket amelyek adott sor oszlopainak az erteke. Pont az a bajom hogy ennek a _max_rows (oldalon megjeleniteni kivant sorok szama) -nak az erteket nem tudom atpasszolni a linkben.
Mondjuk most mar el is tekintettem attol a megoldastol hogy az oldalon megjelenitett osszes sort updateljem, hanem megelegszek azzal hogy egyenkent (azaz soronkent updateljen a user) de mikor update utan egy 'Bac to List' gombbal visszater a listahoz nincs hogy atadodjon a _max_rows erteke ujbol a reportnak.
egy kis segitseget, otletet szeretnek kerni.
Aki dolgozott/-ik az Oracle Portal-al, vagy WebDB-vel (en most azt nyomatom) elsosorban talan az tudna segiteni.
Szoval csinaltam egy reportot ahol megtudom adni (marmint a user tudja megadni) hogy hany sort jelenitsen meg egyszerre a html oldalon.
Ebbe a reportba beleintegraltam egy 'Update' buttont ami az aktualisan megjelenitett sorokban egy oszlopot, mondjuk 'State'-t updateli egy elore definialt ertekkel.
Az egesz a kovetkezo elv alapjan mukodik (amit en talaltam ki..es nem 100% jo:). A report megjelenitest ugy implementaltam egy select utasitassl, hogy
hasznaltam egy 'order by eid'-t a vegen ahol 'eid' egy PK. Aztan ha raklikkelek az 'Update' buttonra az meghiv egy proceduret aminek bemeno parametere a megjeleniteni kivant sorok szama; es ugy
updatelem a tablat hogy ott is 'eid' sorrend szerint csak a parameterkent atadott sorok szamat updatelem.
A baj a kovetkezo: ha a html lapon a user megnyomja a 'Next' gombot (ami mondjuk a kovetkezo 5 - vagy user altal megadott sort - jeleniti meg) es utana az 'Update' gombot, akkor termeszetesen a sorrendben az elso 5 sort fogja updatelni a procedurem,
Valamikepp at kellene adnom a procedurenek, hogy mondjuk melyik a kezdeti 'eid' szam ahonnan kezdje updatelni az 5 sort (peldanal maradva:).
Van valakinek otlete, esetleg mas technika, hogy hogyan, vagy mitt kellene atadjak a proceduremnek hogy a kepenmegjelenitett sorokat updateleje?
Elore is kosz, johetnek maganba is az otletek. Az OTN-en probalkoztam, nem kaptam valaszt, nem nagyon csipik az ilyen regi dolgokat mint WebDB :) de lenyegeben aki Portalban tudja a megoldast az WebDB-ben is mukodik ..
Vagy ha tudtok mas forumokat ahol erdeklodhetek a temaval kapcsolatban..
Ja, es persze az ido is surgetne...:)
sql+ -nak nem feltetlenul kell a beallitott tnsname, tud a helyi futo oracle-hoz kapcsolodni nelkule is.
Delphi alol oracle-hoz pedig mindenkepp a ODAC-ot ajanlanam: http://crlab.com/odac/
tnsnames.ora file-odat szerkeszd meg az admind dir alatt. Amugy technet.oracle.com es doksiba szajbaragosan bennevan mit ohgy kell beallitani ezen file-ba.
Előlegesen annyit, hogy (tegnapelőttig) soha nem volt szerencsém az Oracle-höz, viszont mivel a rendszert, amit írok (Delphiben) Oracle kiszolgálóhoz kell illeszteni, és a környezetemben nincs olyan ember, aki foglalkozott volna akár a legminimálisabb szinten Oracle-lel.
Szóval felhúztam egy Ora9i-t a gépemre (W2000Pro), és létrehoztam egy adatbázist, és SQLPlus segítségével tudtam is manipulálni az adatokat, de külső programmal nem tudtam csatlakozni.
Odáig eljutottam, hogy kell TNSListener, de még ez után is hibákat dobott a Service Naming teszt, miszerint nem tudja meghatározni a SERVICE_NAME-et.
Az a kérdésem, hogy mire kell odafigyelni adatbázis létrehozásánál, milyen opciókat kell/érdemes be- illetve kikapcsolni, és ha az adatbázis létrejött, akkor milyen egyéb teendők szükségesek még, hogy ADO, ODBC illetve BDE segítségével tudjak az adatbázishoz csatlakozni.
Bocs a lamer kérdésért, de két napja (napi 12 órában) a Helpre folyasztom a szemeimet, és már ott tartok, hogy újrahúzom az Oracle-t egy kiadós Registry-takarítás után, mert tuti valamit elszúrtam a telepítésnél.
Ha valaki segítségnyújtásra szánja el magát, kérem kopipésztelje egy levélbe a válaszát, ugyanis nincs WEB-hez hozzáférésem, ez is csak véletlen, hogy most tudtam írni.
Ugyanakkor aki segíteni "mer", az arra is készüljön fel, hogy intézek még hozzá kérdéseket. :))
Ugy emlékszem, hogy csak a 8i enterprise edition tudja az execute immediate-t, a standard nem. Hogy a personal micsoda azt nem tudom, de szerintem inkább standard, és akkor ő sem tudja.
.
.
Ha valaki Debrecenben vagy a környékén keres embert rendszerüzemeltetésre, akkor ne keressen tovább, megtalálta... :)
Kösz, de ezeket már mind végigpróbáltuk. Az expire_time is be van állítva, jelenleg 10 perc. A forráshoz - természetesen elvileg :) - nincs hozzáférésünk.
Egyébként úgy tűnik, a fejlesztők csak csináltak vmit az adatbázissal, mert az utóbbi napokban jelentősen lecsökkent a leírt jelenségek száma és egyenlőre bőven beleférünk a beállított határértékek közé.
A hibak amiket kapsz egyertelmuen valami eroforras korlatra utalnak (valoszinuleg memoria).
Ha ezt akarod megoldani akkor, probald meg:
- novelni a PROCESSES parametert
- csokkenteni az SGA meretet
- valahogy ravenni a Win2k-t, hogy adjon tobb memoriat az Oracle-nek (lehet, hogy ez hulyeseg; sosem hasznaltam Oracle Windows alatt)
Ha sikerul is igy megoldani, ez akkor is csak tuneti kezeles. Valoszinuleg napokkal kesobb megint ugyanazt a hibat fogod latni.
Jobb lenne megkeresni, hogy miert nyilik annyi uj kapcsolat. Lehet, hogy az alkalmazas csak nyitja renduletlenul, de nem zarja be oket.
Ha nem megoldhato az osszes kod atnyalazasa, mert nem a tietek, draga vagy nincs aki csinalja, akkor probalj meg SQLNet-en beallitani 'Dead Connection Detection'-t, talan ez is segit valamit.
A szerver oldali sqlnet.ora file-ba kell beirnod, hogy SQLNET.EXPIRE_TIME = [perc] . (Azt hiszem ez csak TCP/IP alatt mukodik, de gondolom azt hasznaltok.)