اوراکل 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 ایمیل:[email protected]

تالار های تخصصی...
ما را در سایت تالار های تخصصی دنبال می کنید

برچسب : نویسنده : خنجی niksaleh بازدید : 9 تاريخ : يکشنبه 26 فروردين 1403 ساعت: 22:00

خبرنامه