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

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

Qualified expression در اوراکل 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;

/