پارامتر JSON_BEHAVIOR در اوراکل 23ai

در اوراکل نسخه 21c، زمانی که توابع مربوط به JSON نظیر JSON_QUERY، JSON_TABLE و JSON_VALUE ورودی معتبری نداشته باشند، خطایی رخ نمی دهد و null به کاربر برمی گردد در مثال زیر، کلید Year سه بار تکرار شده و این ورودی معتبر نیست اما دستور select بدون خطا اجرا می شود و صرفا NULL به کاربر برمی گردد:

SQL> SELECT JSON_VALUE('[{Year:1401},{Year:1401},{Year:1402}]', '$.Year') YEAR;
YEAR
----------------- 

در این شرایط اگر بخواهیم این رفتار را در سطح دستور تغییر دهیم، می توانیم عبارت ERROR ON ERROR را به ورودی اضافه کنیم:

SQL>  SELECT JSON_VALUE('[{Year:1401},{Year:1401},{Year:1402}]', '$.Year' error  on error) ;
ORA-40470: JSON query '$.Year' evaluated to multiple values.
Help: https://docs.oracle.com/error-help/db/ora-40470/

*مقدار پیش فرض NULL ON ERROR است.

در نسخه 23ai برای کنترل این رفتار، پارامتر جدیدی به نام JSON_BEHAVIOR ارائه شده که در سطح session قابل تنظیم است. مقدار پیش فرض این پارامتر، ON_ERROR:NULL است:

SQL> ALTER SESSION SET JSON_BEHAVIOR = 'ON_ERROR:NULL';
Session altered.

SQL> SELECT JSON_VALUE('[{Year:1401},{Year:1401},{Year:1402}]', '$.Year');
JSON_VALUE('[{YEAR:1401},{YEAR:1401},{YEAR:1402}]','$.YEAR')
--------------------------------------------------------------------------------

اما می توانیم این مقدار را به ON_ERROR:ERROR تنظیم کنیم تا برای کوئری فوق خطا نمایش داده شود:

SQL> SELECT JSON_VALUE('[{Year:1401},{Year:1401},{Year:1402}]', '$.Year');
ORA-40470: JSON query '$.Year' evaluated to multiple values.
Help: https://docs.oracle.com/error-help/db/ora-40470/

اوراکل 23ai – تمامی Tablespaceها به صورت Bigfile ایجاد می شوند

از نسخه 23ai تمامی tablespaceهای سیستمی و همچنین users موجود در root container به صورت Bigfile ایجاد می شوند(به استثنای Temp tablespaceها):

SQL*Plus: Release 23.0.0.0.0 - Production on Sat Jun 8 22:43:40 2024
Version 23.4.0.24.05
SQL> select TABLESPACE_NAME,BIGFILE from  dba_tablespaces;
TABLESPACE_NAME                BIG
------------------------------ ---
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS1                       YES
TEMP                           NO
USERS                          YES

tablespaceهای جدیدی هم که توسط DBA در root container ایجاد می شود به صورت Bigfile خواهند بود:

SQL> create tablespace tbs1;
Tablespace created.

SQL> select TABLESPACE_NAME,BIGFILE from  dba_tablespaces where TABLESPACE_NAME='TBS1';
TABLESPACE_NAME                BIG
------------------------------ ---
TBS1                           YES

اما در PDB این مسئله تفاوت جزیی دارد در این محیط، تمامی tablespaceهای سیستمی از نوع Bigfile هستند ولی USERS از نوع Smallfile هست:

SQL> select TABLESPACE_NAME,BIGFILE from  dba_tablespaces;
TABLESPACE_NAME                BIG
------------------------------ ---
SYSTEM                         YES
SYSAUX                         YES
UNDOTBS1                       YES
TEMP                           NO
USERS                          NO

(بیشتر…)

اوراکل 23ai –چند ویوی جدید برای بررسی مسائل پرفورمنسی Data Pump

در اوراکل نسخه 23ai، ویوهای جدیدی در زمینه Data Pump اضافه شده اند که می توان از طریق آنها دلایل کندی  اجرای Data Pump را شناسایی کرد. لیست این ویوها را در قسمت زیر می بینید:

(G)V$DATAPUMP_PROCESS_INFO
(G)V$DATAPUMP_PROCESSWAIT_INFO
(G)V$DATAPUMP_SESSIONWAIT_INFO

ویوی V$DATAPUMP_PROCESS_INFO اطلاعاتی را در مورد جابهای مربوط به Data Pump نمایش می دهد نظیر SESSIONID، SPID، PROGRAM و …

SQL> desc V$DATAPUMP_PROCESS_INFO
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CUR_DATE                                           VARCHAR2(19)
 PROGRAM                                            VARCHAR2(84)
 SESSIONID                                          NUMBER
 STATUS                                             VARCHAR2(8)
 USERNAME                                           VARCHAR2(128)
 JOBNAME                                            VARCHAR2(128)
 SPID                                               VARCHAR2(24)
 SERIALNUMBER                                       NUMBER
 PROCESSID                                          NUMBER
 CON_ID                                             NUMBER

(بیشتر…)

اوراکل 23ai – امکان استفاده از توابع تجمیعی(نظیر SUM و AVG) بر روی نوع داده INTERVAL

تا قبل از نسخه 23ai نمی توانستیم از توابع تجمیعی نظیر SUM، AVG، MIN و MAX و … بر روی داده های با دیتاتایپ  INTERVAL استفاده کنیم و در صورت استفاده، به خطای ORA-00932 مواجه می شدیم. برای مثال می خواهیم بررسی کنیم اجرای جاب PURGE_LOG در یک ماه گذشته به صورت میانگین چقدر زمان برده است:

SQL> select column_name,data_type from dba_tab_cols where table_name='DBA_SCHEDULER_JOB_RUN_DETAILS' and column_name='RUN_DURATION';
COLUMN_NAME     DATA_TYPE
--------------- ----------------------------------------
RUN_DURATION    INTERVAL DAY(3) TO SECOND(0)
SQL> select AVG(RUN_DURATION) from DBA_SCHEDULER_JOB_RUN_DETAILS where job_name='PURGE_LOG';

'ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND'

در اوراکل نسخه 23ai این امکان وجود دارد تا از توابع تجمیعی بر روی نوع داده INTERVAL استفاده کنیم:

SQL> select AVG(RUN_DURATION) from DBA_SCHEDULER_JOB_RUN_DETAILS where job_name='PURGE_LOG';
AVG(RUN_DURATION)
------------------------------------------------
+000000000 00:00:01.419354839

(بیشتر…)

اوراکل 23ai – ایجاد خودکار AWR Snapshot در سطح PDB

در زمان ارائه قابلیت Pluggable Database در نسخه 12cR1،ء AWR snapshotها صرفا در سطح CDB ایجاد می شدند و امکان ایجاد snapshot در سطح PDB وجود نداشت. در نسخه 12cR2 پارامتری به نام awr_pdb_autoflush_enabled اضافه شد که با تنظیم آن به مقدار TRUE، به صورت خودکار در سطح PDB هم AWR snapshot ایجاد می شود اما مقدار پیش فرض این پارامتر تا قبل از نسخه 23ai برابر با FALSE بوده و در نسخه 23ai به صورت پیش فرض فعال می باشد:

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Thu Sep 7 10:57:00 2023
SQL> show parameter awr_pdb_autoflush_enabled
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
awr_pdb_autoflush_enabled            boolean     TRUE

با این تغییر در صورتی که اسکریپت awrrpt.sql را در هر کدام از PDBها اجرا کنیم، گزینه AWR_PDB مقدار پیش فرض خواهد بود:

Specify the location of AWR Data
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AWR PDB reports can be generated using data stored in this PDB or ROOT.
Please enter the desired location at the prompt. Default value is 'AWR_PDB'.
    AWR_PDB  - Use AWR data from PDB
    AWR_ROOT - Use AWR data from ROOT
Enter value for awr_location: AWR_PDB
Location of AWR Data Specified: AWR_PDB

اما در نسخه های قبلی، گزینه AWR_ROOT مقدار پیش فرض بوده است:

Specify the location of AWR Data
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AWR_ROOT - Use AWR data from root (default)
AWR_PDB - Use AWR data from PDB
Enter value for awr_location:

برای دیتابیسی با تعداد PDB زیاد و workload بسیار بالا، بهتر است پارامتر awr_snapshot_time_offset را هم در کنار پارامتر awr_pdb_autoflush_enabled تنظیم کنیم تا AWR snapshotها برای همه PDBها به صورت همزمان ایجاد نشوند و با ایجاد وقفه ای هر چند مختصر، از سکته دیتابیس جلوگیری شود.

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

اوراکل در نسخه 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 نامیده می شود، استفاده کنیم:

(بیشتر…)

اوراکل 23ai – قابلیت Transport Tablespace بر روی Network

در اوراکل نسخه 23ai امکان پیاده سازی قابلیت Transport Tablespace از طریق network به وجود آمد برای این کار باید از ابزار RMAN استفاده کرد و از طریق آن دیتافایلهای tablespace مورد نظر را از دیتابیس مبدا به دیتابیس مقصد منتقل کرد.

