مسعود سلطانی راد
مسعود سلطانی راد
خواندن ۴ دقیقه·۳ سال پیش

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

Qualified expression ها راه جایگزینی برای مقدار دادن به اشیایی مانند record ها در plsql را به ما ارائه می کند که هدف ساده و تمیز کردن کد هستش.

در این مستند سعی می کنیم این قابلیت رو که در نسخه 18c معرفی شده را بررسی کنیم.

نحوه نوشتن دستور:

typemark(aggregate)

typemark نام type مورد استفاده می باشد.

Aggregate داده هایی که برای یک نمونه از type در نظر می گیریم

داده ها می توانند براساس جایگاه و یا اشاره کردن به نام متغییر به type اختصاص یابند
شاید موارد فوق مقداری پیچیده به نظر بیایند اما در ادامه با مثال هایی که بررسی خواهیم کرد، به سادگی آنها پی خواهیم برد.

Qualified Expression ها به همراه recordها

استفاده از record ها با تعداد ستون های زیاد، کاری سخت و پیچیده می باشد که qualified expression این مورد را ساده خواهد کرد.

در ادامه به مثال ذیل توجه کنید

DECLARE
TYPE 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;
/

در صورتی که فقط بخواهیم از برخی ستون ها استفاده کنیم، روش اشاره به نام ستون ها کاربردی تر خواهد بود. به مثال زیر توجه کنید.

DECLARE
TYPE 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، این می باشد که در روش جدید، در هر بار فراخوانی، نمونه جدید ساخته خواهد شد. برای درک بهتر به مثال زیر توجه کنید.

DECLARE
TYPE 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 در تعریف پیش فرض مقدار ها نیز استفاده کرد.

DECLARE
TYPE 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')) AS
BEGIN
NULL;
END;
BEGIN
NULL;
END;
/

Qualified Expression ها با Associative Array ها:

در ادامه به نمونه های از کاربرد Qualified Expression با Associative Array ها را می بینیم.

DECLARE
TYPE 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;
/
DECLARE
TYPE 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 ON

DECLARE

TYPE 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));

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_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 نیز استفاده کرد.

DECLARE

TYPE 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')) AS

BEGIN

NULL;

END;

BEGIN

NULL;

END;

/

برای مطالعه مطالب بیشتر در حوزه پایگاه داده اوراکل به سایت آرتاراد مراجعه بفرمایید.

اوراکلplsqloracleمشاوره اوراکل
چند سالی هست در حوزه داده ها ( نگهداری و تحلیل آنها) فعالیت دارم و همیشه سعی کردم آموخته هایم رو به اشتراک بگذارم soltanirad@artarad.ir www.artarad.ir
شاید از این پست‌ها خوشتان بیاید