Transact-SQL හි කර්සර සහ ලූප භාවිතා කිරීම. MySQL ගබඩා කර ඇති ක්‍රියා පටිපාටිවල කර්සර sql සේවාදායකයේ කර්සර

DECLARE CURSOR විධානය මඟින් උපාමාරු කිරීම සඳහා වගුවකින් පේළියෙන් පේළිය වාර්තා ලබා ගැනීමට ඔබට ඉඩ සලසයි. මෙය SQL විසින් සිදුකරන සම්ප්‍රදායික දත්ත කට්ටල සැකසීම වෙනුවට පේළියෙන් පේළි සැකසීමට ඉඩ සලසයි.

පළමු ආසන්න වශයෙන්, කර්සරය සමඟ වැඩ කරන විට, පහත පියවර භාවිතා කරනු ලැබේ.

කර්සරය නිර්මාණය කර ඇත්තේ DECLARE විධානයෙනි. කර්සරය විවෘත වන්නේ OPEN විධානයෙනි.

FETCH විධානය භාවිතයෙන් කර්සර මෙහෙයුම් සිදු කෙරේ. CLOSE විධානය සමඟ කර්සරය වසා ඇත.

DECLARE CURSOR විධානය SELECT ප්‍රකාශයක් නියම කරයි. SELECT ප්‍රකාශයක් මඟින් ආපසු ලබා දෙන සෑම පේළියක්ම තනි තනිව ලබාගෙන සැකසීමට හැකිය. පහත දැක්වෙන Oracle උදාහරණයේ, කර්සරය වෙනත් විචල්‍යයන් කිහිපයක් සමඟ ප්‍රකාශන කොටසක ප්‍රකාශ කර ඇත. ඊට පසු, පසුව ඇති BEGIN…END බ්ලොක් එකේ, කර්සරය විවෘත කර, එය මත තේරීමක් සිදු කර, කර්සරය වසා ඇත.

CURSOR title_price_cursor යනු මාතෘකාව තෝරන්න, මාතෘකා වලින් මිල

මිල ශුන්‍ය නොවන තැන; title_price_val title_price_cursor ROWTYPE; නව_මිල NUMBER(10.2);

OPEN title_price_Cursor;

මාතෘකාව_මිල_කර-sor title_price_val INTO FETCH;

new_price:= "title_price_val.price" * 1.25 new_title_price VALUES වෙත ඇතුල් කරන්න

(title_price_val. මාතෘකාව, new_price) CLOSE title_price_cursor; අවසානය;

මෙම උදාහරණය PL/SQL භාවිතා කරන බැවින්, බොහෝ කේතයන් මෙම පොතේ විස්තර නොකෙරේ. කෙසේ වෙතත්, කර්සරය ප්‍රකාශනය DECLARE කොටසෙහි පැහැදිලිව දැකගත හැකිය. PL/SQL ක්‍රියාත්මක කළ හැකි බ්ලොක් එකක, කර්සරය විවෘත ප්‍රකාශයකින් ආරම්භ කර, අගයන් FETCH ප්‍රකාශයකින් ලබා ගනී, අවසානයේ කර්සරය CLOSE ප්‍රකාශයකින් වසා ඇත.

SELECT ප්‍රකාශය කර්සරයේ හරය වේ, එබැවින් එය DECLARE CURSOR ප්‍රකාශයකට ඇතුළත් කිරීමට පෙර එය හොඳින් පරීක්ෂා කිරීම හොඳ පුරුද්දකි. SELECT ප්‍රකාශය යටින් පවතින වගුවක් හෝ දසුනක් මත ක්‍රියා කළ හැක. එබැවින්, කියවීමට පමණක් කර්සරය යාවත්කාලීන කළ නොහැකි දසුන් සමඟ ක්‍රියා කළ හැක. SELECT ප්‍රකාශයේ ORDER BY, GROUP BY, සහ HAVING වැනි වගන්ති අඩංගු විය හැක, එම වගන්ති මූලාශ්‍ර වගුව යාවත්කාලීන නොකරන තාක් කල්. කර්සරය යාවත්කාලීන කිරීම සඳහා ලෙස අර්ථ දක්වා තිබේ නම්, එවැනි වගන්ති SELECT ප්‍රකාශයෙන් ඉවත් කිරීම නිර්දේශ කෙරේ.

දේශීය කර්සරය බොහෝ විට ගබඩා කර ඇති ක්‍රියා පටිපාටිවල ප්‍රතිදාන පරාමිති ලෙස භාවිතා කරයි. එමනිසා, ගබඩා කර ඇති ක්‍රියා පටිපාටියකදී, ඔබට කර්සරයක් නිර්වචනය කර එය පිරවිය හැකි අතර එය එය හැඳින්වූ කණ්ඩායම් කාර්යයට හෝ ගබඩා කර ඇති ක්‍රියා පටිපාටියට ලබා දිය හැකිය.

පහත සරල DB2 උදාහරණයේදී, අපි admin_group "XO1" හි දෙපාර්තමේන්තු අංක, දෙපාර්තමේන්තු නම් සහ කළමනාකරු අංක සොයන කර්සරයක් ප්‍රකාශ කරන්නෙමු.

dept_cursor CURSOR ප්‍රකාශ කරන්න

dept_nbr, dept_name, mgr_nbr සඳහා තෝරන්න

කොහෙද admin_group="X01"

d "ept_name ASC, dept_nbr DESC, mgr_nbr DESC මගින් ඇණවුම් කරන්න;

Microsoft SQL Server සඳහා පහත උදාහරණය ප්‍රකාශක වගුවේ කර්සරයක් ප්‍රකාශ කර විවෘත කරයි. කර්සරය ප්‍රකාශක වගුවෙන් SELECT ප්‍රකාශයට ගැළපෙන පළමු වාර්තාව තෝරා එය වෙනත් වගුවකට ඇතුළත් කරයි. ඉන්පසු එය ඊළඟ වාර්තාවට, පසුව ඊළඟ වාර්තාවට, සියලු වාර්තා සකස් කරන තුරු ගමන් කරයි. අවසාන වශයෙන්, කර්සරය වසා ඇති අතර මතකය නිදහස් වේ (DEALLOCATE විධානය භාවිතා කරනු ලබන්නේ Microsoft SQL සේවාදායකයේ පමණි).

ප්‍රකාශ කරන්න @publisher_name VARCHAR(20)

ප්‍රකාශකයන්ගෙන් pub_name තෝරා ගැනීම සඳහා pub_cursor CURSOR ප්‍රකාශ කරන්න රට "USA"

Pub_cursor වෙතින් ප්‍රකාශක_නම වෙත ඊළඟට ගෙන එන්න

@s>FETCH_STATUS=0 අතර

විදේශීය_ප්‍රකාශකයින් වෙත ඇතුළු කරන්න VALUES("j>ප්‍රකාශක_නම)

CLOSE pub_cursor DEALLOCATE pub_cursor

මෙම උදාහරණයේදී, කර්සරය වාර්තා කට්ටලය හරහා ගමන් කරන ආකාරය ඔබට දැක ගත හැකිය. (මෙම උදාහරණය මෙම අදහස විදහා දැක්වීමට පමණි, ඇත්ත වශයෙන්ම ඇත හොඳම මාර්ගයමෙම ගැටලුවට විසඳුම, එනම් INSERT, SELECT ප්‍රකාශය.)

එය අදාළ වන්නේ: SQL සේවාදායකය (2008 සිට) පදනම SQL දත්ත AzureSQL AzureParallel දත්ත ගබඩාව

සෙවීම් ගුණාංග සහ කර්සරය ක්‍රියාත්මක වන ප්‍රතිඵල කට්ටලය ගොඩනැගීමට භාවිතා කරන විමසුම වැනි Transact-SQL සේවාදායක පැත්තේ කර්සරයක ගුණාංග නියම කරයි. DECLARE CURSOR ප්‍රකාශය Transact-SQL භාෂා දිගු කට්ටලය භාවිතයෙන් ISO සම්මත සින්ටැක්ස් සහ වාක්‍ය ඛණ්ඩ යන දෙකටම සහය දක්වයි.

ISO සින්ටැක්ස් Cursor_name ප්‍රකාශ කරන්න [ INSENSITIVE ] [ අනුචලනය ] තෝරා_ප්‍රකාශය සඳහා කර්සරය [ සඳහා (කියවීමට පමණි | යාවත්කාලීන [ තීරු_නම [ ,...n ]] ) ] [;] ගණුදෙණු-SQL විස්තීරණ සින්ටැක්ස් CURSOR_name CURSOR ප්‍රකාශ කරන්න [ දේශීය | ගෝලීය ] [ ඉදිරියට_පමණක් | අනුචලනය ] [ ස්ථිතික | යතුරු කට්ටලය | ගතික | FAST_FORWARD] [ කියවන්න_පමණක් | SCROLL_LOCKS | ශුභවාදී ] [ TYPE_WARNING ] තෝරා_ප්‍රකාශය සඳහා [ යාවත්කාලීන කිරීම සඳහා [ OF column_name [ ,...n ] ] ] [;]

cursor_name
cursor_name

අසංවේදී
tempdb; එබැවින්, මෙම කර්සරයේ තේරීම් මඟින් ආපසු ලබා දෙන දත්තවල මූලික වගු වල වෙනස්කම් පිළිබිඹු නොවන අතර, මෙම කර්සරය වෙනස් කර නොමැත. ISO වාක්‍ය ඛණ්ඩය භාවිතා කරන විට, INSENSITIVE විකල්පය සඳහන් කර නොමැති නම්, පාදක වගු වෙත කරන ලද කැපවීම් යාවත්කාලීන කිරීම් සහ මකාදැමීම් පසුකාලීන තේරීම් වලදී පිළිබිඹු වේ.

අනුචලනය කරන්න
සියලුම නියැදි විකල්ප (පළමු, අවසාන, පෙර, ඊළඟ, සාපේක්ෂ, නිරපේක්ෂ) පවතින බව සඳහන් කරයි. ISO DECLARE CURSOR ප්‍රකාශය SCROLL විකල්පය සඳහන් නොකරන්නේ නම්, NEXT ලබා ගැනීමේ විකල්පය පමණක් සහය දක්වයි. FAST_FORWARD විකල්පය සමඟ SCROLL විකල්පය සඳහන් කළ නොහැක.

තෝරා_ප්‍රකාශය
කර්සර ප්‍රතිඵල කට්ටලයක් නිර්වචනය කරන සම්මත SELECT ප්‍රකාශයක්. FOR BROWSE සහ INTO මූල පද වලංගු නොවේ තෝරා_ප්‍රකාශයකර්සරය ප්රකාශය.

තෝරා_ප්‍රකාශයඉල්ලූ ආකාරයේ කර්සරයක් සමඟ ගැටුමක්.

කියවන්න පමණයි

යාවත්කාලීන]
තීරු_නම [, .. .n] නිශ්චිතව දක්වා ඇත, ලැයිස්තුගත තීරු පමණක් වෙනස්කම් වලට ඉඩ දෙයි. UPDATE ප්‍රකාශය තීරු ලැයිස්තුවක් නොමැතිව භාවිතා කරන්නේ නම්, සියලුම තීරු සඳහා යාවත්කාලීන කළ හැකිය.

cursor_name
විශේෂිත සේවාදායක කර්සරයේ Transact-SQL නම. cursor_nameහඳුනාගැනීම් සඳහා නීතිරීතිවලට අනුකූල විය යුතුය.

දේශීය
කර්සරය පැකේජයට, ගබඩා කර ඇති ක්‍රියා පටිපාටියට හෝ එය නිර්මාණය කළ ප්‍රේරකයට දේශීය බව පෙන්නුම් කරයි. කර්සරයේ නම වලංගු වන්නේ මෙම ප්‍රදේශය තුළ පමණි. කර්සරය පැකේජ දේශීය විචල්‍යයන්, ගබඩා කළ ක්‍රියා පටිපාටි, ප්‍රේරක හෝ ගබඩා කළ ක්‍රියා පටිපාටි ප්‍රතිදාන පරාමිතියක් මගින් යොමු කළ හැක. OUTPUT පරාමිතිය දේශීය කර්සරයක් එහි ඇමතුම් පැකේජයට, ගබඩා කර ඇති ක්‍රියා පටිපාටියට හෝ ප්‍රේරකයට යැවීමට භාවිතා කරයි, එමඟින් ගබඩා කර ඇති ක්‍රියා පටිපාටිය අවසන් වූ පසු කර්සරයට ප්‍රවේශ වීමට පරාමිතිය කර්සර විචල්‍යයකට පැවරිය හැකිය. කර්සරය OUTPUT පරාමිතිය වෙත ලබා දුන්නේ නම් මිස, කණ්ඩායමක්, ගබඩා කර ඇති ක්‍රියා පටිපාටියක් හෝ ප්‍රේරකයක් ක්‍රියාත්මක කිරීම සම්පූර්ණ කරන විට කර්සරය ව්‍යංගයෙන් මුදා හරිනු ලැබේ. කර්සරයක් OUTPUT පරාමිතිය වෙත ලබා දුන්නේ නම්, එය යොමු කරන සියලුම විචල්‍යයන් මුදා හරින විට හෝ විෂය පථයෙන් පිට වූ විට කර්සරය මුදා හරිනු ලැබේ.

ගෝලීය
කර්සරය සම්බන්ධතාවයට ගෝලීය බව සඳහන් කරයි. සම්බන්ධතාවය මත ක්‍රියාත්මක වන ඕනෑම ගබඩා ක්‍රියා පටිපාටියක් හෝ පැකේජයක් මඟින් කර්සරයේ නම භාවිතා කළ හැක. කර්සරය ව්‍යංගයෙන් නිදහස් වන්නේ සම්බන්ධතාවය කැඩී ගියහොත් පමණි.

FORWARD_පමණක්
කර්සරය අනුචලනය කළ හැක්කේ පළමු පේළියේ සිට අවසාන පේළිය දක්වා පමණක් බව සඳහන් කරයි. FETCH NEXT ලබා ගැනීමේ විකල්පය පමණක් සහය දක්වයි. FORWARD_ONLY STATIC, KEYSET, හෝ DYNAMIC මූල පද නොමැතිව සඳහන් කර ඇත්නම්, කර්සරය DYNAMIC කර්සරයක් ලෙස හැසිරේ. FORWARD_ONLY තර්කය හෝ SCROLL තර්කය නිශ්චිතව දක්වා නොමැති නම්, STATIC, KEYSET, හෝ DYNAMIC මූල පද නොමැති නම් පෙරනිමියෙන් FORWARD_ONLY තර්කය භාවිතා වේ. STATIC, KEYSET, සහ DYNAMIC කර්සරයන් අනුචලනය කිරීමට පෙරනිමි වේ. ODBC සහ ADO වැනි දත්ත සමුදා API මෙන් නොව, FORWARD_ONLY ප්‍රකාරයට පහත Transact-SQL භාෂා කර්සරය සහය දක්වයි: STATIC, KEYSET, සහ DYNAMIC.

ස්ථිතික
කර්සරය භාවිතා කිරීම සඳහා දත්තවල තාවකාලික පිටපතක් නිර්මාණය කරන කර්සරය නිර්වචනය කරයි. සියලුම කර්සර විමසුම් වල සඳහන් කර ඇති තාවකාලික වගුව වෙත යොමු වේ tempdb; එබැවින්, මෙම කර්සරයේ තේරීම් මඟින් ආපසු ලබා දෙන දත්තවල මූලික වගු වල වෙනස්කම් පිළිබිඹු නොවන අතර, මෙම කර්සරය වෙනස් කර නොමැත.

යතුරු කට්ටලය
කර්සරය විවෘත කරන විට එහි සාමාජිකත්වය හෝ පේළි අනුපිළිවෙල වෙනස් නොවන බව සඳහන් කරයි. පේළි අනන්‍යව හඳුනා ගන්නා යතුරු කට්ටලයක් වගුවක තැන්පත් කර ඇත tempdbකියලා යතුරු.

කර්සරයේ හිමිකරු විසින් සාදන ලද හෝ වෙනත් පරිශීලකයන් විසින් සිදු කරන ලද මූලික වගු වල ප්‍රධාන නොවන අගයන් වෙත වෙනස් කිරීම් හිමිකරු කර්සරය බලන විට දර්ශනය වේ. වෙනත් පරිශීලකයින් විසින් සිදු කරන ලද වෙනස්කම් දර්ශනය නොවේ (Transact-SQL සේවාදායක කර්සරය භාවිතයෙන් වෙනස්කම් සිදු කළ නොහැක). පේළියක් මකා දැමෙන්නේ නම්, පේළි ලබා ගැනීමේ උත්සාහයක් @@FETCH_STATUS -2 ලබා දෙයි. කර්සරයෙන් පිටත සිට ප්‍රධාන අගයන් වෙත යාවත්කාලීන කිරීම පැරණි පේළියක් මකා දමා නව පේළියක් ඇතුළු කිරීමට සමාන වේ. නව අගයන් සහිත පේළිය නොපෙනෙන අතර පැරණි අගයන් සමඟ පේළිය ලබා ගැනීමට උත්සාහ කරයි @@FETCH_STATUS -2 ආපසු. කර්සරය හරහා යාවත්කාල කිරීම් සිදු කරන්නේ නම්, WHERE CURRENT OF වගන්තිය භාවිතයෙන් ඒවා ක්ෂණිකව දිස්වේ.

ගතික
මෙම කර්සරය නරඹන අතරතුර ප්‍රතිඵල සකසන ලද පේළි වලට කරන ලද සියලුම දත්ත වෙනස් කිරීම් පෙන්වන කර්සරයක් නිර්වචනය කරයි. එක් එක් සාම්පලයේ පේළි වල දත්ත අගයන්, අනුපිළිවෙල සහ සාමාජිකත්වය වෙනස් විය හැක. ABSOLUTE තේරීම් විකල්පය ගතික කර්සරයන් මඟින් සහය නොදක්වයි.

වේගයෙන් ඉදිරියට
කාර්ය සාධන ප්‍රශස්තකරණය සබල කර ඇති FORWARD_ONLY, READ_ONLY කර්සරයක් සඳහන් කරයි. FAST_FORWARD විකල්පය SCROLL හෝ FOR_UPDATE විකල්ප සමඟ සඳහන් කළ නොහැක.

කියවන්න_පමණක්
මෙම කර්සරය හරහා සිදුවන වෙනස්කම් වළක්වයි. UPDATE හෝ DELETE ප්‍රකාශය තුළ CURRENT OF වගන්තියට කර්සරයක් යොමු කළ නොහැක. මෙම සැකසුම කර්සරය යාවත්කාලීන කිරීමට පෙරනිමි හැකියාවට වඩා ප්‍රමුඛත්වය ගනී.

SCROLL_LOCKS
ස්ථානගත යාවත්කාලීන කිරීම් හෝ කර්සරය මඟින් සිදු කරන මකාදැමීම් සාර්ථක වන බවට සහතික වන බව සඳහන් කරයි. SQL සේවාදායකය පේළි කර්සරය තුළට කියවන විට එම පේළි පසුකාලීන වෙනස් කිරීම් සඳහා ලබා ගත හැකි බව සහතික කිරීම සඳහා ඒවා අගුළු දමයි. SCROLL_LOCKS විකල්පය FAST_FORWARD හෝ STATIC විකල්පය සමඟ සඳහන් කළ නොහැක.

සුභවාදී
පේළිය කර්සරය තුළට කියවා ඇති බැවින් එය යාවත්කාලීන කර ඇත්නම්, කර්සරය මඟින් සිදු කරන ස්ථානගත යාවත්කාලීන කිරීම් හෝ මකාදැමීම් සිදු නොවන බව සඳහන් කරයි. SQL සේවාදායකය කර්සරය තුළට කියවන පරිදි පේළි අගුලු නොදමයි. ඒ වෙනුවට, සැසඳීම් භාවිතා වේ වේලා මුද්දරයතීරු අගයන් හෝ චෙක්සම්වගුවේ අඩංගු නොවේ නම් වේලා මුද්දරයතීරුව කර්සරය තුළට කියවීමෙන් පසු පේළිය වෙනස් කර තිබේද යන්න තීරණය කිරීමට. පේළිය වෙනස් කර ඇත්නම්, ස්ථානගත යාවත්කාලීන කිරීම හෝ මකා දැමීමේ උත්සාහයන් අසාර්ථක වනු ඇත. OPTIMISTIC විකල්පය FAST_FORWARD විකල්පය සමඟ සඳහන් කළ නොහැක.

TYPE_අවවාදයයි
කර්සරය එක් ඉල්ලූ වර්ගයකින් තවත් වර්ගයකට ව්‍යංගයෙන් පරිවර්තනය කළහොත් සේවාලාභියා වෙත අනතුරු ඇඟවීමක් යවන බව අඟවයි.

තෝරා_ප්‍රකාශය
කර්සර ප්‍රතිඵල කට්ටලයක් නිර්වචනය කරන සම්මත SELECT ප්‍රකාශයක්. COMPUTE, COMPUTE BY, FOR BROWSE, සහ INTO මූල පද වලට ඉඩ නොදේ තෝරා_ප්‍රකාශයකර්සරය ප්රකාශය.

SQL සේවාදායකය කර්සරය වෙනත් වර්ගයකට වගන්ති තිබේ නම් එය ව්‍යංගයෙන් පරිවර්තනය කරයි තෝරා_ප්‍රකාශයඉල්ලූ ආකාරයේ කර්සරයක් සමඟ ගැටුමක්. වැඩි විස්තර සඳහා, ව්‍යංග කර්සර පරිවර්තන බලන්න.

යාවත්කාලීන කිරීම සඳහා]
කර්සරයේ යාවත්කාලීන කළ හැකි තීරු නියම කරයි. OF නම් තීරු_නම [, ... n] සපයා ඇත, ලැයිස්තුගත තීරු පමණක් වෙනස් කිරීමට ඉඩ දෙයි. තීරු ලැයිස්තුවක් නොමැතිව UPDATE ප්‍රකාශයක් භාවිතා කරන්නේ නම්, READ_ONLY සමගාමී විකල්පය සඳහන් කර නොමැති නම්, සියලුම තීරු සඳහා යාවත්කාලීන කළ හැකිය.

DECLARE CURSOR ප්‍රකාශය මගින් ගණුදෙණු-SQL සේවාදායක පැත්තේ කර්සරයක ගුණාංග නිර්වචනය කරයි, එනම් සෙවීම් ගුණාංග සහ කර්සරය ක්‍රියාත්මක වන ප්‍රතිඵල කට්ටලය තැනීමට භාවිතා කරන විමසුම. OPEN ප්‍රකාශය ප්‍රතිඵල කට්ටලය පුරවන අතර FETCH ප්‍රකාශය එයින් පේළියක් ලබා දෙයි. CLOSE ප්‍රකාශය කර්සරය හා සම්බන්ධ වත්මන් ප්‍රතිඵල කට්ටලය හිස් කරයි. DEALLOCATE ප්‍රකාශය කර්සරය භාවිතා කරන සම්පත් නිකුත් කරයි.

DECLARE CURSOR ප්‍රකාශයේ පළමු ආකෘතිය කර්සර විකල්පයන් සැකසීමට ISO සින්ටැක්ස් භාවිතා කරයි. DECLARE CURSOR ප්‍රකාශයේ දෙවන ආකාරය ODBC සහ ADO වැනි දත්ත සමුදා API කර්සර ශ්‍රිතවල භාවිතා කරන ආකාරයේම භාවිතා කරමින් කර්සරය අර්ථ දැක්වීමට Transact-SQL දිගු භාවිතා කරයි.

ඔබට මෙම ආකාර දෙක මිශ්ර කළ නොහැක. ඔබ CURSOR මූල පදයට පෙර SCROLL හෝ මූල පද නොසලකා හරින්න නම්, ඔබට CURSOR අතර සහ ඒ සඳහා මූල පද භාවිතා කළ නොහැක. තෝරා_ප්‍රකාශයමූල පද. CURSOR සහ සඳහා ද අතර මූල පද සඳහන් කරන විට තෝරා_ප්‍රකාශයමූල පද, ඔබට CURSOR මූල පදයට පෙර අනුචලනය හෝ සංවේදී නොවන බව සඳහන් කළ නොහැක.

Transact-SQL වාක්‍ය ඛණ්ඩය භාවිතා කරන විට DECLARE CURSOR ප්‍රකාශය සඳහා READ_ONLY, OPTIMISTIC, හෝ SCROLL_LOCKS විකල්ප සඳහන් කර නොමැති නම්, පහත පෙරනිමි අගය උපකල්පනය කෙරේ.

    SELECT ප්‍රකාශය යාවත්කාල කිරීම් සඳහා සහය නොදක්වන්නේ නම් (නැතහොත් ප්‍රමාණවත් අවසර නොමැත, හෝ යාවත්කාල කිරීම් සඳහා සහය නොදක්වන දුරස්ථ වගු වෙත ප්‍රවේශ වන විට යනාදිය), එවිට READ_ONLY විකල්පය කර්සරයට පවරනු ලැබේ.

    STATIC සහ FAST_FORWARD කර්සරය පෙරනිමියෙන් READ_ONLY වෙත.

    DYNAMIC සහ KEYSET කර්සරය OPTIMISTIC වෙත පෙරනිමිය.

කර්සරය වෙනත් ගණුදෙණු-SQL ප්‍රකාශයන් මගින් පමණක් යොමු කළ හැක. Database API ශ්‍රිතයන් කර්සර වෙත යොමු විය නොහැක. උදාහරණයක් ලෙස, කර්සරයක් ප්‍රකාශ කළ පසු, OLE DB, ODBC, හෝ ADO ශ්‍රිත සහ ක්‍රමවලට එහි නම සඳහන් කළ නොහැක. සුදුසු ශ්‍රිත සහ API ක්‍රම භාවිතයෙන් කර්සර පේළි තෝරාගත නොහැක; මේ සඳහා ගණුදෙණු-SQL FETCH ප්‍රකාශ භාවිතා කළ යුතුය.

කර්සරය ප්‍රකාශ කිරීමෙන් පසු එහි ගුණාංග නිර්වචනය කිරීමට පහත ගබඩා කර ඇති ක්‍රියා පටිපාටි භාවිතා කළ හැක.

විචල්යයන් කොටසක් ලෙස භාවිතා කළ හැක තෝරා_ප්‍රකාශයකර්සරය ප්‍රකාශ කර ඇති කර්සර විචල්‍යයන් ප්‍රකාශ කිරීමෙන් පසු අගයන් වෙනස් නොවේ.

පෙරනිමියෙන්, කර්සරය භාවිතා කරන දසුන්, වගු සහ තීරු මත SELECT අවසර ඇති සියලුම පරිශීලකයින්ට DECLARE CURSOR අවසර ලබා දෙනු ලැබේ.

ඔබට පොකුරු තීරු ගබඩා දර්ශකයක් සහිත මේසයක් මත කර්සර හෝ ප්‍රේරක භාවිතා කළ නොහැක. මෙම සීමාව පොකුරු නොවන දර්ශක සඳහා අදාළ නොවේ; ඔබට පොකුරු නොවන තීරු ගබඩා දර්ශකයක් සහිත මේසයක් මත කර්සර සහ ප්‍රේරක භාවිතා කළ හැක.

A. සරල කර්සරයක් සහ වාක්‍ය ඛණ්ඩයක් භාවිතා කිරීම

මෙම කර්සරය විවෘත කළ විට සාදන ලද ප්‍රතිඵල කට්ටලයට වගුවේ සියලුම පේළි සහ තීරු ඇතුළත් වේ. මෙම කර්සරය යාවත්කාලීන කළ හැකි ය, මෙම කර්සරය සඳහා තෝරාගැනීමේදී සියලුම යාවත්කාලීන කිරීම් සහ මකාදැමීම් නිරූපණය කෙරේ. SCROLL නිශ්චිතව දක්වා නැති නිසා FETCH``NEXT ලබා ගැනීමක් පමණි.

මිලදී ගැනීමෙන් * තෝරා ගැනීම සඳහා vend_cursor CURSOR ප්‍රකාශ කරන්න. විකුණුම්කරු vend_cursor විවෘත කරන්න vend_cursor වෙතින් ඊළඟට ගන්න;

B. වාර්තාවක් පෙන්වීමට Nested Cursors භාවිතා කිරීම

පහත උදාහරණය සංකීර්ණ වාර්තාවක් පෙන්වීමට කැදලි කර්සර භාවිතා කරයි. එක් එක් සැපයුම්කරු සඳහා අභ්‍යන්තර කර්සරයක් ප්‍රකාශ කර ඇත.

අංක සකසන්න ON ; ප්‍රකාශ කරන්න @vendor_id int , @vendor_name nvarchar (50 ), @message varchar (80 ), @product nvarchar (50 );මුද්‍රණය කරන්න" -------- විකුණුම්කරුවන්ගේ නිෂ්පාදන වාර්තාව -------"; තෝරන VendorID සඳහා vendor_cursor CURSOR ප්‍රකාශ කරන්න, මිලදී ගැනීම් වලින් නම.Vendor කැමති තැන VendorStatus = 1 Order by VendorID;@vendor_id වෙත vendor_cursor වෙතින් ඊළඟට vendor_cursor විවෘත කරන්න, @vendor_name @@FETCH_STATUS = 0 මුද්‍රණය ආරම්භ කරන්න "" තෝරන්න @පණිවිඩය = "------ විකුණුම්කරුගෙන් නිෂ්පාදන: "+ @vendor_name PRINT @message -- අභ්‍යන්තර කර්සරයක් ප්‍රකාශ කරන්න -- පිටත කර්සරයෙන් vendor_id මත. Purchasing වෙතින් නම තෝරා ගැනීම සඳහා product_cursor CURSOR ප්‍රකාශ කරන්න.ProductVendor pv, Production.Product v කොහෙද pv.ProductID = v.ProductID සහ pv.VendorID = @vendor_id -- බාහිර කර්සරයෙන් විචල්‍ය අගයනිෂ්පාදන_කර්සරය විවෘත කරන්න නිෂ්පාදන_කර්සරයෙන් ඊළඟට ගන්න<>0 මුද්‍රණය"<>" අතරතුර @@FETCH_STATUS = 0 BEGIN තෝරන්න @පණිවිඩය = "" + @නිෂ්පාදනය මුද්‍රණය කරන්න @පණිවිඩය ඊළඟට නිෂ්පාදන_කර්සරයෙන් ඊළගට ගෙන එන්න product_cursor @product END CLOSE product_cursor product_cursor -- ඊළඟ වෙළෙන්දා ලබා ගන්න. CLOSE vendor_cursor; DEALLOCATE vendor_cursor;


කර්සරය - සන්දර්භය මතක ප්රදේශයට සබැඳියක්. SQL ක්‍රමලේඛන භාෂාවේ (Oracle, Microsoft SQL Server) සමහර ක්‍රියාත්මක කිරීම්වලදී, විමසුමක් ක්‍රියාත්මක කිරීමේදී ලබාගත් ප්‍රතිඵල කට්ටලය සහ ඒ හා සම්බන්ධ වත්මන් වාර්තා දර්ශකය. කර්සරය විකල්ප දත්ත ගබඩාවක් වන අතථ්‍ය වගුවක් බව පවසනු ඇත. ඒ සමඟම, කර්සරය මඟින් ඔබේ දත්ත සාමාන්‍ය අරාවක් මෙන් ප්‍රවේශ වීමට ඉඩ සලසයි.
ගබඩා කර ඇති ක්‍රියා පටිපාටිවලදී කර්සරය භාවිතා වේ. ප්රමාණවත් න්යාය, අපි උදාහරණයක් බලමු:
අපිට ඩේටා බේස් එකක් තියෙනවා (ඩේටාබේස් එක ටිකක් හොඳ නෑ, මේක මගේ එකක් රසායනාගාර කටයුතු, නමුත් අපගේ දත්ත සමුදා ගුරුවරයා එවැනි ව්‍යුහයක් සඳහා අවධාරනය කළේය)
/* බැංකු තොරතුරු */
'බැංකුව' වගුව සාදන්න (

`බැංකු නම` VARCHAR (50) COLLATE utf8_bin ශුන්‍ය පෙරනිමි නොවේ "" ,


ප්‍රාථමික යතුර (`BankId`)

)ENGINE=InnoDB
අක්ෂර කට්ටලය "utf8" COLLATE "utf8_bin" ;
/* තැන්පතු දත්ත */
'බැංකු බෙදා හැරීම' වගුව සාදන්න (
'BankId' INTEGER (11) null නොවේ ,
`Persent` INTEGER (11) DEFAULT NULL ,
`දායකත්ව මුදල` දශම (10,0) ශුන්‍ය නොවේ ,
'ClientId' INTEGER (11) null නොවේ ,
ප්‍රාථමික යතුර (`BankId`, `ClientId`),
යතුර `බැංකු අයිඩී` (`බැංකු අයිඩී`),
යතුර `ClientId` (`ClientId`),
සීමා කරන්න `bankdistribution_fk` FOREIGN KEY (`BankId`) References `bank` (`BankId`),
සීමා කරන්න `bankdistribution_fk1` FOREIGN KEY (`ClientId`) යොමු කිරීම් `සේවකයා` (`ClientId`)
)ENGINE=InnoDB
/*දායකයින් පිළිබඳ දත්ත*/
'සේවාලාභියා' වගුව සාදන්න (
`ClientId` INTEGER (3) NULL AUTO_INCREMENT නොවේ,
'CreditCardId' BIGINT(10) null නොවේ ,
`වාසගම` VARCHAR (50) COLLATE utf8_bin ශුන්‍ය පෙරනිමි නොවේ "" ,
`නම` VARCHAR (50) COLLATE utf8_bin ශුන්‍ය පෙරනිමි නොවේ "" ,
`පළමු නම` VARCHAR (50) COLLATE utf8_bin ශුන්‍ය පෙරනිමි නොවේ "" ,
`දුරකථනය` VARCHAR (50) COLLATE utf8_bin ශුන්‍ය පෙරනිමි නොවේ "" ,
`ලිපිනය` VARCHAR (50) COLLATE utf8_bin ශුන්‍ය පෙරනිමි නොවේ "" ,
`SafeId` INTEGER (5) NULL නොවේ ,
ප්‍රාථමික යතුර (`ClientId`, `CreditCardId`),
යතුර `ClientId` (`ClientId`)

)ENGINE=InnoDB
AUTO_INCREMENT=11 අක්ෂර කට්ටලය "utf8" COLLATE "utf8_bin"

අපි එක් එක් බැංකුව මාරුවෙන් මාරුවට ලබා ගැනීමට සහ ඒ සමඟ යම් ක්‍රියාමාර්ග ගැනීමට අවශ්‍ය යැයි සිතමු, එවැනි ඉල්ලීමක් අපට මේ සඳහා උපකාරී වනු ඇත

`බැංකුව` තෝරන්න.* `බැංකුව` සීමාව RECORD_NUMBER_අපට අවශ්‍ය,1
. මේ අනුව, LIMIT NUMBER_NECESSARY_US_RECORD භාවිතා කරමින්, අපි එක් එක් වාර්තාව බැංකු වගුවෙන් ලූපයකින් උපුටා ගෙන එය සමඟින් අපට අවශ්‍ය ක්‍රියා සිදු කරන්නෙමු, අතරම NUMBER_NECESSARY_US_RECORD අගය 1 කින් වැඩි කරන්න. දැන් අපි එයම කරමු නමුත් කර්සරය භාවිතා කරමු
ආරම්භය
/* අපි දත්ත ලබා ගන්නා විචල්‍ය */
vBankId පූර්ණ සංඛ්‍යාව ප්‍රකාශ කරන්න;
vBankName VARCHAR(50) ප්‍රකාශ කරන්න;
vAddress VARCHAR(50) ප්‍රකාශ කරන්න;
vPhone VARCHAR (50) ප්‍රකාශ කරන්න;
/* විචල්‍ය හැඩ්ලර් - a*/
ප්‍රකාශ කරන ලද පූර්ණ සංඛ්‍යා පෙරනිමි 0;
/*කර්සර ප්‍රකාශය*/
'බැංකුව' තෝරන්න සඳහා BankCursor Cursor ප්‍රකාශ කරන්න.`BankId`,`bank`.`BankName`,`bank`.`address`,`bank`.`Phone`, 'bank' වෙතින් 1;
/*හැන්ඩ්ලර් පැවරුම, එය පහත විස්තර කෙරේ */
SQLSTATE "02000" SET සඳහා දිගටම හැසිරවීම ප්‍රකාශ කරන්න done=1;
/* විවෘත කර්සරය */
OpenBankCursor;
/* දත්ත උපුටා ගැනීම */
කළ විට = 0 DO

අපි කරන්න ඕන දේ කරනවා
END WHILE ;
/* කර්සරය වසන්න */
BankCursor වසා දමන්න;
අවසානය ;

* මෙම මූල කේතය Source Code Highlighter සමඟ උද්දීපනය කරන ලදී.

දෝෂය: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)

පණිවිඩය: දත්ත නැත - ශුන්‍ය පේළි ලබාගෙන, තෝරාගත්, හෝ සකසන ලදී

SQLSTATE: කර්සරයේ අවසානයට ළඟා වූ විට 02000 ගිනි ගනී, හෝ තේරීම හෝ යාවත්කාලීන කිරීමේදී හිස් තන්තුවක් ලබා දෙයි.

ඊළඟ පේළියේ, අපි කර්සරය ප්‍රකාශ කළෙමු Cursor_name CURSOR for select_statement;
කර්සරය විවෘත කරන්න cursor_name විවෘත කරන්න;
තවද, අපි කර්සරයේ අවසානයට ළඟා වන තුරු (WHILE done = 0 DO), අපි දත්ත උපුටා ගෙන එය සකසන්නෙමු.
ගබඩා කර ඇති ක්රියා පටිපාටියෙන් පිටවීමට පෙර කර්සරය වසා දමන්න. වසන්න cursor_name;

එය කිසිවක් සංකීර්ණ නොවන බව පෙනේ. නමුත් SQLSTATE "02000" හා සම්බන්ධ බොහෝ අන්තරායන් ඇත.

කළ විට = 0 DO
බැංකු කර්සරය vBankId,vBankName,vAddress,vPhone වෙත ගෙන එන්න;

BankId = vBankId සීමාව 1 වන බැංකු බෙදාහැරීමේ සිට vContributeAmountSUM INTO (ContributeAmount) තෝරන්න;
යම් ක්රියාවක් කරන්න
END WHILE ;

* මෙම මූල කේතය Source Code Highlighter සමඟ උද්දීපනය කරන ලදී.


සෑම දෙයක්ම හොඳයි, වාක්‍ය ඛණ්ඩයේ දෘෂ්ටි කෝණයෙන් නිවැරදියි. නමුත් තර්කානුකූලව, නැත. දායකයින් කිසිදු බැංකුවක ගිණුම් විවෘත නොකිරීම සිදු විය හැක, පසුව බැංකු බෙදාහැරීමෙන් vContributeAmountSUM INTO Select (ContributeAmount) සඳහා BankId = vBankId සීමාව 1; SQLSTATE: 02000 ක්‍රියා විරහිත වනු ඇත, සිදු කරන ලද විචල්‍යය 1 ලෙස සකසනු ඇත, සහ while ලූපය අප බලාපොරොත්තු වූවාට වඩා ඉක්මනින් අවසන් වේ. පහත සඳහන් දේ කිරීමෙන් මෙය වළක්වා ගත හැකිය
කළ විට = 0 DO
බැංකු කර්සරය vBankId,vBankName,vAddress,vPhone වෙත ගෙන එන්න;
/* බැංකුව සඳහා එහි ඕනෑම තැන්පතුවක ප්‍රමාණය උපුටා ගන්න */


(vContributeAmountSUM > 0) නම්
/* බැංකුව සඳහා එහි ඕනෑම තැන්පතුවක ප්‍රමාණය උපුටා ගන්න */

නම් අවසන් ;
යම් ක්රියාවක් කරන්න
END WHILE ;

* මෙම මූල කේතය Source Code Highlighter සමඟ උද්දීපනය කරන ලදී.


පළමු ඉල්ලීම සමඟ, අපි දායකත්ව තිබේදැයි පරීක්ෂා කළෙමු (කිසිවක් නොමැති නම්, vContributeAmountSUM == 0) සහ ඒවා තිබේ නම් පමණක් අපි දත්ත උපුටා ගනිමු.

දැන් අපි කියමු අපි එක් එක් සේවාදායකයා සඳහා විවිධ බැංකු වල ගිණුම්වල මුළු මුදල අයකර ගැනීමට අවශ්යයි
Select sum සඳහා ClientSummCursor Cursor ප්‍රකාශ කරන්න

Select sum (`bankdistribution`.`ContributeAmount`), `bankdistribution`.`ClientId` සඳහා ClientSummCursor Cursor ප්‍රකාශ කරන්න Inner Join client on (client.ClientId = bankdistribution.`bank by 'bankdistribution.'bank 'ClientId';

ClientSummCursor විවෘත කරන්න;
කළ විට = 0 DO
බැංකු කර්සරය vBankId,vBankName,vAddress,vPhone වෙත ගෙන එන්න;
/* බැංකුව සඳහා එහි ඕනෑම තැන්පතුවක ප්‍රමාණය උපුටා ගන්න */
BankId = vBankId සීමාව 1 වන බැංකු බෙදා හැරීමෙන් vContributeAmountSUM INTO (ContributeAmount) තෝරන්න;
/* මෙම බැංකුවේ ඇත්තටම තැන්පතු තිබේදැයි පරීක්ෂා කරන්න */
(vContributeAmountSUM > 0) නම්
/* බැංකුව සඳහා එහි ඕනෑම තැන්පතුවක ප්‍රමාණය උපුටා ගන්න */
BankId = vBankId සීමාව 1 වන බැංකු බෙදාහැරීමෙන් දායක මුදල INTO vContributeAmountSUM තෝරන්න;
නම් අවසන් ;


අපි යම් ක්රියාවක් කරන්නෙමු.
END WHILE ;

* මෙම මූල කේතය Source Code Highlighter සමඟ උද්දීපනය කරන ලදී.

ClientSummCursor හි දත්ත BankCursor හි දත්ත වලට වඩා කලින් අවසන් වූ විට, SQLSTATE: 02000 ක්‍රියා විරහිත වූ විට, සිදු කරන ලද විචල්‍යය 1 ලෙස සකසා ඇති විට, සහ while ලූපය අප බලාපොරොත්තු වූවාට වඩා කලින් අවසන් වූ විට එම තත්ත්වයම ඇති විය හැක. පහත සඳහන් දේ කිරීමෙන් මෙය වළක්වා ගත හැකිය

ClientSummCursor විවෘත කරන්න;
කළ විට = 0 DO
බැංකු කර්සරය vBankId,vBankName,vAddress,vPhone වෙත ගෙන එන්න;
/* බැංකුව සඳහා එහි ඕනෑම තැන්පතුවක ප්‍රමාණය උපුටා ගන්න */
BankId = vBankId සීමාව 1 වන බැංකු බෙදා හැරීමෙන් vContributeAmountSUM INTO (ContributeAmount) තෝරන්න;
/* මෙම බැංකුවේ ඇත්තටම තැන්පතු තිබේදැයි පරීක්ෂා කරන්න */
(vContributeAmountSUM > 0) නම්
/* බැංකුව සඳහා එහි ඕනෑම තැන්පතුවක ප්‍රමාණය උපුටා ගන්න */
BankId = vBankId සීමාව 1 වන බැංකු බෙදාහැරීමෙන් දායක මුදල INTO vContributeAmountSUM තෝරන්න;
නම් අවසන් ;
/* දෙවන කර්සරයෙන් දත්ත ලබා ගැනීමට පෙර, sqlstate තත්ත්වය මතක තබා ගන්න */
SET old_status = අවසන්;
/* අපට අවශ්‍ය දත්ත උපුටා ගන්න */
ClientSummCursor vSum,vClientId වෙත ගෙන එන්න;
/* දත්ත ලබා ගත්තේ දැයි පරීක්ෂා කරන්න, sqlstate 0200 අසමත් නම් */
(කළ = 0) නම්
අපි යම් ක්රියාවක් කරන්නෙමු.
නම් අවසන් ;
/* කාලය අවසන් වීමට පෙර, සිදු කරන ලද විචල්‍යයේ අගය ප්‍රතිසාධනය කරන්න */
set done = old_status;
END WHILE ;

* මෙම මූල කේතය Source Code Highlighter සමඟ උද්දීපනය කරන ලදී.

මෙතෙක් කියවූ සැමට ස්තූතියි, මෙය යමෙකුට ප්‍රයෝජනවත් වේ යැයි මම බලාපොරොත්තු වෙමි.

දත්ත සමුදායක කර්සරයක් ක්‍රියාත්මක කිරීම ජාවා පන්තියකට සමාන වන අතර එය සැකසීමට දත්ත සහ ක්‍රම මාලාවක් ඇත. එහි sql කර්සරයදත්ත සාමාන්‍ය අරාවක් ලෙස භාවිතා කරයි. කර්සරය ප්‍රේරක, ගබඩා කළ ක්‍රියා පටිපාටි සහ ශ්‍රිතවල භාවිතා කළ හැක.

SQL ප්‍රමිතියට අනුකූලව, කර්සරය සමඟ වැඩ කරන විට, පහත සඳහන් ප්‍රධාන ක්‍රියා සිදු කරනු ලැබේ:

  • කර්සරය ප්රකාශනය;
  • දත්ත කියවීම සමඟ කර්සරයක් විවෘත කිරීම;
  • කර්සරයෙන් පේළියෙන් දත්ත තෝරා ගැනීම;
  • පේළි දත්තවල කර්සරය සමඟ වෙනස් කිරීම;
  • කර්සරය වසා දැමීම, පසුව එය ප්රවේශ විය නොහැක;
  • කර්සරය නිදහස් කිරීම, i.e. කර්සරය මතකයෙන් ඉවත් කිරීම, එය වසා දැමීමෙන් ඒ හා සම්බන්ධ මතකය අනිවාර්යයෙන්ම මුදා හරිනු නොලැබේ.

විවිධ ක්රියාත්මක කිරීම්වලදී, නිර්වචනය කර්සරයසමහර වෙනස්කම් තිබිය හැක. එබැවින්, උදාහරණයක් ලෙස, සමහර විට කර්සරය සඳහා වෙන් කර ඇති මතකය පැහැදිලිවම මුදා හැරීම අවශ්ය වේ. කර්සරය නිදහස් වූ විට එයට සම්බන්ධ මතකය ද නිදහස් වේ. මෙමගින් කර්සර නාමය නැවත භාවිතා කිරීමට හැකි වේ. වෙනත් ක්‍රියාත්මක කිරීම් වලදී, කර්සරය වසා ඇති විට, මතකය ව්‍යංගයෙන් බෙදා හැරේ.

සමහර අවස්ථාවලදී, කර්සරය භාවිතා කිරීම අත්යවශ්ය වේ. කෙසේ වෙතත්, හැකි නම්, ඔබ කර්සරය භාවිතා කිරීමෙන් වැළකී සිටිය යුතු අතර සම්මත දත්ත සැකසුම් විධාන සමඟ වැඩ කළ යුතුය: SELECT, UPDATE, INSERT, DELETE. මෙයට හේතුව කර්සරය මඟින් සම්පූර්ණ දත්ත ප්‍රමාණය මත මෙහෙයුම් වෙනස් කිරීමට ඉඩ නොදීම සහ කර්සරයක් භාවිතයෙන් දත්ත සැකසුම් මෙහෙයුම් වේගය සැලකිය යුතු ලෙස අඩු වීමයි. සම්මත අදහස් SQL.

වැඩසටහනට කර්සරයේ පටවා ඇති දත්ත වෙනස් කළ හැකි නම්, එය වෙනස් කළ හැකි ලෙස හැඳින්වේ. කර්සරය ගැන කතා කිරීම, ගනුදෙනු හුදකලා කිරීම ගැන අප අමතක නොකළ යුතුය. එක් පරිශීලකයෙකු කර්සරයක් සමඟ වාර්තාවක් වෙනස් කරන අතර තවත් පරිශීලකයෙකු තම කර්සරය සමඟ වාර්තාව කියවයි. එපමණක් නොව, ඔහුට දත්ත අඛණ්ඩතාව අවශ්ය වන එකම වාර්තාව වෙනස් කළ හැකිය.

Cursor declaration, declare cursor

කර්සරය භාවිතා කිරීමට පෙර ඒවා ප්‍රකාශ කළ යුතුය. කර්සරයක් සෑදීමට SQL ප්‍රමිතිය පහත සින්ටැක්ස් භාවිතා කරයි:

select_statement ])] සඳහා cursor_name cursor ප්‍රකාශ කරන්න

මෙම ප්රකාශනය කර්සරයක් ප්රකාශ කරයි කර්සරය ප්රකාශ කරන්න"cursor_name" යන නම සමඟ.

අසංවේදීවෙනස්කම් වලට ඉඩ නොදෙන ස්ථිතික කර්සරයක් නිර්මාණය වේ. එසේම, වෙනත් පරිශීලකයින් විසින් සිදු කරන ලද වෙනස්කම් දර්ශනය නොවේ. INSENSITIVE මූල පදය නොමැති නම්, ගතික කර්සරයක් සාදනු ලැබේ.

මූල පදය භාවිතා කරන විට අනුචලනය කරන්නජනනය කරන ලද කර්සරය ඕනෑම දිශාවකට අනුචලනය කළ හැක, ඕනෑම තේරීම් විධානයක් යෙදීමට ඉඩ සලසයි. මෙම තර්කය මඟ හැරියහොත්, කර්සරය අනුක්‍රමික වනු ඇත, i.e. එය නැරඹිය හැක්කේ එක් දිශාවකට පමණි - ආරම්භයේ සිට අවසානය දක්වා.

ප්රකාශනය තෝරා_ප්‍රකාශයතෝරාගත් ... සිට ... වර්ගයේ තොරතුරු කියවීම සඳහා ඉදිකිරීම් වෙත යොමු කරයි. එහි ක්‍රියාකරු අඩංගු නොවිය යුතුය වෙත, කර්සරයට තමන්ගේම ක්‍රියාකරුවෙකු සිටින නිසා ගේනවාකර්සර දත්ත සමඟ විචල්‍ය පිරවීමට.

තර්කයක් ඉදිරිපත් කරන විට කියවීමට_පමණක්කියවීමට පමණක් කර්සරයක් සාදනු ලබන අතර දත්ත වෙනස් කිරීම් වලට ඉඩ නොදේ. වෙනත් පරිශීලකයෙකු විසින් කරන ලද වෙනස්කම් පිළිබිඹු කිරීම සඳහා කියවීමට පමණක් කර්සරයක් ගතික කර්සරයක් ලෙස ප්‍රකාශ කළ හැක.

තර්කයක් සහිත කර්සරයක් නිර්මාණය කිරීම යාවත්කාලීන කිරීම සඳහාකර්සරය තුළ නිශ්චිත තීරුවල හෝ, තර්කයක් නොමැති විට දත්ත වෙනස් කිරීමට ඔබට ඉඩ සලසයි. OF column_name, සියලුම තීරු වල.

උපසිරැසියක් තුළ ඔබට කර්සර කිහිපයක් ප්‍රකාශ කළ හැක. නමුත් සෑම කර්සරයකටම අනන්‍ය නමක් තිබිය යුතුය. කර්සරය විවෘත කිරීමට, ක්රියාකරු භාවිතා කරන්න විවෘත, කලින් ප්‍රකාශිත කර්සරය විවෘත කරන:

කර්සරය විවෘතයි

"කර්සරය විවෘත" කර්සරයක් විවෘත කිරීම සඳහා SQL පහත සඳහන් වාක්‍ය ඛණ්ඩය නිර්වචනය කරයි:

විවෘත cursor_name;

කර්සරයකින් දත්ත ලබා ගැනීම, කර්සරය ලබා ගැනීම

කර්සරයේ දත්ත සමහර විචල්‍යයන් වෙත කියවීමේ වාක්‍ය ඛණ්ඩය පහත පරිදි වේ:

cursor_name var_name [, var_name] ... වෙතට ගෙන එන්න;

ක්රියාකරු ගේනවාවිවෘත කර්සරයක දත්ත පසුව පිහිටන විචල්‍යයන් වෙත ගෙන එයි වෙතසහ කර්සරය ඊළඟ ස්ථානයට ගෙන යයි.

Cursor close, cursor close

ක්රියාකරු සමීපයිකර්සරය වසා දමයි. ප්‍රකාශය නිශ්චිතව දක්වා නොමැති නම්, අනුරූප වැඩසටහන් බ්ලොක් එක වසා ඇති විට කර්සරය ස්වයංක්‍රීයව වැසෙයි.

වසන්න cursor_name;

වසා දැමීමෙන් පසු, කර්සරය ප්රවේශ විය නොහැක. වසා දැමීමේදී, කර්සරය ක්රියාත්මක කිරීමේදී සකසා ඇති සියලුම අගුලු මුදා හරිනු ලැබේ. විවෘත කර්සර පමණක් වසා දැමිය හැක. සංවෘත නමුත් නිදහස් නොවන කර්සරයක් නැවත විවෘත කළ හැක. විවෘත නොකළ කර්සරයක් වැසීමට අවසර නැත.

සෑම DBMS එකකටම කර්සරයක් භාවිතා කිරීමේ විශේෂතා ඇත.

Oracle හි කර්සර භාවිතා කිරීමේ විශේෂාංග

PL/SQL හි cursor attributes හතරක් ඇත %සොයා ගත්තා, %හමු වුණේ නැහැ, %ISOPENසහ %ROWCOUNT. කර්සරයේ ගුණාංග %TYPE සහ %ROWTYPE ප්‍රකාශයන් මෙන්, කර්සර නාමයේ දකුණට ප්‍රකාශ කෙරේ.

%Found attribute

%NOTFOUND ගුණාංගය

%NOTFOUND ගුණාංගය %FOUND හි සම්පූර්ණ ප්‍රතිවිරුද්ධයයි.

%ISOPEN ගුණාංගය

%ISOPEN ගුණාංගය පෙන්නුම් කරන්නේ කර්සරය විවෘතද නැද්ද යන්න පමණි.

උපලක්ෂණ %ROWCOUNT

ගුණාංගය %ROWCOUNTකර්සරය විසින් නිශ්චිත වේලාවක කියවන ලද පේළි ගණන ආපසු ලබා දෙන සංඛ්‍යාත්මක ගුණාංගයකි.

Oracle DBMS හි SQL කර්සරය උදාහරණය

v_id managers.id %TYPE ප්‍රකාශ කරන්න; v_name managers.name%TYPE; v_comm managers.comm%TYPE; "2014-11-01" සහ "2014-11-30" අතර දත්ත, හැඳුනුම්පත, නම අනුව, කළමනාකරුවන්ගෙන් comm ලෙස තෝරාගත් id, name, sum(comm) සඳහා crs cursor; විවෘත crs ආරම්භ කරන්න; crs%NOTFOUND විට ලූප් පිටවීම; v_id, v_name, v_comm වෙත crs ලබා ගන්න; ප්‍රසාද (id, නම, comm) අගයන් (crs.id, crs.name, crs.comm) වලට ඇතුල් කරන්න; අවසන්-ලූප්; කැපවීම; සමීප crs; අවසානය;

SQL සේවාදායකයේ කර්සරය භාවිතා කිරීමේ විශේෂාංග

MSSQL හි භාවිතා වන කර්සර අනුක්‍රමික සහ අනුචලනය කළ හැකිය. අනුක්‍රමික ඔබට එක් දිශාවකට පමණක් දත්ත තෝරා ගැනීමට ඉඩ සලසයි - ආරම්භයේ සිට අවසානය දක්වා. අනුචලනය කළ හැකි කර්සරය දෙපැත්තටම චලනය වීමට ඉඩ සලසයි, කර්සරයේ ප්‍රතිඵල කට්ටලයේ අත්තනෝමතික පේළියකට සැරිසැරීමට ඔබට ඉඩ සලසයි.

SQL සේවාදායකය ස්ථිතික, ගතික, අනුක්‍රමික සහ යතුරු කට්ටලය මත ධාවනය වන කර්සර සඳහා සහය දක්වයි.

ස්ථිතික කර්සරයක් සහිත යෝජනා ක්‍රමයක, තොරතුරු කාල සටහනක් ලෙස ස්නැප්ෂොට් එකක් ලෙස ගබඩා කර ඇත. එබැවින්, වෙනත් පරිශීලකයෙකු විසින් දත්ත සමුදායේ සිදු කරන ලද වෙනස්කම් නොපෙනේ. කර්සරය විවෘත කිරීමේ කාලසීමාව සඳහා, සේවාදායකය එහි සම්පූර්ණ ප්රතිඵල කට්ටලයට ඇතුළත් කර ඇති සියලුම පේළිවල අගුලක් ලබා ගනී. ස්ථිතික කර්සරයක් නිර්මාණය කිරීමෙන් පසු වෙනස් නොවන අතර සෑම විටම එය විවෘත කරන ලද අවස්ථාවේ පැවති දත්ත කට්ටලය පෙන්වයි. වෙනත් පරිශීලකයින් මුල් වගුවේ කර්සරයේ ඇතුළත් දත්ත වෙනස් කරන්නේ නම්, මෙය ස්ථිතික කර්සරයට කිසිදු ආකාරයකින් බලපාන්නේ නැත. ස්ථිතික කර්සරයක් වෙනස් කළ නොහැක, එබැවින් එය සෑම විටම කියවීමට පමණක් ප්‍රකාරයේදී විවෘත වේ.

ගතික කර්සරයක් සඳහා අතිරේක ජාල පොදු කාර්ය සහ මෘදුකාංග සම්පත් අවශ්‍ය වේ. ගතික කර්සරය භාවිතා කරන විට, දත්තවල සම්පූර්ණ පිටපතක් සාදනු නොලැබේ, නමුත් මූලාශ්ර වගු වලින් තේරීමක් සිදු කරනු ලබන්නේ පරිශීලකයා යම් දත්ත වලට ප්රවේශ වූ විට පමණි. ලබා ගැනීමේදී, සේවාදායකය පේළි අගුළු දමන අතර, කර්සරයේ සම්පූර්ණ ප්‍රතිඵල කට්ටලයට පරිශීලකයා කරන ඕනෑම වෙනස්කමක් කර්සරය තුළ දෘශ්‍යමාන වේ. කෙසේ වෙතත්, කර්සරය මඟින් දත්ත ලබා ගත් පසු, වෙනත් පරිශීලකයෙකු විසින් සිදු කරන ලද වෙනස්කම් කර්සරය තුළ තවදුරටත් පිළිබිඹු නොවේ.

යතුරු කට්ටලය මඟින් ධාවනය වන කර්සරයක් ගුණාංගවල ස්ථිතික සහ ගතික අතර වැටේ. නියැදීමේ අවස්ථාවේදී වාර්තා හඳුනාගෙන ඇති අතර එමඟින් වෙනස්කම් නිරීක්ෂණය කරනු ලැබේ. පසුපසට අනුචලනය කිරීමේදී මෙම ආකාරයේ කර්සරය ප්රයෝජනවත් වේ. මෙම අවස්ථාවෙහිදී, තොරතුරු යාවත්කාලීන කර කර්සරය තෝරා ගන්නා තෙක් දත්ත එකතු කිරීම් සහ මකාදැමීම් නොපෙනේ නව අනුවාදයඑහි වෙනස්කම් සිදු කර ඇත්නම් වාර්තා කරයි.

ස්ථිතික කර්සරය තොරතුරු සැකසුම් පද්ධති සඳහා වඩාත් හොඳින් භාවිතා වේ, එනම්. වාර්තාකරණ පද්ධති සඳහා හෝ සංඛ්යානමය සහ විශ්ලේෂණාත්මක අරමුණු සඳහා. ස්ථිතික කර්සරයක් විශාල දත්ත ප්‍රමාණයක් ලබා ගැනීමට වඩා හොඳය. ඉලෙක්ට්‍රොනික මිලදී ගැනීම් හෝ වස්තු (ආසන, ප්‍රවේශපත්‍ර) වෙන්කිරීමේ පද්ධතිවල, වෙනස්කම් සිදු කරන විට යාවත්කාලීන තොරතුරු ගතිකව වටහා ගැනීම අවශ්‍ය වේ. එවැනි අවස්ථාවලදී ගතික කර්සරය භාවිතා වේ. මෙම යෙදුම්වල, මාරු කරන ලද දත්ත ප්‍රමාණය සාමාන්‍යයෙන් කුඩා වන අතර තනි වාර්තා මට්ටමින් ප්‍රවේශ වේ.

අනුක්‍රමික කර්සරය කර්සරයේ ආරම්භයේ සිට අවසානය දක්වා පමණක් දත්ත පසුපසට ලබා ගැනීමට ඉඩ නොදේ. අනුක්‍රමික කර්සරයක් සියලුම දත්ත පේළි කට්ටලයක් ගබඩා නොකරයි. කර්සරය ලබා ගැනීම සිදු කළ විගසම ඒවා දත්ත සමුදායෙන් කියවනු ලැබේ, එමඟින් INSERT, UPDATE, DELETE විධාන භාවිතා කරමින් දත්ත ගබඩාවට පරිශීලකයින් විසින් කරන ලද සියලුම වෙනස්කම් ගතිකව පිළිබිඹු කිරීමට ඔබට ඉඩ සලසයි. කර්සරය දත්තවල නවතම තත්ත්වය කියවයි.

කර්සරය ප්රකාශය

SELECT_statement ]] සඳහා cursor_name cursor ප්‍රකාශ කරන්න

මූල පදය භාවිතා කරන විට දේශීයබ්ලොක් එකක්, ප්‍රේරකයක්, ගබඩා කළ ක්‍රියා පටිපාටියක් හෝ පරිශීලක-නිර්වචනය කළ කාර්යයක් තුළ පමණක් දෘශ්‍යමාන වන දේශීය කර්සරයක් සාදනු ඇත. මූල පදය ගෝලීය, වත්මන් සම්බන්ධතාවය වසා දමන තෙක් පවතින ගෝලීය කර්සරය නිර්වචනය කරයි.

ක්රියාකරු FORWARD_පමණක්පළමු පේළියේ සිට අන්තිම දක්වා දිශාවට පමණක් දත්ත ලබා ගැනීමට ඉඩ සලසන අනුක්‍රමික කර්සරයක් නිර්වචනය කරයි. ක්රියාකරු භාවිතා කරන විට අනුචලනය කරන්නඅනුචලනය කළ හැකි කර්සරයක් නිර්මාණය කර ඇති අතර එමඟින් දත්ත ඕනෑම අනුපිළිවෙලකට සහ ඕනෑම දිශාවකට ප්‍රවේශ වීමට ඉඩ සලසයි.

කර්සරය වර්ගය ක්‍රියාකරුවන් විසින් තීරණය කරනු ලැබේ:

  • STATIC - ස්ථිතික කර්සරයක් නිර්මාණය කිරීම;
  • ඩයිනමික් - ගතික කර්සරයක් නිර්මාණය කිරීම;
  • KEYSET - යතුරු කර්සරයක් නිර්මාණය කිරීම.

කර්සරය සඳහා නම් කියවන්න_පමණක්තර්කයක් සඳහන් කරන්න වේගයෙන් ඉදිරියට, එවිට ජනනය කරන ලද කර්සරය ප්‍රශස්ත වනු ඇත ඉක්මන් ප්රවේශයදත්ත වෙත. මෙම තර්කය තර්ක සමඟ ඒකාබද්ධව භාවිතා කළ නොහැක FORWARD_පමණක්සහ සුභවාදී.

ප්‍රකාශය සමඟ කර්සරය නිර්මාණය කළේ නම් සුභවාදී, කර්සරය විවෘත කිරීමෙන් පසු වෙනස් වූ රේඛා වෙනස් කිරීම සහ මකා දැමීම තහනම්ය.

තර්කයක් ඉදිරිපත් කරන විට TYPE_අවවාදයයිසේවාදායකය SELECT විමසුමක් සමඟ නොගැලපේ නම් ව්‍යංග කර්සරයේ ආකාරයේ වෙනසක් වාර්තා කරයි.

කර්සරයකින් දත්ත ලබා ගැනීම, ලබා ගැනීම

කර්සරය විවෘත කළ වහාම, ඔබට පහත විධානය සමඟ එහි අන්තර්ගතය ලබා ගත හැක:

ක්රියාකරු භාවිතා කරන විට පලමුකර්සරයේ ප්‍රතිඵල කට්ටලයේ පළමු පේළිය ආපසු ලබා දෙනු ඇත, එය වත්මන් පේළිය බවට පත් වේ. ඔබ සඳහන් කරන විට අවසන්කර්සරයේ අවසාන පේළිය ආපසු ලබා දෙනු ඇත. එය වත්මන් රේඛාව බවට ද පත් වේ.

ක්රියාකරු නියම කරන විට ඊළඟප්‍රතිඵල කට්ටලයේ වත්මන් එක පසු වූ වහාම පේළිය ආපසු ලබා දෙනු ඇත. මෙම රේඛාව වත්මන් රේඛාව බවට පත්වේ. පෙරනිමි විධානය ගෙන එන්නපේළි ලබා ගැනීම සඳහා හරියටම මේ ආකාරයෙන් භාවිතා කරයි.

ක්රියාකරු නියම කරන විට පෙරවත්මන් එකට පෙර රේඛාව ආපසු ලබා දෙනු ඇත. මෙම රේඛාව වත්මන් රේඛාව බවට පත්වේ.

ක්රියාකරු ABSOLUTE (line_number | @line_number_variable)කර්සරයේ සම්පූර්ණ ප්‍රතිඵල කට්ටලය තුළ පේළියක් එහි නිරපේක්ෂ අනුපිළිවෙලින් ලබා දෙයි. රේඛා අංකය නියතයක් භාවිතයෙන් හෝ රේඛා අංකය ගබඩා කරන විචල්‍යයක නමක් ලෙස දැක්විය හැක. විචල්‍යයට පූර්ණ සංඛ්‍යා දත්ත වර්ගයක් තිබිය යුතුය. ධනාත්මක සහ සෘණ අගයන් දෙකම පෙන්වා ඇත. ඔබ ධනාත්මක අගයක් නියම කරන්නේ නම්, නූල කට්ටලයේ ආරම්භයේ සිට ගණනය කරනු ලැබේ, සෘණ අගය - අවසානයේ සිට. තෝරාගත් රේඛාව වත්මන් රේඛාව බවට පත්වේ. null සඳහන් කර ඇත්නම්, තන්තුවක් ආපසු ලබා නොදේ.

තර්කය සාපේක්ෂ (පේළි_අංකය | @row_number_variable)වත්මන් එකට පසුව නියමිත පේළි ගණනින් තන්තුව ඕෆ්සෙට් ලබා දෙයි. ඔබ පේළි ගණන සඳහා සෘණ අගයක් සඳහන් කරන්නේ නම්, වත්මන් රේඛාවට පෙර සඳහන් කළ පේළි ගණන ආපසු ලබා දෙනු ඇත. null සඳහන් කිරීම වත්මන් පේළිය ආපසු ලබා දෙනු ඇත. ආපසු ලබා දුන් පේළිය වත්මන් එක බවට පත්වේ.

ගෝලීය කර්සරයක් විවෘත කිරීමට, එහි නමට මූලික පදයක් යොදන්න ගෝලීය. විචල්‍යයක් භාවිතයෙන් කර්සරයේ නම ද නියම කළ හැක.

ප්රකාශනය තුළ INTO @variable_name [,...n]ආපසු ලැබෙන පේළියේ අනුරූප තීරු අගයන් ගබඩා කරනු ලබන විචල්‍ය ලැයිස්තුවක් අර්ථ දක්වා ඇත. විචල්‍යවල අනුපිළිවෙල කර්සරයේ තීරු අනුපිළිවෙලට ගැළපිය යුතු අතර විචල්‍යයේ දත්ත වර්ගය කර්සරයේ තීරුවේ ඇති දත්ත වර්ගයට අනුරූප විය යුතුය.

කර්සරය භාවිතයෙන් දත්ත වෙනස් කිරීම සහ මකා දැමීම

කර්සරයක් භාවිතයෙන් දත්ත වෙනස් කිරීමට, ඔබ පහත ආකෘතියෙන් UPDATE විධානයක් නිකුත් කළ යුතුය:

එක් මෙහෙයුමකදී, කර්සරයේ වත්මන් පේළියේ තීරු කිහිපයක අගයන් වෙනස් කළ හැකිය, නමුත් ඒවා සියල්ලම එකම වගුවකට අයත් විය යුතුය.

කර්සරයක් භාවිතයෙන් දත්ත මකා දැමීමට, පහත ආකෘතියෙන් DELETE විධානය භාවිතා කරන්න:

ප්රතිඵලයක් වශයෙන්, කර්සරයේ වත්මන් රේඛාව මකා දැමෙනු ඇත.

මතකය වෙන් කිරීම, බෙදා හැරීම

මතකයෙන් කර්සරයක් ඉවත් කිරීමට, විධානය භාවිතා කරන්න

cursor_name වෙන් කරන්න;

@@FETCH_STATUS ගුණාංගය

කර්සරයේ පේළි තිබීම තීරණය කිරීම සඳහා ගෝලීය විචල්‍යය භාවිතා කරන්න @@FETCH_STATUS, කර්සරයේ තවත් පේළි නොමැති නම් ශුන්‍ය නොවන අගයක් ගනී. රොසෙට් එක තවම අවසන් වී නොමැති නම්, @@FETCH_STATUS ශුන්‍ය වේ.

SQL සේවාදායකයේ කර්සර උදාහරණය

@company varchar(50), @manager varchar(50), @message varchar(256) ප්‍රකාශ කරන්න; තෝරාගත් සමාගමක් සඳහා crs_clients කර්සරය දේශීයව ප්‍රකාශ කරන්න, පාරිභෝගිකයන්ගෙන් කළමනාකරු, නගරය = "මොස්කව්" ඇණවුම සමාගම, කළමනාකරු; "සේවාදායකයින්ගේ ලැයිස්තුව" මුද්රණය කරන්න; විවෘත crs_clients; ඊළඟට crs_clients වෙතින් @company, @manager වෙත ලබා ගන්න; @@FETCH_STATUS = 0 ආරම්භ කරන අතරතුර @message = "සමාගම" + @සමාගම + "කළමනාකරු" + @manager තෝරන්න; print@message; -- crs_clients වෙතින් @company, @manager වෙත ඊළඟ ප්‍රවේශය වෙත යන්න; අවසානය; සමීප crs_clients; crs_clients වෙන් කරන්න;

කර්සරය අර්ථ දක්වා ඇත. එහි වර්ග සහ හැසිරීම් පිළිබඳ විස්තරයක් ලබා දී ඇත: ස්ථිතික, ගතික, අනුක්රමික සහ ප්රධාන කර්සරය. කර්සරය පාලනය කිරීමේ මූලධර්ම විස්තර කර ඇත: කර්සරය නිර්මාණය කිරීම සහ විවෘත කිරීම, දත්ත කියවීම, කර්සරය වසා දැමීම. කර්සර ක්‍රමලේඛන උදාහරණ ලබා දී ඇත.

කර්සරය සංකල්පය

සම්බන්ධතා දත්ත සමුදා විමසුමක් සාමාන්‍යයෙන් දත්ත පේළි කිහිපයක් (වාර්තා) ලබා දෙයි, නමුත් යෙදුම වරකට එක් වාර්තාවක් පමණක් සකසයි. එය එකවර පේළි කිහිපයක් සමඟ කටයුතු කළත් (උදාහරණයක් ලෙස, පැතුරුම්පත් ආකාරයෙන් දත්ත ප්‍රතිදානය කිරීම), ඒවායේ සංඛ්‍යාව තවමත් සීමිතය. මීට අමතරව, දත්ත වෙනස් කිරීමේදී, මකා දැමීමේදී හෝ එකතු කිරීමේදී, වැඩ කිරීමේ ඒකකය පේළිය වේ. මෙම තත්වය තුළ, කර්සරය පිළිබඳ සංකල්පය පෙරට එන අතර, මෙම සන්දර්භය තුළ, කර්සරය පේළියකට දර්ශකයකි.

SQL හි කර්සරය යනු අවසාන SQL ප්‍රකාශය ගබඩා කිරීමට කැප වූ දත්ත සමුදා මතකයේ කලාපයකි. වත්මන් ප්‍රකාශය දත්ත සමුදා විමසුමක් නම්, වත්මන් අගය හෝ වත්මන් කර්සර පේළිය ලෙස හඳුන්වන විමසුම් දත්ත පෙළ ද මතකයේ ගබඩා වේ. මතකයේ නිශ්චිත ප්රදේශය නම් කර ඇති අතර යෙදුම් වැඩසටහන් සඳහා ලබා ගත හැකිය.

සාමාන්‍යයෙන්, දත්ත සමුදායක ගබඩා කර ඇති තොරතුරුවල උප කුලකයක් තෝරා ගැනීමට කර්සරය භාවිතා කරයි. එක් කර්සර රේඛාවක් යෙදුම මඟින් වරකට පරීක්ෂා කළ හැක. කර්සරය බොහෝ විට භාවිතා වේ SQL ප්රකාශයන්පටිපාටිමය භාෂාවලින් ලියා ඇති යෙදුම් වැඩසටහන් වලට ගොඩනගා ඇත. ඒවායින් සමහරක් දත්ත සමුදා සේවාදායකය විසින් ව්‍යංගයෙන් නිර්මාණය කර ඇති අතර අනෙක් ඒවා ක්‍රමලේඛකයින් විසින් අර්ථ දක්වා ඇත.

SQL ප්‍රමිතියට අනුකූලව, කර්සරය සමඟ වැඩ කරන විට, පහත සඳහන් ප්‍රධාන ක්‍රියා වෙන්කර හඳුනාගත හැකිය:

  • නිර්මාණය හෝ කර්සරය ප්රකාශය;
  • කර්සරය විවෘත කිරීම, i.e. බහු මට්ටමේ මතකයේ ගබඩා කර ඇති දත්ත සමඟ එය පිරවීම;
  • කර්සරයෙන් ලබාගන්නසහ එය සමඟ දත්ත පේළි වෙනස් කිරීම;
  • කර්සරය වසා ඇත, පසුව එය පරිශීලක වැඩසටහන් වලට ප්‍රවේශ විය නොහැක;
  • කර්සරය නිදහස් කිරීම, i.e. කර්සරය වස්තුවක් ලෙස මකාදැමීම, එය වසා දැමීමෙන් ඒ හා සම්බන්ධ මතකය අනිවාර්යයෙන්ම මුදා හරිනු නොලැබේ.

විවිධ ක්‍රියාත්මක කිරීම් වලදී, කර්සරයේ නිර්වචනය යම් වෙනස්කම් තිබිය හැක. එබැවින්, උදාහරණයක් ලෙස, සමහර විට සංවර්ධකයා විසින් කර්සරය සඳහා වෙන් කර ඇති මතකය පැහැදිලිවම මුදා හැරිය යුතුය. අනතුරුව කර්සරය නිදහස් කිරීමඒ හා බැඳුණු මතකය ද නිදහස් වේ. මෙය ඔහුගේ නම නැවත භාවිතා කිරීමට හැකි වේ. වෙනත් ක්‍රියාත්මක කිරීම් වලදී, කර්සරය වසා ඇතමතකය ව්‍යංගයෙන් බෙදා හැර ඇත. යථා තත්ත්වයට පත් වූ වහාම, එය වෙනත් මෙහෙයුම් සඳහා ලබා ගත හැකිය: වෙනත් කර්සරයක් විවෘත කිරීමආදිය

සමහර අවස්ථාවලදී, කර්සරය භාවිතා කිරීම නොවැළැක්විය හැකිය. කෙසේ වෙතත්, හැකි නම්, මෙය වළක්වා ගත යුතු අතර සම්මත දත්ත සැකසුම් විධාන සමඟ වැඩ කළ යුතුය: SELECT , UPDATE , INSERT , DELETE . කර්සරය මඟින් ඔබට සම්පූර්ණ දත්ත ප්‍රමාණය වෙනස් කිරීමේ මෙහෙයුම් සිදු කිරීමට ඉඩ නොදෙන කාරණයට අමතරව, කර්සරය භාවිතයෙන් දත්ත සැකසුම් මෙහෙයුම් සිදු කිරීමේ වේගය සම්මත SQL මෙවලම්වලට වඩා සැලකිය යුතු ලෙස අඩුය.

MS SQL Server පරිසරය තුළ කර්සරය ක්‍රියාත්මක කිරීම

SQL සේවාදායකය කර්සර වර්ග තුනකට සහය දක්වයි:

  • SQL කර්සරය ප්‍රධාන වශයෙන් ප්‍රේරක, ගබඩා කළ ක්‍රියා පටිපාටි සහ ස්ක්‍රිප්ට් තුළ භාවිතා වේ;
  • සේවාදායක කර්සරය සේවාදායකය මත ක්‍රියාත්මක වන අතර ODBC, OLE DB, DB_Library සඳහා යෙදුම් ක්‍රමලේඛන අතුරුමුහුණත ක්‍රියාත්මක කරයි;
  • සේවාදායක කර්සරය සේවාදායකයා මතම ක්‍රියාත්මක වේ. ඔවුන් සේවාදායකයෙන් සම්පූර්ණ පේළි කට්ටලයක් ලබාගෙන එය දේශීයව ගබඩා කරයි, එමඟින් ජාල මෙහෙයුම්වල නාස්තිය අඩු කිරීමෙන් දත්ත සැකසුම් මෙහෙයුම් වේගවත් කරයි.

විවිධ වර්ගයේ බහු-පරිශීලක යෙදුම් සඳහා විවිධ ආකාරයේ සමාන්තර දත්ත ප්‍රවේශය අවශ්‍ය වේ. සමහර යෙදුම් වලට දත්ත සමුදායේ වෙනස්කම් පිළිබඳ තොරතුරු වෙත ක්ෂණික ප්‍රවේශය අවශ්‍ය වේ. මෙය ප්‍රවේශපත්‍ර වෙන්කිරීමේ පද්ධති සඳහා සාමාන්‍ය වේ. වෙනත් අවස්ථා වලදී, උදාහරණයක් ලෙස, සංඛ්‍යාන වාර්තාකරණ පද්ධති වලදී, දත්තවල ස්ථායිතාව වැදගත් වේ, මන්ද ඒවා නිරන්තරයෙන් වෙනස් කළහොත්, වැඩසටහන් වලට තොරතුරු ඵලදායි ලෙස ප්‍රදර්ශනය කිරීමට නොහැකි වනු ඇත. විවිධ යෙදුම් සඳහා කර්සරයේ විවිධ ක්‍රියාත්මක කිරීම් අවශ්‍ය වේ.

SQL Server පරිසරය තුළ, කර්සර වර්ග ඒවා සපයන හැකියාවන් අනුව වෙනස් වේ. කර්සරය වර්ගය එහි නිර්මාණයේ අදියරේදී තීරණය වන අතර එය වෙනස් කළ නොහැක. සමහර කර්සර වර්ග වලට ප්‍රතිඵල කට්ටලයේ ඇතුළත් පේළි වලට වෙනත් පරිශීලකයන් විසින් කරන ලද වෙනස්කම් හඳුනාගත හැක. කෙසේ වෙතත්, SQL සේවාදායකය පේළියට ප්‍රවේශ වීමේ අදියරේදී පමණක් එවැනි පේළි වලට වෙනස්කම් නිරීක්ෂණය කරන අතර පේළිය දැනටමත් කියවා අවසන් වූ පසු වෙනස්කම් වෙනස් කිරීමට ඉඩ නොදේ.

කර්සරය වර්ග දෙකකට අයත් වේ: අඛණ්ඩවසහ අනුචලනය කළ හැකි. අනුක්රමිකඑක් දිශාවකට පමණක් දත්ත තෝරා ගැනීමට ඔබට ඉඩ සලසයි - ආරම්භයේ සිට අවසානය දක්වා. අනුචලනය කළ හැකි කර්සරක්‍රියා කිරීමේ වැඩි නිදහසක් ලබා දීම - ඔබට දෙපැත්තටම ගමන් කළ හැකි අතර කර්සරයේ ප්‍රතිඵල කට්ටලයේ අත්තනෝමතික රේඛාවකට පනින්න. කර්සරය මඟින් පෙන්වා දෙන දත්ත වෙනස් කිරීමට වැඩසටහනට හැකි නම්, එය අනුචලනය කළ හැකි සහ වෙනස් කළ හැකි ලෙස හැඳින්වේ. කර්සරය ගැන කතා කිරීම, ගනුදෙනු හුදකලා කිරීම ගැන අමතක නොකළ යුතුය. එක් පරිශීලකයෙකු වාර්තාවක් වෙනස් කරන විට, තවත් අයෙකු එය තමන්ගේම කර්සරය සමඟ කියවන අතර, එපමනක් නොව, එය එකම වාර්තාව වෙනස් කළ හැකිය, එමඟින් දත්ත අඛණ්ඩතාව පවත්වා ගැනීමට අවශ්‍ය වේ.

SQL සේවාදායකය ස්ථිතික, ගතික, සහය දක්වයි අඛණ්ඩවසහ යතුරු කට්ටලයක් මගින් පාලනය වේ.

සමඟ යෝජනා ක්රමය තුළ ස්ථිතික කර්සරයතොරතුරු දත්ත සමුදායෙන් එක් වරක් කියවා ස්නැප්ෂොට් එකක් ලෙස ගබඩා කර ඇත (යම් අවස්ථාවකදී), එබැවින් වෙනත් පරිශීලකයෙකු විසින් දත්ත සමුදායට කරන ලද වෙනස්කම් දෘශ්‍යමාන නොවේ. ටික වේලාවකට කර්සරය විවෘත කිරීමසේවාදායකය එහි සම්පූර්ණ ප්‍රතිඵල කට්ටලයට ඇතුළත් සියලුම පේළිවල අගුලක් ලබා ගනී. ස්ථිතික කර්සරයනිර්මාණය කිරීමෙන් පසු වෙනස් නොවන අතර සෑම විටම එය විවෘත කරන අවස්ථාවේ පැවති දත්ත කට්ටලය පෙන්වයි.

වෙනත් පරිශීලකයින් මූලාශ්‍ර වගුවේ කර්සරයේ ඇතුළත් දත්ත වෙනස් කරන්නේ නම්, මෙය බලපාන්නේ නැත ස්ථිතික කර්සරය.

තුල ස්ථිතික කර්සරයඔබට වෙනස්කම් සිදු කළ නොහැක, එබැවින් එය සෑම විටම කියවීමට-පමණි ආකාරයෙන් විවෘත වේ.

ගතික කර්සරයදත්ත සජීවීව තබා ගනී, නමුත් එයට ජාල සහ මෘදුකාංග සම්පත් අවශ්‍ය වේ. භාවිතා කරමින් ගතික කර්සරමූලාශ්‍ර දත්තවල සම්පූර්ණ පිටපතක් සාදනු නොලැබේ, නමුත් ප්‍රභව වගු වලින් ගතික තේරීමක් සිදු කරනු ලබන්නේ පරිශීලකයා යම් දත්තයකට ප්‍රවේශ වූ විට පමණි. ලබා ගැනීමේදී, සේවාදායකය පේළි අගුළු දමන අතර, පරිශීලකයා කර්සරයේ සම්පූර්ණ ප්‍රතිඵල කට්ටලයට කරන ඕනෑම වෙනස්කමක් කර්සරය තුළ දෘශ්‍යමාන වනු ඇත. කෙසේ වෙතත්, කර්සරය දත්ත ලබා ගැනීමෙන් පසු වෙනත් පරිශීලකයෙකු වෙනස්කම් සිදු කර ඇත්නම්, ඒවා කර්සරය තුළ පිළිබිඹු නොවේ.

කර්සරය යතුරු කට්ටලයක් මගින් පාලනය වේ, මෙම අන්තයන් අතර මැද පිහිටා ඇත. නියැදීමේ අවස්ථාවේදී වාර්තා හඳුනාගෙන ඇති අතර එමඟින් වෙනස්කම් නිරීක්ෂණය කරනු ලැබේ. තොරතුරු යාවත්කාලීන වන තුරු පේළි එකතු කිරීම් සහ මකාදැමීම් දෘශ්‍යමාන නොවන පරිදි ආපසු අනුචලනය ක්‍රියාත්මක කිරීම සඳහා මෙම ආකාරයේ කර්සරය ප්‍රයෝජනවත් වන අතර, රියදුරු එයට වෙනස්කම් සිදු කර ඇත්නම් ඇතුළත් කිරීමේ නව අනුවාදයක් තෝරා ගනී.

අනුක්‍රමික කර්සරප්‍රතිලෝම දිශාවට දත්ත ලබා ගැනීමට ඉඩ නොදෙන්න. පරිශීලකයාට කර්සරයේ ආරම්භයේ සිට අවසානය දක්වා පේළි පමණක් තෝරාගත හැක. අනුක්‍රමික කර්සරයසියලුම පේළි කට්ටලයක් ගබඩා නොකරයි. ඒවා කර්සරය තුළ තෝරාගත් විගස දත්ත සමුදායෙන් කියවනු ලැබේ, එමඟින් INSERT , UPDATE , DELETE විධාන භාවිතා කරමින් දත්ත ගබඩාවට පරිශීලකයින් විසින් කරන ලද සියලුම වෙනස්කම් ගතිකව පිළිබිඹු කිරීමට ඔබට ඉඩ සලසයි. කර්සරය දත්තවල නවතම තත්ත්වය පෙන්වයි.

ස්ථිතික කර්සරයදත්තවල ස්ථාවර දර්ශනයක් ලබා දෙන්න. ඒවා තොරතුරු "ගබඩා" පද්ධති සඳහා හොඳ ය: වාර්තාකරණ පද්ධති සඳහා හෝ සංඛ්‍යානමය සහ විශ්ලේෂණාත්මක අරමුණු සඳහා යෙදුම්. ඊට අමතරව, ස්ථිතික කර්සරයඅනෙක් අයට වඩා හොඳ දත්ත විශාල ප්‍රමාණයක් නියැදීම සමඟ සාර්ථකව කටයුතු කරයි. ඊට පටහැනිව, ඉලෙක්ට්‍රොනික මිලදී ගැනීම් හෝ ප්‍රවේශපත්‍ර වෙන්කරවා ගැනීමේ පද්ධතිවල වෙනස්කම් සිදු කරන විට යාවත්කාලීන තොරතුරු ගතිකව වටහා ගැනීම අවශ්‍ය වේ. එවැනි අවස්ථාවලදී, භාවිතා කරන්න ගතික කර්සරය. මෙම යෙදුම්වල, මාරු කරන ලද දත්ත ප්රමාණය සාමාන්යයෙන් කුඩා වන අතර, ඒවාට ප්රවේශය පේළි මට්ටමින් (තනි පුද්ගල වාර්තා) සිදු කරනු ලැබේ. කණ්ඩායම් ප්රවේශය ඉතා කලාතුරකිනි.

MS SQL සේවාදායක පරිසරය තුළ කර්සරය පාලනය කිරීම

කර්සරය පාලනයපහත දැක්වෙන විධානයන් ක්රියාත්මක කිරීමෙන් ක්රියාත්මක වේ:

  • ප්‍රකාශ කරන්න - සාදන්න හෝ කර්සරය ප්රකාශය;
  • විවෘත- කර්සරය විවෘත කිරීම, i.e. දත්ත සමඟ එය පිරවීම;
  • FETCH- කර්සරයෙන් ලබාගන්නසහ කර්සරය සමඟ දත්ත පේළි වෙනස් කිරීම;
  • වසා- කර්සරය වසා ඇත;
  • DEALLOCATE- කර්සරය නිදහස් කිරීම, i.e. වස්තුවක් ලෙස කර්සරය මකා දැමීම.

කර්සරය ප්රකාශය

කර්සරයක් සෑදීමට SQL ප්‍රමිතිය පහත විධානය සපයයි:

අසංවේදී මූල පදය භාවිතා කිරීමෙන් සාදනු ඇත ස්ථිතික කර්සරය. දත්ත වෙනස් වේඅවසර නැත, ඊට අමතරව, වෙනත් පරිශීලකයින් විසින් කරන ලද වෙනස්කම් දර්ශනය නොවේ. INSENSITIVE මූල පදය නොමැති නම්, a ගතික කර්සරය.

SCROLL මූල පදය නියම කිරීමෙන්, ජනනය කරන ලද කර්සරය ඕනෑම දිශාවකට අනුචලනය කළ හැකි අතර, ඕනෑම තේරීම් විධානයක් යෙදීමට ඉඩ සලසයි. මෙම තර්කය මඟ හැරියහොත්, කර්සරය වනු ඇත ස්ථාවර, i.e. එය නැරඹිය හැක්කේ එක් දිශාවකට පමණි - ආරම්භයේ සිට අවසානය දක්වා.

SELECT ප්‍රකාශය SELECT විමසුමේ අන්තර්ගතය සඳහන් කරයි, එය කර්සර පේළිවල ප්‍රතිඵල කට්ටලය තීරණය කිරීමට භාවිතා කරයි.

READ_ONLY සඳහා වන තර්කය සඳහන් කිරීමෙන් කියවීමට පමණක් කර්සරයක් සාදන අතර දත්තවල කිසිදු වෙනස් කිරීමකට ඉඩ නොදේ. එය ස්ථිතිකයට වඩා වෙනස් ය, නමුත් දෙවැන්න දත්ත වෙනස් කිරීමට ඉඩ නොදේ. කියවීමට පමණක් කර්සරයක් ලෙස ප්‍රකාශ කළ හැක ගතික කර්සරය, වෙනත් පරිශීලකයෙකු විසින් කරන ලද වෙනස්කම් පෙන්වනු ඇත.

යාවත්කාලීන කිරීම සඳහා වන තර්කයක් සහිත කර්සරයක් සෑදීම ඔබට කර්සරය තුළ ක්‍රියාත්මක කිරීමට ඉඩ සලසයි දත්ත වෙනස් කිරීමඑක්කෝ නිශ්චිත තීරු වල, හෝ, OF තර්කය column_name නොමැති විට, සියලුම තීරු වල.

MS SQL Server පරිසරය තුළ, කර්සරය නිර්මාණය කිරීමේ විධානය සඳහා පහත සඳහන් වාක්‍ය ඛණ්ඩය පිළිගනු ලැබේ:

<создание_курсора>::= SELECT_ප්‍රකාශය සඳහා CURSOR_name CURSOR ප්‍රකාශ කරන්න ]]

LOCAL මූල පදය භාවිතා කිරීමෙන් එය නිර්මාණය කළ පැකේජය, ප්‍රේරකය, ගබඩා කළ ක්‍රියා පටිපාටිය හෝ පරිශීලක-නිර්වචනය කළ කාර්යය තුළ පමණක් දෘශ්‍යමාන වන දේශීය කර්සරයක් සාදනු ඇත. පැකේජයක්, ප්‍රේරකයක්, ක්‍රියා පටිපාටියක් හෝ ශ්‍රිතයක් අවසන් වූ විට, කර්සරය ව්‍යංගයෙන් විනාශ වේ. කර්සරය නිර්මාණය කළ නිර්මාණයෙන් පිටත එහි අන්තර්ගතය යැවීමට, ඔබ එහි පරාමිතියට OUTPUT තර්කයක් පැවරිය යුතුය.

GLOBAL මූල පදය නියම කර ඇත්නම්, ගෝලීය කර්සරයක් සාදනු ලැබේ; වත්මන් සම්බන්ධතාවය වසා දමන තුරු එය පවතී.

FORWARD_ONLY නිර්මාණ සඳහන් කරමින් අනුක්රමික කර්සරය; දත්ත නියැදිය හැක්කේ පළමු පේළියේ සිට අන්තිම දක්වා දිශාවට පමණි.

SCROLL නිර්මාණය කිරීම නියම කිරීම අනුචලනය කළ හැකි කර්සරය; දත්ත ඕනෑම අනුපිළිවෙලකට සහ ඕනෑම දිශාවකට ප්‍රවේශ විය හැක.

STATIC නිර්මාණය සඳහන් කිරීම ස්ථිතික කර්සරය.

KEYSET සඳහන් කිරීමෙන් යතුරු කර්සරයක් නිර්මාණය වේ.

DYNAMIC නිර්මාණයන් සඳහන් කිරීම ගතික කර්සරය.

ඔබ READ_ONLY කර්සරයක් සඳහා FAST_FORWARD තර්කය සඳහන් කරන්නේ නම්, උත්පාදනය කරන ලද කර්සරය වේගවත් දත්ත ප්‍රවේශය සඳහා ප්‍රශස්ත වේ. මෙම තර්කය FORWARD_ONLY සහ OPTIMISTIC තර්ක සමඟ ඒකාබද්ධව භාවිතා කළ නොහැක.

OPTIMISTIC තර්කය සමඟින් සාදන ලද කර්සරයක්, එතැන් සිට වෙනස් කර ඇති පේළි වෙනස් කිරීම සහ මකා දැමීම වළක්වයි කර්සරය විවෘත කිරීම.

TYPE_WARNING තර්කය සමඟින්, සේවාදායකය SELECT විමසුමකට නොගැලපේ නම් ව්‍යංග කර්සරයේ වර්ගය වෙනස් කිරීමක් ගැන පරිශීලකයාට දන්වනු ඇත.

කර්සරය විවෘත කිරීම

සදහා කර්සරය විවෘත කිරීමසහ SELECT විමසුම් කර්සරය නිර්මාණය කිරීමේදී නිශ්චිත දත්ත වලින් එය පිරවීම, පහත විධානය භාවිතා කරයි:

අනතුරුව කර්සරය විවෘත කිරීමආශ්‍රිත SELECT ප්‍රකාශය ක්‍රියාත්මක වේ, එහි ප්‍රතිදානය ස්තර මතකයේ ගබඩා වේ.

කර්සරයකින් දත්ත ලබා ගැනීම

හරියටම ඊට පසු කර්සරය විවෘත කිරීමපහත දැක්වෙන විධානය සමඟ ඔබට එහි අන්තර්ගතය (අනුරූප විමසුමේ ප්රතිඵලය) තෝරාගත හැක:

FIRST සඳහන් කිරීමෙන් වත්මන් පේළිය බවට පත්වන සම්පූර්ණ කර්සර ප්‍රතිඵල කට්ටලයේ පළමු පේළිය ආපසු ලබා දෙනු ඇත.

LAST සඳහන් කිරීමෙන් කර්සරයේ නවතම පේළිය ලබා දෙයි. එය වත්මන් රේඛාව බවට ද පත් වේ.

NEXT සඳහන් කිරීම සම්පූර්ණ ප්‍රතිඵල කට්ටලයේ වත්මන් පේළියට පසු වහාම පේළිය ලබා දෙයි. දැන් එය වත්මන් බවට පත්වේ. පෙරනිමියෙන්, FETCH විධානය මෙම පේළි ලබා ගැනීමේ ක්‍රමය භාවිතා කරයි.

PRIOR මූල පදය වත්මන් එකට පෙර පේළිය ලබා දෙයි. ඇය වත්මන් බවට පත් වේ.

තර්කය ABSOLUTE (line_number | @line_number_variable)කර්සරයේ සම්පූර්ණ ප්‍රතිඵල කට්ටලය තුළ පේළියක් එහි නිරපේක්ෂ අනුපිළිවෙලින් ලබා දෙයි. රේඛා අංකය නියතයක් භාවිතයෙන් හෝ රේඛා අංකය ගබඩා කරන විචල්‍යයක නමක් ලෙස දැක්විය හැක. විචල්‍යයට පූර්ණ සංඛ්‍යා දත්ත වර්ගයක් තිබිය යුතුය. ධනාත්මක සහ සෘණ අගයන් දෙකම පෙන්වා ඇත. ඔබ ධනාත්මක අගයක් නියම කරන්නේ නම්, නූල කට්ටලයේ ආරම්භයේ සිට ගණනය කරනු ලැබේ, සෘණ අගය - අවසානයේ සිට. තෝරාගත් රේඛාව වත්මන් රේඛාව බවට පත්වේ. null සඳහන් කර ඇත්නම්, තන්තුවක් ආපසු ලබා නොදේ.

තර්කය සාපේක්ෂ (පේළි_අංකය | @row_number_variable)වත්මන් එකට පසුව නියමිත පේළි ගණන වන තන්තුව ආපසු ලබා දෙයි. ඔබ පේළි ගණන සඳහා සෘණ අගයක් සඳහන් කරන්නේ නම්, වත්මන් රේඛාවට පෙර සඳහන් කළ පේළි ගණන ආපසු ලබා දෙනු ඇත. null සඳහන් කිරීම වත්මන් පේළිය ආපසු ලබා දෙනු ඇත. ආපසු ලබා දුන් පේළිය වත්මන් එක බවට පත්වේ.

දක්වා ගෝලීය කර්සරය විවෘත කරන්න, එයට එහි නමට පෙර GLOBAL මූල පදය අවශ්‍ය වේ. විචල්‍යයක් භාවිතයෙන් කර්සරයේ නම ද නියම කළ හැක.

ඉදිකිරීම් වලදී INTO @variable_name [,...n]ආපසු ලැබෙන පේළියේ අනුරූප තීරු අගයන් ගබඩා කරනු ලබන විචල්‍ය ලැයිස්තුවක් නියම කර ඇත. විචල්‍යවල අනුපිළිවෙල කර්සරයේ තීරු අනුපිළිවෙලට ගැළපිය යුතු අතර විචල්‍යයේ දත්ත වර්ගය කර්සරයේ තීරුවේ ඇති දත්ත වර්ගයට අනුරූප විය යුතුය. INTO ගොඩනැගීම නිශ්චිතව දක්වා නොමැති නම්, FETCH විධානයේ හැසිරීම SELECT විධානයේ හැසිරීමට සමාන වේ - දත්ත තිරය මත දිස්වේ.

දත්ත වෙනස් කිරීම සහ මකා දැමීම

කර්සරය භාවිතයෙන් වෙනස්කම් සිදු කිරීමට, ඔබ පහත ආකෘතියෙන් UPDATE විධානයක් නිකුත් කළ යුතුය:

කර්සරයේ වත්මන් පේළියේ බහුවිධ තීරු එක් මෙහෙයුමකදී වෙනස් කළ හැක, නමුත් ඒවා සියල්ලම එකම වගුවකට අයත් විය යුතුය.

කර්සරයක් භාවිතයෙන් දත්ත මකා දැමීමට, පහත ආකෘතියෙන් DELETE විධානය භාවිතා කරන්න:

එහි ප්රතිඵලයක් වශයෙන්, කර්සරයේ ඇති රේඛා කට්ටල ධාරාව මකා දැමෙනු ඇත.

කර්සරය වසා ඇත

වසා දැමීමෙන් පසු, කර්සරය වැඩසටහන් භාවිතා කරන්නන්ට ප්‍රවේශ විය නොහැක. වසා දැමීමේදී, එහි ක්රියාකාරිත්වය තුළ පිහිටුවා ඇති සියලුම අගුල් ඉවත් කරනු ලැබේ. වසා දැමීම යෙදිය හැක්කේ විවෘත කර්සර සඳහා පමණි. වසා ඇත නමුත් නැත නිදහස් කර්සරයනැවත විවෘත කළ හැක. විවෘත නොකළ කර්සරයක් වැසීමට අවසර නැත.

කර්සරය නිදහස් කිරීම

කර්සරය වසා ඇතවිකල්ප වශයෙන් එයට සම්බන්ධ මතකය නිදහස් කරයි. සමහර ක්‍රියාත්මක කිරීම් වලදී, ඔබ එය DEALLOCATE ප්‍රකාශය සමඟ පැහැදිලිව බෙදා හැරිය යුතුය. අනතුරුව කර්සරය නිදහස් කිරීමමතකය ද නිදහස් වන අතර, කර්සරයේ නම නැවත භාවිතා කළ හැක.

කර්සරයේ අවසානයට ළඟා වූ විට පාලනය කිරීමට, ශ්‍රිතය භාවිතා කිරීම නිර්දේශ කෙරේ: @@FETCH_STATUS

@@FETCH_STATUS ශ්‍රිතය නැවත පැමිණේ:

0 ලබා ගැනීම සාර්ථක වූයේ නම්;

1 කර්සරයෙන් පිටත පේළියක් ගෙන ඒමේ උත්සාහයක් හේතුවෙන් ලබා ගැනීම අසාර්ථක වූයේ නම්;

2 මකා දැමූ හෝ වෙනස් කළ පේළියකට ප්‍රවේශ වීමට ගත් උත්සාහයක් හේතුවෙන් ලබා ගැනීම අසාර්ථක වූයේ නම්.

ප්‍රකාශ කරන්න @id_kl INT, @firm VARCHAR(50), @fam VARCHAR(50), @message VARCHAR(80), @nam VARCHAR(50), @d DATETIME, @p INT, @s INT SET @s=0 PRINT "සාප්පු සවාරි ලැයිස්තුව" සේවාලාභී හැඳුනුම්පත, සමාගම, අවසාන නම තෝරා ගැනීම සඳහා klient_cursor CURSOR ප්‍රකාශ කරන්න =0 ආරම්භය තෝරන්න @පණිවිඩය="සේවාදායකයා" [ඊමේල් ආරක්ෂිත]+ "සමාගම"+ @සමාගම මුද්‍රණය කරන්න @පණිවිඩය තෝරන්න @message="නිෂ්පාදන නම මිලදී ගත් දිනය මිල" මුද්‍රණය කරන්න @පණිවිඩය අයිතමය.නම, වෙළඳාම.දිනය, අයිතමය තෝරා ගැනීම සඳහා tovar_cursor CURSOR ප්‍රකාශ කරන්න.මිල*වෙළඳාම.ප්‍රමාණය මිල අනුව භාණ්ඩ මත ගනුදෙනු. ItemCode=Deal.ItemCode Deal.CustomerCode [ඊමේල් ආරක්ෂිත] _kl විවෘත tovar_cursor ඊළඟට tovar_cursor වෙතින් @nam, @d, @p IF @@FETCH_STATUS වෙත ගෙන එන්න<>0 මුද්‍රණය "මිලදී ගැනීම් නැත" @@FETCH_STATUS=0 BEGIN තෝරන්න @message=" [ඊමේල් ආරක්ෂිත]+" "+ CAST(@d AS CHAR(12))+" "+ CAST(@p AS CHAR(6)) Print @message SET @ [ඊමේල් ආරක්ෂිත][ඊමේල් ආරක්ෂිත]ඊළඟට tovar_cursor වෙතින් @nam, @d, @p END CLOSE tovar_cursor DEALLOCATE tovar_cursor SELECT @message="මුළු පිරිවැය "+ CAST(@s CHAR(6)) මුද්‍රණය කරන්න @පණිවිඩය -- ඊළඟ පාරිභෝගිකයා වෙත ගෙන යන්න-- ඊළඟට ගෙන එන්න klient_cursor වෙතින් @id_kl, @firm, @fam END CLOSE klient_cursor DEALLOCATE klient_cursor වෙත උදාහරණය 13.6. මොස්කව් සිට පාරිභෝගිකයින් විසින් මිලදී ගන්නා ලද භාණ්ඩ ලැයිස්තුවක් සහ ඔවුන්ගේ මුළු පිරිවැය ප්රදර්ශනය කිරීම සඳහා කර්සරය.

උදාහරණය 13.7.මොස්කව් සිට සේවාදායකයින් සඳහා අනුචලනය කළ හැකි කර්සරයක් සංවර්ධනය කරන්න. දුරකථන අංකය 1 න් ආරම්භ වන්නේ නම්, එම අංකය සහිත පාරිභෝගිකයා ඉවත් කර පළමු කර්සරය ඇතුළත් කිරීමේදී, දුරකථන අංකයේ පළමු ඉලක්කම් 4 සමඟ ප්‍රතිස්ථාපනය කරන්න.

@සමාගම VARCHAR(50), @fam VARCHAR(50), @tel VARCHAR(8), @පණිවිඩය VARCHAR(80) ප්‍රකාශ කරන්න "සේවාලාභීන්ගේ ලැයිස්තුව" මුද්‍රණය කරන්න klient_cursor CURSOR GLOBAL SCROLL KEYSET ප්‍රකාශ කරන්න, තෝරාගත් සමාගම, අවසාන නම, දුරකථන සඳහා සමාගමෙන් නගරය = "මොස්කව්" ඇණවුම, යාවත්කාලීන කිරීම සඳහා අවසාන නම විවෘත klient_cursor ඊළඟට klient_cursor වෙතින් @firm, @fam, @tel වෙත ගෙන එන්න [ඊමේල් ආරක්ෂිත]+ "සමාගම" [ඊමේල් ආරක්ෂිත]" Phone "+ @tel PRINT @message -- දුරකථන අංකය 1 න් ආරම්භ වන්නේ නම් -- එම අංකය සමඟ සේවාලාභියා මකන්න '1%' කැමති නම් '1%' සේවාලාභියා මකන්න klient_cursor වෙනත් -- ඊළඟ සේවාලාභියා වෙත යන්න klient_cursor INTO වෙතින් ලබා ගන්න @firm, @fam, @tel END klient_cursor වෙතින් 1 ABSOLUTE FETCH FROM Firm, @fam, @tel -- පළමු ප්‍රවේශයේදී, -- දුරකථන අංකය තුළ පළමු ඉලක්කම වෙනුවට 4 යාවත්කාලීන සේවාලාභියා SET Phone='4' + RIGHT( @tel,LEN(@tel)-1)) klient_cursor වත්මන් කොහිද යන්න තෝරන්න @message="Client" [ඊමේල් ආරක්ෂිත]+" ෆර්ම් "+ @firm " දුරකථන "+ @tel PRINT @message CLOSE klient_cursor DEALLOCATE klient_cursor උදාහරණය 13.7. මොස්කව් සිට ගනුදෙනුකරුවන් සඳහා අනුචලනය කළ හැකි කර්සරය.

උදාහරණය 13.8.භාවිතය කර්සරය ක්‍රියා පටිපාටියක ප්‍රතිදාන පරාමිතියක් ලෙස. ක්රියා පටිපාටිය දත්ත කට්ටලයක් ලබා දෙයි - භාණ්ඩ ලැයිස්තුවක්.

ප්‍රතිදාන කර්සරයෙන් ක්‍රියා පටිපාටිය ඇමතීම සහ දත්ත මුද්‍රණය කිරීම පහත පරිදි සිදු කෙරේ:

ප්‍රකාශ කරන්න @my_cur CURSOR ප්‍රකාශ කරන්න @n VARCHAR(20) EXEC my_proc @ [ඊමේල් ආරක්ෂිත] _cur OUTPUT FETCH NEXT FROM @my_cur INTO @n SELECT @ NWHILE (@@FETCH_STATUS=0) අරඹන්න @my_cur INTO @n SELECT @n END CLOSE @my_cur DEALLOCATE @my_cur




ඉහල