این کار با اجرای دستور RESTORE FOREIGN TABLESPACE در دیتابیس مقصد قابل انجام است با اجرای این دستور، حتی Metadata مربوط به TABLESPACE هم از طریق ایجاد فایل dump به دیتابیس مقصد منتقل خواهند شد و به صورت خودکار در این دیتابیس برخواهند گشت.

(بیشتر…)

اوراکل 23ai – اجرای sysdate بر اساس time zone هر PDB

همانطور که می دانید توابع SYSDATE و SYSTIMESTAMP ساعت جاری سیستم را برمی گردانند این توابع date را بر اساس time zone سیستم عامل نمایش می دهند و اگر time zone متفاوتی برای دیتابیس تنظیم شود، تغییری در رفتار این توابع ایجاد نمی شود:

[oracle@OEL8 ~]$ timedatectl
               Local time: Thu 2024-02-15 13:14:48 +0330
           Universal time: Thu 2024-02-15 09:44:48 UTC
                 RTC time: Thu 2024-02-15 07:37:09
                Time zone: Asia/Tehran (+0330, +0330)
SQL> select sysdate , SYSTIMESTAMP ;
SYSDATE   SYSTIMESTAMP
--------- ----------------------------------------
15-FEB-24 15-FEB-24 01.25.54.270895 PM +03:30

SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tokyo';
Database altered.

SQL> select sysdate , SYSTIMESTAMP ;
SYSDATE   SYSTIMESTAMP
--------- ----------------------------------------
15-FEB-24 15-FEB-24 01.26.37.200429 PM +03:30

در نسخه 23ai می توان با تنظیم پارامتر time_at_dbtimezone به مقدار USER_SQL این توابع را مجاب کرد تا date را بر اساس time zone دیتابیس برگردانند صرف نظر از time zone سیستم عامل!

(بیشتر…)

اوراکل 23ai– امکان ایجاد Refreshable PDB از طریق DBCA

قابلیت Refreshable PDB از نسخه 12cR2 ارائه شد که قبلا در مورد آن مطلبی نوشتیم. برای ایجاد این نوع از PDBها، تا قبل از نسخه 23ai صرفا می توانستیم از دستور CREATE PLUGGABLE DATABASE استفاده کنیم اما در نسخه 23ai این کار از طریق ابزار DBCA هم قابل انجام است.

برای ایجاد Refreshable PDB سه گزینه جدید به DBCA اضافه شده است:

createAsRefreshablePDB: برای ایجاد Refreshable PDB باید این گزینه به TRUE تنظیم شود.

refreshMode: نحوه بروزرسانی PDB می تواند AUTO و یا MANUAL باشد.

refreshInterval : بازه زمانی بروزرسانی هم با این گزینه قابل تنظیم است.

(بیشتر…)

اوراکل 23ai- بهبودی در ویوهای دیکشنری در زمینه پارتیشن بندی

در ویوهای دیتا دیکشنری مرتبط با مبحث Partitioning، ستون HIGH_VALUE از ستونهای پرکاربرد است دیتاتایپ این ستون از نوع Long می باشد و با توجه به محدودیتهای نوع داده Long، اوراکل در نسخه 23ai، دو ستون دیگر از نوع داده JSON و CLOB برای نمایش HIGH VALUE اضافه کرده است.

SQL> create table tb(
  2    id  number,
  3    date_ date
  4  )
  5  partition by range ( date_ )
  6  interval ( numtoyminterval(1,'YEAR'))
  7  (
  8   PARTITION p2022 VALUES LESS THAN (TO_DATE('2023/01/01', 'YYYY/MM/DD')),
  9   PARTITION p2023 VALUES LESS THAN (TO_DATE('2024/01/01', 'YYYY/MM/DD')),
 10   PARTITION p2024 VALUES LESS THAN (TO_DATE('2025/01/01', 'YYYY/MM/DD'))
 11  );
Table created

برای نمایش High Value به فرمت clob می توان از ستون high_value_clob استفاده کرد:

SQL> select partition_name, high_value_clob from user_tab_partitions where  table_name = 'TB' order by 1;
PARTITION_NAME       HIGH_VALUE_CLOB                                          
-------------------- -------------------------------------------------------- 
P2022                TO_DATE(' 2023-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 
P2023                TO_DATE(' 2024-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS' 
P2024                TO_DATE(' 2025-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'

همچنین ستون HIGH_VALUE_JSON این اطلاعات را به صورت JSON نمایش خواهد داد:

SQL> select partition_name,HIGH_VALUE_JSON  from user_tab_partitions where  table_name = 'TB' order by 1;
PARTITION_NAME       HIGH_VALUE_JSON
-------------------- ---------------------------------------------------------
P2022                {"high_value":"2023-01-01T00:00:00"}
P2023                {"high_value":"2024-01-01T00:00:00"}
P2024                {"high_value":"2025-01-01T00:00:00"}