עבודה עם מערכים ב- PL/SQL היא לא מסובכת. רובנו מכירים מערכים משפות תכנות והעבודה איתם די פשוטה: רצף של תאים שהגישה אליהם היא לפי האינדקס של התא.
הבעיה היא שבדרך כלל אנחנו צריכים לגשת לערך מסויים לפי ערך אחר. כמובן, שאנחנו עובדים עם אורקל, שהוא בסיס נתונים רלציוני, לכן הדרך שנקראית הפשוטה ביותר היא להכניס את הערכים הרצויים לטבלה ואז לשלוף לפי אינדקס. החסרון בשיטה זו הוא שהעבודה היא מול טבלאות של ממש, כלומר, גישות לטבלה יכולות לגרום לפעולות I/O, אנחנו מושפעים מה- buffer cache וכו'. מה גם, שאם אנחנו רוצים להריץ את הפרוצדורה שלנו מספר פעמים במקביל, הריצות השונות ישפיעו אחת על השניה.
הדרך היעילה ביותר לכתוב את זה נקראית מערך אסוציאטיבי (associative array). זהו מערך בזכרון הפרטי של ה- server process שאינו מושפע ממשתמשים אחרים. המבנה של המערך הוא ערך מסוג מסויים בעל אינדקס מסוג מסויים. האינדקס הוא מספר או טקסט והערך של האינדקס לא חייב להיות מספר מ- 1 והלאה, אלא מה שאנחנו רוצים.
נקח דוגמא כדי לפשט את העניינים. נגיד ואנחנו רוצים לצבוע את מפת העולם ב- 4 צבעים: כחול, ירוק, אדום וצהוב. הדרישות שלנו: לקבל בצורה פשוטה צבע של מדינה מסויימת, לעבור על כל המדינות ולבדוק האם נתנו צבע למדינה.
הפתרון יהיה לבנות מערך אסוציאטיבי שהערכים בו הם varchar2(4) לצבעים, והאינדקס שלו הוא varchar2(30) לשם המדינה.
קטע הקוד הבא מציג מספר דוגמאות לעבודה עם מערך אסוציאטיבי: יצירת תאים חדשים, בדיקה כמה תאים יש במערך, מעבר על כל המערך ובדיקה האם ערך מסויים מופיע בו.
declare type map_array is table of varchar2(4) index by varchar2(30); map map_array; idx varchar2(30); begin -- add countries to the array map('Israel'):='blue'; map('Italy'):='red'; -- print the number of countries in the arrary dbms_output.put_line('There are '||map.count||' countries'); -- go over the entire array idx:=map.first; while (idx is not null) loop dbms_output.put_line('Country '||idx||' is '||map(idx)); idx:=map.next(idx); end loop; -- check if a country exists idx:='England'; if (map.exists(idx)) then dbms_output.put_line(idx||' has the color '||map(idx)); else dbms_output.put_line(idx||' does not have a color'); end if; end; /
בהצלחה.
בכל שאלה ניתן לפנות אלי במייל liron@brillix.co.il
Latest posts by לירון אמיצי (see all)
- ה-SQL Performance Analyzer ב-Real Application Testing - 18/12/2014
- עד כמה דינאמי יכול להיות SQL דינאמי? - 02/10/2014
- מבוא ל- Real Application Testing - 23/07/2014
השאר תגובה: