با عرض سلام و خسته نباشید خدمت کاربران محترم سایت آموزشی پی وی لرن. و کاربرانی که آموزش کامل PL/SQL را دنبال می کنند. در این جلسه، ما Collections در PL / SQL ( مجموعه در PL / SQL ) را مورد بحث قرار خواهیم داد. یک مجموعه یک گروه مرتب شده از عناصر دارای یک نوع داده است. هر عنصر توسط یک زیرمجموعه منحصر به فرد شناسایی می شود که موقعیت آن را در مجموعه نشان می دهد.
PL / SQL سه نوع مجموعه در PL / SQL را فراهم می کند.
اسناد اوراکل ویژگی های زیر را برای هر نوع مجموعه در PL / SQL فراهم می کند.
نوع مجموعه | تعداد عناصر | نوع زیرنویس | متراکم یا اسپرد | کجا ایجاد شد | می تواند به عنوان نوع شیء باشد |
---|---|---|---|---|---|
آرایه انجمنی (یا فهرستی از جدول) | بدون محدودیت | رشته یا عدد صحیح | هر دو | فقط در بلوک PL / SQL | نه |
میز تو در تو | بدون محدودیت | صحیح | شروع به چگالی می کند، می تواند کمیاب شود | یا در بلوک PL / SQL یا در سطح طرح | بله |
متغیرهای آرایه (Varray) | محدود | صحیح | همیشه متراکم است | یا در بلوک PL / SQL یا در سطح طرح | بله |
ما در مورد varray در جلسه آرایه های PL / SQL’ صحبت کرده ایم. در این جلسه، ما درباره جداول PL / SQL صحبت خواهیم کرد.
هر دو نوع جداول PL / SQL، یعنی جداول فهرست و جداول توزیع نشده، یک ساختار مشابه دارند و ردیف آنها با استفاده از نشانه زیرنویس قابل دسترسی است. با این حال، این دو نوع جداول در یک جنبه متفاوت هستند. جداول توافقی در ستون پایگاه داده ذخیره می شوند و جداول جداگانه نمی توانند.
جدول شاخص (که همچنین یک آرایه انجمنی نامیده می شود) مجموعه ای از جفت های کلید-ارزش است. هر کلید منحصر به فرد است و برای تعیین مقدار مربوطه استفاده می شود. کلید می تواند یک عدد صحیح یا یک رشته باشد.
جدول شاخص با استفاده از نحوه زیر ایجاد می شود. در اینجا، ما یک جدول شاخص با نام table_name ایجاد می کنیم، کلید هایی که از subscript_type وجود دارد و مقادیر مرتبط از element_type را ببینید.
1 2 3 | TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type; table_name type_name; |
مثال زیر نشان می دهد که چگونه برای ایجاد یک جدول برای ذخیره مقادیر عدد صحیح همراه با نام و بعد از آن یک لیست از نام ها را چاپ می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | DECLARE TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20); salary_list salary; name VARCHAR2(20); BEGIN -- adding elements to the table salary_list('Rajnish') := 62000; salary_list('Minakshi') := 75000; salary_list('Martin') := 100000; salary_list('James') := 78000; -- printing the table name := salary_list.FIRST; WHILE name IS NOT null LOOP dbms_output.put_line ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name))); name := salary_list.NEXT(name); END LOOP; END; / |
هنگامی که کد بالا در SQL فوری اجرا می شود، نتیجه زیر را تولید می کند.
1 2 3 4 5 6 | Salary of James is 78000 Salary of Martin is 100000 Salary of Minakshi is 75000 Salary of Rajnish is 62000 PL/SQL procedure successfully completed. |
عناصری از جدول شاخص همچنین می تواند٪ ROWTYPE هر جدول پایگاه داده یا٪ TYPE از هر فیلد جدول پایگاه داده باشد.
مثال زیر این مفهوم را نشان می دهد. ما از جدول مشتریان ذخیره شده در پایگاه داده استفاده خواهیم کرد.
1 2 3 4 5 6 7 8 9 10 11 12 | Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DECLARE CURSOR c_customers is select name from customers; TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer; name_list c_list; counter integer :=0; BEGIN FOR n IN c_customers LOOP counter := counter +1; name_list(counter) := n.name; dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter)); END LOOP; END; / |
هنگامی که کد بالا در SQL فوری اجرا می شود، نتیجه زیر را تولید می کند.
1 2 3 4 5 6 7 8 | Customer(1): Ramesh Customer(2): Khilan Customer(3): kaushik Customer(4): Chaitali Customer(5): Hardik Customer(6): Komal PL/SQL procedure successfully completed |
یک جدول توپی با استفاده از نحوه زیر ایجاد می شود.
1 2 3 | TYPE type_name IS TABLE OF element_type [NOT NULL]; table_name type_name; |
این اعلان شبیه به اعلام یک شاخص توسط جدول است، اما هیچ بند INDEX BY وجود ندارد.
در مجموعه در PL / SQL یک جدول توپی در یک ستون پایگاه داده ذخیره می شود. این می تواند بیشتر به منظور ساده سازی عملیات SQL که در آن شما به یک ستون تک ستون با یک جدول بزرگتر پیوستید استفاده می شود. آرایه انجمنی نمی تواند در پایگاه داده ذخیره شود.
مثال های زیر استفاده از جدول تو در تو را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | DECLARE TYPE names_table IS TABLE OF VARCHAR2(10); TYPE grades IS TABLE OF INTEGER; names names_table; marks grades; total integer; BEGIN names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); marks:= grades(98, 97, 78, 87, 92); total := names.count; dbms_output.put_line('Total '|| total || ' Students'); FOR i IN 1 .. total LOOP dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i)); end loop; END; / |
هنگامی که کد بالا در SQL فوری اجرا می شود، نتیجه زیر را تولید می کند.
1 2 3 4 5 6 7 8 | Total 5 Students Student:Kavita, Marks:98 Student:Pritam, Marks:97 Student:Ayan, Marks:78 Student:Rishav, Marks:87 Student:Aziz, Marks:92 PL/SQL procedure successfully completed. |
عناصر یک جدول توپی نیز می تواند٪ ROWTYPE هر جدول پایگاه داده یا٪ TYPE از هر فیلد جدول پایگاه داده باشد. مثال زیر این مفهوم را نشان می دهد. ما از جدول مشتریان ذخیره شده در پایگاه داده استفاده خواهیم کرد.
1 2 3 4 5 6 7 8 9 10 11 12 | Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DECLARE CURSOR c_customers is SELECT name FROM customers; TYPE c_list IS TABLE of customerS.No.ame%type; name_list c_list := c_list(); counter integer :=0; BEGIN FOR n IN c_customers LOOP counter := counter +1; name_list.extend; name_list(counter) := n.name; dbms_output.put_line('Customer('||counter||'):'||name_list(counter)); END LOOP; END; / |
هنگامی که کد بالا در فوری SQL اجرا می شود، نتیجه زیر را تولید می کند.
1 2 3 4 5 6 7 8 | Customer(1): Ramesh Customer(2): Khilan Customer(3): kaushik Customer(4): Chaitali Customer(5): Hardik Customer(6): Komal PL/SQL procedure successfully completed. |
PL / SQL متدها مجموعه ای ساخته شده را فراهم می کند که Collections در PL / SQL ها را آسان تر برای استفاده می کند.
جدول زیر متدها و اهداف آنها را فهرست می کند.
S.No | نام و هدف متد |
---|---|
۱ | (EXISTS(n اگر عنصر n در یک مجموعه وجود داشته باشد TRUE را بر می گرداند؛ در غیر این صورت FALSE باز می گردد. |
۲ | COUNT تعداد عناصری که مجموعه ای که در حال حاضر در آن موجود است را برمی گرداند. |
۳ | LIMIT حداکثر اندازه یک مجموعه را بررسی می کند. |
۴ | FIRST اولین (کوچکترین) عدد شاخص را در مجموعه ای که از زیرمجموعه های عدد صحیح استفاده می کند، باز می گرداند. |
۵ | LAST آخرین (بزرگترین) عدد شاخص را در یک مجموعه ای که از زیرمجموعه های عدد صحیح استفاده می کند، می گیرد. |
۶ | (PRIOR(n عدد شاخصی را که پیش از فهرست n در مجموعه قرار دارد را بر می گرداند. |
۷ | NEXT(n) عدد شاخصی را که شاخص n را به دست می گیرد، باز می گرداند. |
۸ | EXTEND یک عنصر صفر را به یک مجموعه اضافه می کند. |
۹ | (EXTEND(n عناصر n null را به یک مجموعه اضافه می کند. |
۱۰ | (EXTEND(n,i n کپی از عنصر i ام را به یک مجموعه اضافه می کند. |
۱۱ | TRIM حذف یک عنصر از انتهای مجموعه. |
۱۲ | (TRIM(n حذف عناصر از انتهای مجموعه. |
۱۳ | DELETE تمام عناصر را از مجموعه حذف می کند، COUNT را به ۰ تنظیم می کند |
۱۴ | (DELETE(n عنصر nth را از یک آرایه انجمنی با یک کلید عددی یا یک جدول تو در تو حذف می کند. اگر آرایه associative دارای یک کلید رشته باشد، عنصر مربوط به مقدار کلید حذف می شود. اگر n null باشد، (DELETE (n هیچ کاری انجام نمی دهد. |
۱۵ | (DELETE(m,n تمام عناصر را در محدوده m..n از یک آرایه انجمنی یا جدول توزیع حذف می کند. اگر m بزرگتر از n باشد، اگر m یا null n باشد،(DELETE (m، n هیچ کاری انجام نمی دهد. |
جدول زیر، استثنائات Collections در PL / SQL و زمان رخ دادن آن ها را نشان می دهد:
استثناء مجموعه | در موقعیت ها افزایش یافته است |
---|---|
COLLECTION_IS_NULL | شما سعی می کنید بر روی یک Collections در PL / SQL (مجموعه در PL / SQL) اتم اعداد کار کنید. |
NO_DATA_FOUND | یک عنصر عنصر را حذف می کند یا یک عنصر موجود در آرایه associative. |
SUBSCRIPT_BEYOND_COUNT | یک زیرگروه بیش از تعداد عناصر در یک Collections در PL / SQL است. |
SUBSCRIPT_OUTSIDE_LIMIT | یک زیر فهرست خارج از محدوده مجاز است. |
VALUE_ERROR | یک زیر نویس null است یا به نوع کلید قابل تبدیل نیست. این استثنا ممکن است رخ دهد اگر کلید به عنوان محدوده PLS_INTEGER تعریف شده باشد، و زیر خط خارج از این محدوده است. |
در این جلسه نشان دادیم که چگونه Collections در PL / SQL داده ها را به عنوان متغیرهای محلی ارجاع داده و دستکاری می کند. امیدواریم از آموزش مجموعه در PL / SQL لذت برده باشید.