Thursday, August 6, 2009

එකම database එකක ඇති tables කීපයකින් data migration කිරීම

ගොඩ දවසකින් මොනවත් ලියන්න බැරි වුනේ පහුගිය දවස්වල ටිකක් විතර වැඩ වැඩි වුන නිසා.එතනදි කරපු එක වැඩක් තමයි මේ data migration එක,මට ආපු requirement එක තමයි එකම database එකක් තුල ඇති table කීප්යකින් තවත් table කීපයකට data migration එකක් කිරිම.DBMS එක Oracle.

මේක කරන්න පහසුම විදිය තමයි PL/Sql(Procedurel Language/Sql) භාවිතා කරන එක.එතනදි අපිට PL/Sql වල එන Explicit Cursor සංකල්පය තමයි හුඟක්ම ප්‍රයෝජනවත්.මම මේක කරන විදිය මුල සිට සරලව ලියන්නම් PL/SQL ගැන අත්දැකීමක් නැති කෙනෙකුට වුනත් තේරෙන විදියට.

PL/Sql ගැන කෙටියෙන් කිව්වොත් අපිට sql statements කීපයක් එක වර oracle server එක තුලම sequence එකක් විදියට execute කරන්න පුලුවන්. ඇත්තටම අපිට programming concepts භාවිතා කරලා සාමාන්‍ය java program එකක් ලියනවා වගේ PL/Sql එකක් ලියන්න පුලුවන්.variable declaration, initailization, evaluation,manipulation,control sturcturs and looping ,exception handling මේ වගේ ගොඩක් දේවල් කරන්න පුලුවන්. නමුත් අපි PL/Sql එකක් තුල සාමාන්‍යයෙන් ලියන sql වල වගේ නෙමේ පොඩ්ඩක් විතර syntax එක වෙනස් වෙනවා(උදා:-select statement එකකින් ගන්න data, varuable එකක් තුලට දාගන්න වේලාවට වගේ ).මේකේ තියෙන අනිත් වාසිය තමයි peformance.එක block එකක් තුල sql statement කීපයක් execute වෙන හින්දා network traffic එක සෑහෙන්ට අඩු වෙනවා.අනික් වාසිය තමයි maintenance.

PL/Sql block එකක දළ ආකෘතිය

DECLARE - (අත්‍යාවශ්‍ය නොවේ)
- variables, cursors, user-defined exceptions

BEGIN - (අත්‍යාවශ්‍යයි)
- SQL statements
- PL/Sql statements

EXCEPTION- (අත්‍යාවශ්‍ය නොවේ)
- exception handling

END;(අත්‍යාවශ්‍යයි)


ex:-sql statements execute කරන විදිය

DECLARE
v_variable VARCHAR2(5);

BEGIN
SELECT column_name
INTO v_variable
FROM table_name;

DBMS_OUTPUT.PUT_LINE('The variable is ' || v_variable)

EXCEPTION
WHEN exception_name THEN
....

END;

PL/SQL block එකක් තුල variable declaration කරද්දී අපිට oraclce data types භාවිතා කරන්න පුලුවන්, ඒ වගේම තමයි %TYPE කියන attribute එක භාවිතා කරලා යම්කිසි table එකක column type එකකින් declare කරන්න පුලුවන්.(variable_name table_name.column_name%TYPE;).ඊට අමතරව C වල වගේ composite data types තියාගන්නත් පුලුවන්.ඒ වගේම මේ PL/Sql ඇතුලෙත් අපි java program එකක් ලියනකොට වගේ nested blocks තියෙන්න පුලුවන්, එතකොට variable scope එක ගැනත් සැලකිලිමත වෙන්න ඕන.මේ උදාහරණයේ තියෙන DBMS_OUTPUT.PUT_LINE එක හරියටම අපි java program එකක් ලියද්දි දාන System.out.println වගේ.හැබැයි ඒක බලගන්න ඕන නම් SET SERVEROUTPUT ON කියලා block එක උඩින්ම තියෙන්න ඕන,(TOAD වගේ IDE එකක් භාවිතා කරනවනම් එහෙම නැතුව අපිට button click එකකින් ඒක බලගන්න පුලුවන්).

දැන් අපි කතා කරමු explicit cursor සංකල්පය ගැන.මේක ගොඩක් වැදගත් වෙන්නෙ select statement එකකින් එක row එකකට වඩා දෙනකොටයි.අපි එතකොට දෙන data set එක cursor එක තුල තියාගෙන අපිට loop එකක් භාවිතා කරලා එකින් එක අපිට අවශ්‍ය කරන කාර්ය කරගන්න පුලුවන්.

Explicit cursor එකක් ලියද්දී මුලින්ම DECLARE block එක තුල අපි cursor එක declare කරන්න ඕන.ඊට පස්සේ BEGIN block එක තුල ඒක OPEN කරලා ඊට පස්සේ තමයි FETCH කරන්න ඕන.අන්තිමේට අපි cursor එක CLOSE කරන්න ඕන.ඒ වගේම තමයි අනිත් වැදගත් කාරණය තමයි explicit cursor attributes(%ISOPEN,%NOTFOUND,%FOUND,%ROWCOUNT).මේවා භාවිතා කරලා අපිට පුලුවන් loop එකක් තුල cursor එක control කරගන්න.

උදා:-
SET SERVEROUTPUT ON
DECLARE
CURSOR emp_cursor IS
SELECT employee_id,last_name
FROM employees;
v_employee_id employee.employee_id%TYPE;
v_last_name employee.last_name%TYPE;

BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor
INTO v_employee_id,v_last_name;
EXIT WHEN emp_cursor%ROWCOUNT > 4 OR emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Id is ' || v_employee_id || ' and name is ' || v_last_name );
INSERT INTO temp(id,name) VALUES(v_employee_id,v_last_name);
END LOOP;
COMMIT;
CLOSE emp_cursor;

END;
/

දැන් අපිට පෙනෙනවා අපි මුලින් සඳහන් කරපු සංකල්ප භාවිතා කරලා මේ cursor එක ලියලා තියෙන විදිය.declaration,cursor decalaration & variable declaration, opening cursor,looping,cursor fetching,cursor closing, explicit cursor atttributes, loop controlling මේ ආකාරයේ ගොඩක් දේවල් භාවිතා වෙලා තියෙනවා ඉහත උදාහරණය තුල.මම හිතනවා PL/Sql ගැන මුලින්ම හොයන කෙනෙකුට මේ සිංහල ලිපිය වැදගත් වේ කියලා.සියලුම සංකල්ප මෙවැනි කුඩා ලිපියකින් විස්තර කිරිම අපහසු වුවද හැඳින්වීමක් ලෙස මෙය ප්‍රයෝජනවත් වේ යයි සිතමි.තවද මේ ආකාරයේ anonymous PL/Sql blocks, stored procedures ලෙස වෙනමම භාවිතා කරන්න පුලුවනි.ඒ අතරම මේ දෙයද මතකයේ තබාගන්න. බොහෝ අය සමහර database requirements ගැන බලන්නේ තමන් භාවිතා කරන programming language එකේ ඇසිනි.එහෙත් අපිට sql සහ PL/Sql භාවිතා කර ඒවා බොහොමයක් පහසුවෙන් සහ කාර්යක්ෂමව කරගත හැකිය.

1 comment: