اوراکل 23c – بهبودی برای دستور CASE در PL/SQL

اوراکل در نسخه 23c قابلیت جدیدی را برای دستور CASE در محیط PL/SQL ارائه کرده است که در این متن با آن آشنا خواهیم شد. در ابتدا شکل ساده دستور CASE در PL/SQL را با یک مثال مرور می کنیم:

declare
  VALUE number := 3;
  text  varchar2(50);
begin
  text := case VALUE
            when 1 then
             'ONE'
            when 2 then
             'TWO'
            when 3 then
             'THREE'
            else
             'NOT ONE, TWO NOR THREE'
          end;
  dbms_output.put_line(text);
end;
/
THREE

در این قطعه کد صرفا از عملگر مساوی استفاده شده است و برای استفاده از عملگرهای دیگر نظیر “>”، “<“، BETWEEN و IN باید از فرمت زیر که Searched CASE syntax نامیده می شود، استفاده کنیم:

 declare
  VALUE number := 3;
  text  varchar2(50);
begin
  text := case
            when VALUE < 0 OR VALUE > 5 then
             'OUT OF RANGE'
            when VALUE in (1, 2) then
             'ONE OR TWO'
            when VALUE between 0 and 3 then
             'BETWEEN 0 AND 3 BUT NOT 1 NOR 2'
            else
             'OTHER'
          end;
  dbms_output.put_line(text);
end;
/
BETWEEN 0 AND 3 BUT NOT 1 NOR 2

همچنین می توان این کد را به فرمت زیر هم نوشت:

declare
  VALUE number := 3;
  text  varchar2(50);
begin
   case
            when VALUE < 0 OR VALUE > 5 then
             text :='OUT OF RANGE';
            when VALUE in (1, 2) then
             text :='ONE OR TWO';
            when VALUE between 0 and 3 then
             text :='BETWEEN 0 AND 3 BUT NOT 1 NOR 2';
            else
             text :='OTHER';
          end case;
  dbms_output.put_line(text);
end;
/
BETWEEN 0 AND 3 BUT NOT 1 NOR 2

در نسخه 23c، با استفاده از قابلیت dangling predicate نیازی به تکرار متغیر VALUE نخواهیم داشت(در قطعه کد فوق) و این متغیر صرفا یکبار در کنار دستور case نوشته می شود.

declare
  VALUE number := 3;
  text  varchar2(50);
begin
  text := case VALUE
            when < 0, > 5 then
             'OUT OF RANGE'
            when in (1, 2) then
             'ONE OR TWO'
            when between 0 and 3 then
             'BETWEEN 0 AND 3 BUT NOT 1 NOR 2'
            else
             'OTHER'
          end;
  dbms_output.put_line(text);
end;
/
BETWEEN 0 AND 3 BUT NOT 1 NOR 2

همچنین می توان این کد را به فرمت زیر هم نوشت:

declare
  VALUE number := 3;
  text  varchar2(50);
begin
   case VALUE
            when < 0, > 5 then
             text :='OUT OF RANGE';
            when in (1, 2) then
             text :='ONE OR TWO';
            when between 0 and 3 then
             text :='BETWEEN 0 AND 3 BUT NOT 1 NOR 2';
            else
             text :='OTHER';
          end case;
  dbms_output.put_line(text);
end;
/
BETWEEN 0 AND 3 BUT NOT 1 NOR 2

این بهبود جزیی در SQL CASE قابل استفاده نیست:

SQL> create table tb (GRD number);
Table created.
SQL> insert into tb values (0), (1), (2), (3), (4), (5), (6), (7) ;
8 rows created.
SQL> commit;

اجرای دستور case به روش زیر قابل انجام است:

SQL> select GRD,
       case
         when GRD < 0 OR GRD > 5 then
          'OUT OF RANGE'
         when GRD in (1, 2) then
          'ONE OR TWO'
         when GRD between 0 and 3 then
          'BETWEEN 0 AND 3 BUT NOT 1 NOR 2'
             else
          'OTHER'
       end GRD2
  from tb;
       GRD GRD2
---------- -------------------------------
         0 BETWEEN 0 AND 3 BUT NOT 1 NOR 2
         1 ONE OR TWO
         2 ONE OR TWO
         3 BETWEEN 0 AND 3 BUT NOT 1 NOR 2
         4 OTHER
         5 OTHER
         6 OUT OF RANGE
         7 OUT OF RANGE
8 rows selected.

اما نوشتن این کوئری به روش dangling predicate با خطا مواجه خواهد شد:

SQL> select GRD,case GRD
            when < 0 OR  > 5 then
             'OUT OF RANGE'
            when  in (1, 2) then
             'ONE OR TWO'
            when  between 0 and 3 then
             'BETWEEN 0 AND 3 BUT NOT 1 NOR 2'
            else
             'OTHER'
          end GRD2
 from tb;  
'ORA-00936: missing expression'

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *