Qualified expression ها در اوراکل 18C Plsql

Qualified expression ها راه جایگزینی برای مقدار دادن به اشیایی مانند record ها در plsql را به ما ارائه می کند که هدف ساده و تمیز کردن کد هستش.در این مستند سعی می کنیم این قابلیت رو که در نسخه 18c معرفی شده را بررسی کنیم.نحوه نوشتن دستور:typemark(aggregate)typemark نام type مورد استفاده می باشد.Aggregate داده هایی که برای یک نمونه از type در نظر می گیریمداده ها می توانند براساس جایگاه و یا اشاره کردن به نام متغییر به type اختصاص یابند شاید موارد فوق مقداری پیچیده به نظر بیایند اما در ادامه با مثال هایی که بررسی خواهیم کرد، به سادگی آنها پی خواهیم برد.Qualified Expression ها به همراه recordهااستفاده از record ها با تعداد ستون های زیاد، کاری سخت و پیچیده می باشد که qualified expression این مورد را ساده خواهد کرد.در ادامه به مثال ذیل توجه کنیدDECLARETYPE t_rec IS RECORD (id NUMBER,val1 VARCHAR2(10),val2 VARCHAR2(10),val3 VARCHAR2(10),val4 VARCHAR2(10),val5 VARCHAR2(10),val6 VARCHAR2(10),val7 VARCHAR2(10),val8 VARCHAR2(10),val9 VARCHAR2(10));l_rec t_rec;BEGIN-- Pre-18c - Direct assignment to record columns.l_rec.id := 1;l_rec.val1 := 'ONE';l_rec.val2 := 'TWO';l_rec.val3 := 'THREE';l_rec.val4 := 'FOUR';l_rec.val5 := 'FIVE';l_rec.val6 := 'SIX';l_rec.val7 := 'SEVEN';l_rec.val8 := 'EIGHT';l_rec.val9 := 'NINE';-- 18c - Qualified expression using position notation.l_rec := t_rec(1, 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE');-- 18c - Qualified expression using named association.l_rec := t_rec(id => 1,val1 => 'ONE',val2 => 'TWO',val3 => 'THREE',val4 => 'FOUR',val5 => 'FIVE',val6 => 'SIX',val7 => 'SEVEN',val8 => 'EIGHT',val9 => 'NINE');END;/در صورتی که فقط بخواهیم از برخی ستون ها استفاده کنیم، روش اشاره به نام ستون ها کاربردی تر خواهد بود. به مثال زیر توجه کنید.DECLARETYPE t_rec IS RECORD (id NUMBER,val1 VARCHAR2(10),val2 VARCHAR2(10),val3 VARCHAR2(10),val4 VARCHAR2(10),val5 VARCHAR2(10),val6 VARCHAR2(10),val7 VARCHAR2(10),val8 VARCHAR2(10),val9 VARCHAR2(10));l_rec t_rec;BEGIN-- Pre-18c - Direct assignment to record columns.l_rec.id := 1;l_rec.val1 := 'ONE';l_rec.val9 := 'NINE';-- 18c - Qualified expression using position notation.l_rec := t_rec(1, 'ONE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'NINE');-- 18c - Qualified expression using named association.l_rec := t_rec(id => 1, val1 => 'ONE', val9 => 'NINE');END;/مهمترین فرقی که در مدل استفاده قدیم با qualified expression، این می باشد که در روش جدید، در هر بار فراخوانی، نمونه جدید ساخته خواهد شد. برای درک بهتر به مثال زیر توجه کنید.DECLARETYPE t_rec IS RECORD (id NUMBER,val1 VARCHAR2(10),val2 VARCHAR2(10),val3 VARCHAR2(10),val4 VARCHAR2(10),val5 VARCHAR2(10),val6 VARCHAR2(10),val7 VARCHAR2(10),val8 VARCHAR2(10),val9 VARCHAR2(10));l_rec t_rec;BEGIN-- Pre-18c - Direct assignment to record columns.l_rec.id := 1;l_rec.val1 := 'ONE';l_rec.val9 := 'NINE';DBMS_OUTPUT.put_line('(1) Record1 val1 = ' || l_rec.val1 || ' val9 = ' || l_rec.val9);l_rec.id := 2;l_rec.val2 := 'TWO';l_rec.val8 := 'EIGHT';DBMS_OUTPUT.put_line('(1) Record2 val1 = ' || l_rec.val1 || ' val9 = ' || l_rec.val9);-- 18c - Qualified expression using position notation.l_rec := t_rec(1, 'ONE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'NINE');DBMS_OUTPUT.put_line('(2) Record1 val1 = ' || l_rec.val1 || ' val9 = ' || l_rec.val9);l_rec := t_rec(1, NULL, 'TWO', NULL, NULL, NULL, NULL, NULL, 'EIGHT', NULL);DBMS_OUTPUT.put_line('(2) Record2 val1 = ' || l_rec.val1 || ' val9 = ' || l_rec.val9);-- 18c - Qualified expression using named association.l_rec := t_rec(id => 1, val1 => 'ONE', val9 => 'NINE');DBMS_OUTPUT.put_line('(3) Record1 val1 = ' || l_rec.val1 || ' val9 = ' || l_rec.val9);l_rec := t_rec(id => 1, val2 => 'TWO', val8 => 'EIGHT');DBMS_OUTPUT.put_line('(3) Record2 val1 = ' || l_rec.val1 || ' val9 = ' || l_rec.val9);END;/(1) Record1 val1 = ONE val9 = NINE(1) Record2 val1 = ONE val9 = NINE(2) Record1 val1 = ONE val9 = NINE(2) Record2 val1 = val9 =(3) Record1 val1 = ONE val9 = NINE(3) Record2 val1 = val9 =PL/SQL procedure successfully completed.SQL>همچین می توان از qualified expression در تعریف پیش فرض مقدار ها نیز استفاده کرد.DECLARETYPE t_rec IS RECORD (id NUMBER,val1 VARCHAR2(10),val2 VARCHAR2(10));PROCEDURE dummy (p_rec IN t_rec DEFAULT t_rec(id => 1, val1 => 'ONE')) ASBEGINNULL;END;BEGINNULL;END;/Qualified Expression ها با Associative Array ها:در ادامه به نمونه های از کاربرد Qualified Expression با Associative Array ها را می بینیم.DECLARETYPE t_tab IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;l_tab t_tab;BEGIN-- Pre-18c - Direct assignment to elements of the collection.l_tab(1) := 'ONE';l_tab(2) := 'TWO';l_tab(3) := 'THREE';-- 18c - Qualified expression using named association.l_tab := t_tab(1 => 'ONE',2 => 'TWO',3 => 'THREE');END;/DECLARETYPE t_tab IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);l_tab t_tab;BEGIN-- Pre-18c - Direct assignment to record columns.l_tab('IND1') := 'ONE';l_tab('IND2') := 'TWO';l_tab('IND3') := 'THREE';-- 18c - Qualified expression using named association.l_tab := t_tab('IND1' => 'ONE','IND2' => 'TWO','IND3' => 'THREE');END;/این موضوع را مجدد یادآوری می کنیم، هربار که Qualified Expressionفراخوانی شود، یک نمونه جدید از آن نوع ( در اینجا Associative Array ) ایجاد خواهد شد و المان هایی که در فراخوان قبلی استفاده شده بودند از بین خواهند رفت. به مثال زیر توجه فرمایید.SET SERVEROUTPUT ONDECLARETYPE t_tab IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);l_tab t_tab;BEGIN-- 18c - Qualified expression using named association.l_tab := t_tab(1 => 'ONE',2 => 'TWO',3 => 'THREE');l_tab := t_tab(1 => 'ONE',3 => 'THREE');DBMS_OUTPUT.put_line('2=' || l_tab(2));EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.put_line('I knew this would cause a NDF error!');END;/I knew this would cause a NDF error!PL/SQL procedure successfully completed.SQL>Qualified Expression ها را می توان به عنوان مقدار پیش فرض در هنگام تعریف Associative Array نیز استفاده کرد.DECLARETYPE t_tab IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);PROCEDURE dummy (p_tab IN t_tab DEFAULT t_tab(1 => 'ONE', 2 => 'TWO',3 => 'THREE')) ASBEGINNULL;END;BEGINNULL;END;/برای مطالعه مطالب بیشتر در حوزه پایگاه داده اوراکل به سایت آرتاراد مراجعه بفرمایید.