اوراکل در نسخه 23ai قابلیت جدیدی را برای دستور 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
در نسخه 23ai، با استفاده از قابلیت 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'