Megosztás:


Pozicionált frissítési és törlési utasítások szimulálása

Ha az adatforrás nem támogatja a helyhez tartozó frissítési és törlési utasításokat, az illesztőprogram szimulálhatja ezeket. Az ODBC-kurzortár például a pozícióban lévő frissítési és törlési utasításokat szimulálja. Az általános stratégia a pozicionált frissítési és törlési utasítások szimulálására az, hogy a pozicionált utasításokat keresési utasításokká alakítjuk át. Ez úgy történik, hogy lecseréli a WHERE CURRENT OF záradékot egy keresendő WHERE záradékra, amely azonosítja az aktuális sort.

Mivel például a CustID oszlop egyedileg azonosítja a Vevők tábla minden sorát, a pozicionált törlési utasítás

DELETE FROM Customers WHERE CURRENT OF CustCursor  

valószínűleg átalakítható

DELETE FROM Customers WHERE (CustID = ?)  

Az illesztőprogram a WHERE záradékban az alábbi sorazonosítók egyikét használhatja:

  • Azok az oszlopok, amelyek értékei a tábla minden sorának egyedi azonosítására szolgálnak. Az SQLSpecialColumns hívása a `SQL_BEST_ROWID` paraméterrel visszaadja az erre a célra szolgáló optimális oszlopot vagy oszlopkészletet.

  • Egyes adatforrások által biztosított pszeudooszlopok az egyes sorok egyedi azonosítására szolgálnak. Ezek az SQLSpecialColumns meghívásával is lekérdezhetők.

  • Egy egyedi index, ha elérhető.

  • Az eredményhalmaz összes oszlopa.

Az a pontos, hogy az illesztőprogram mely oszlopokat használja az általa készített WHERE záradékban az illesztőprogramtól függ. Egyes adatforrások esetén a sorazonosító meghatározása költséges lehet. Gyorsabb azonban a végrehajtás, és garantálja, hogy egy szimulált utasítás legfeljebb egy sort frissít vagy töröl. A mögöttes DBMS képességeitől függően a sorazonosítók beállítása költséges lehet. Gyorsabb azonban a végrehajtás, és garantálja, hogy egy szimulált utasítás csak egy sort frissít vagy töröl. Az eredményhalmaz összes oszlopának használata általában sokkal egyszerűbb. A végrehajtás azonban lassabb, és ha az oszlopok nem azonosítják egyedileg a sorokat, előfordulhat, hogy a sorok véletlenül frissülnek vagy törlődnek, különösen akkor, ha az eredményhalmaz kiválasztási listája nem tartalmazza az alapul szolgáló táblában található összes oszlopot.

Attól függően, hogy az előző stratégiák közül melyiket támogatja az illesztőprogram, az alkalmazás kiválaszthatja, hogy az illesztőprogram milyen stratégiát használjon a SQL_ATTR_SIMULATE_CURSOR utasítás attribútummal. Bár furcsának tűnhet, ha egy alkalmazás véletlenül frissít vagy töröl egy sort, az alkalmazás eltávolíthatja ezt a kockázatot azáltal, hogy biztosítja, hogy az eredményhalmaz oszlopai egyedileg azonosítsák az eredményhalmaz egyes sorait. Ezzel megkíméli a sofőrt attól, hogy ezt meg kelljen tennie.

Ha az illesztő sorazonosítót használ, az elfogja az eredményhalmazt létrehozó SELECT FOR UPDATE utasítást. Ha a kijelölési lista oszlopai nem azonosítják hatékonyan a sorokat, az illesztő hozzáadja a szükséges oszlopokat a kijelölési lista végéhez. Egyes adatforrások egyetlen oszlopot tartalmaznak, amelyek mindig egyedileg azonosítják a sorokat, például az Oracle ROWID oszlopát; ha ilyen oszlop áll rendelkezésre, az illesztőprogram ezt használja. Ellenkező esetben az illesztőprogram meghívja az SQLSpecialColumns parancsot a FROM záradék minden táblájára, hogy lekérje az egyes sorokat egyedileg azonosító oszlopok listáját. Az ebből a technikából eredő gyakori korlátozás, hogy a kurzorszimuláció meghiúsul, ha a FROM záradékban több tábla is szerepel.

Függetlenül attól, hogy az illesztőprogram hogyan azonosítja a sorokat, általában a SELECT FOR UPDATE utasításból eltávolítja a FOR UPDATE záradékot, mielőtt elküldené azt az adatforrásnak. A FOR UPDATE OF záradék csak a helyhez kötött frissítési és törlési utasításokhoz használható. Azok az adatforrások, amelyek nem támogatják a helyhez igazított frissítési és törlési utasításokat, általában nem támogatják azt.

Amikor az alkalmazás elküld egy helyhez kötött frissítési vagy törlési utasítást a végrehajtáshoz, az illesztő a WHERE CURRENT OF záradékot egy WHERE záradékra cseréli, amely tartalmazza a sorazonosítót. Ezeknek az oszlopoknak az értékeit az illesztő által fenntartott gyorsítótárból kéri le a WHERE záradékban használt minden egyes oszlophoz. Miután az illesztőprogram lecserélte a WHERE záradékot, elküldi az utasítást az adatforrásnak végrehajtás céljából.

Tegyük fel például, hogy az alkalmazás a következő utasítást küldi el egy eredményhalmaz létrehozásához:

SELECT Name, Address, Phone FROM Customers FOR UPDATE OF Phone, Address  

Ha az alkalmazás beállította a SQL_ATTR_SIMULATE_CURSOR értékét az egyediség garanciájának kérésére, és ha az adatforrás nem biztosít olyan pszeudooszlopot, amely mindig egyedien azonosít egy sort, az illesztőprogram meghívja az SQLSpecialColumns az Ügyfelek táblához, rájön, hogy a CustID a kulcs az Ügyfelek táblához, hozzáadja ezt a kiválasztási listához, és eltávolítja a FOR UPDATE OF záradékot.

SELECT Name, Address, Phone, CustID FROM Customers  

Ha az alkalmazás nem kérte az egyediség garanciáját, a meghajtóprogram csak a FOR UPDATE OF záradékot távolítja el.

SELECT Name, Address, Phone FROM Customers  

Tegyük fel, hogy az alkalmazás végiggörget az eredményhalmazon, és elküldi a következő pozícióban lévő frissítési utasítást a végrehajtáshoz, ahol a Cust a kurzor neve az eredményhalmaz felett:

UPDATE Customers SET Address = ?, Phone = ? WHERE CURRENT OF Cust  

Ha az alkalmazás nem kért egyediséget, az illesztő lecseréli a WHERE záradékot, és a CustID paramétert a gyorsítótárában lévő változóhoz köti:

UPDATE Customers SET Address = ?, Phone = ? WHERE (CustID = ?)  

Ha az alkalmazás nem kért egyediséget, az illesztő lecseréli a WHERE záradékot, és az ebben a záradékban szereplő Név, Cím és Telefon paramétereket a gyorsítótár változóihoz köti:

UPDATE Customers SET Address = ?, Phone = ?  
   WHERE (Name = ?) AND (Address = ?) AND (Phone = ?)