مقایسه دو مقدار JSON به کمک تابع JSON_EQUAL – اوراکل 18c

اگر دو ستون حاوی اطلاعات JSON را با عملگرهای = و != با هم مقایسه کنیم، این مقایسه صرف نظر از محتوا و بر اساس فرمت اطلاعات انجام خواهد شد برای مثال اطلاعات JSON زیر، محتوای یکسانی دارند اما به دلیل خطوط فاصله بعد از فیلد last_name، فرمت یکسانی ندارند:

SQL>  select count(*)

  from dual

 where ‘{“first_name“:”vahid”,”last_name“:“usefzadeh”}’ =

            ‘{“first_name“:”vahid”,”last_name“:       “usefzadeh”}’;

  COUNT(*)

——–

     0

(بیشتر…)

JSON و دیتابیس اوراکل

از نسخه 12cR1، دیتابیس اوراکل از JSON پشتیبانی می کند به این معنی که با ارائه چندین تابع، امکان انجام عملیاتی چون اجرای query، ایجاد index و ایجاد view بر روی JSON Document را فراهم می سازد به طور مثال می توان با کمک این قابلیت، برای هر یک از فیلدهای موجود در JSON Document ایندکس گذاری کرد.

البته در این نسخه Data Type جدیدی برای JSON معرفی نشده و JSON Documentها باید در نوع داده VARCHAR2، CLOB و یا BLOB ذخیره شوند(نوع داده NCLOB و NVARCHAR2 را هم باید به این مجموعه اضافه کرد) که معمولا نوع داده BLOB برای این کار توصیه می شود.

توجه 1: برای کار با JSON در نسخه های قبلی اوراکل(مثل 11g) هم راهکارهای وجود دارد که یکی از این راهکارها نصب کامپوننت APEX و استفاده از APEX_JSON می باشد.

توجه 2: اوراکل در نسخه 20c نوع داده JSON را برای ذخیره JSON Documentها ارائه کرده است.

(بیشتر…)

نمایش اطلاعات JSON به ساختار رابطه ای(تابع JSON_TABLE)

برای نمایش اطلاعات JSON به صورت relational و همچنین map کردن elementهای استفاده شده در JSON Documentها به یک نوع داده مشخص، می توان از تابع JSON_TABLE استفاده کرد.

به عنوان مثال، در ادامه خواهیم دید که چگونه می توان با کمک تابع JSON_TABLE برای هر کدام از elementهای موجود در JSON Document  جدول myt، نوع داده ای تعریف کرد و این اطلاعات را با ساختار رابطه ای نمایش داد.

(بیشتر…)

نمایش اطلاعات relational به صورت JSON(تابع JSON_OBJECT)

قصد داریم اطلاعات موجود در جدول non_JSON_tbl را به فرمت JSON نمایش دهیم:

SQL> create table non_JSON_tbl(id number,first_name varchar2(100),Last_Name varchar2(100),Email varchar2(100),phone number(12));

Table created

SQL> insert into non_JSON_tbl values(1,’Vahid’,’Usefzadeh’,’vahidusefzadeh@gmail.com’,’09128110897′);

1 row inserted

SQL> commit;

Commit complete

برای این کار می توانیم از تابع JSON_OBJECT استفاده کنیم:

SELECT id,

       JSON_OBJECT(KEY ‘Name‘ VALUE t.first_name,

                   KEY ‘LastName‘ VALUE t.Last_Name) JSON_CONVERT

  FROM non_JSON_tbl t;

        ID           JSON_CONVERT

———- —————————————–

         1 {“Name”:”Vahid”,”LastName”:”Usefzadeh”}

برای نمایش خروجی در دو ستون مجزا می توان کوئری را به صورت زیر نوشت:

SELECT id,

       JSON_OBJECT(KEY ‘Name‘ VALUE t.first_name) JSON_CONVERT1,

       JSON_OBJECT(KEY ‘LastName‘ VALUE t.Last_Name) JSON_CONVERT2

  FROM non_JSON_tbl t;

ID JSON_CONVERT1     JSON_CONVERT2

— —————–               ————————–

  1 {“Name”:”Vahid”}  {“LastName”:”Usefzadeh”}

استفاده از Unified auditing در حالت read only و محیط دیتاگارد

همانطور که می دانید، زمانی که دیتابیس در حالت read only قرار دارد امکان ثبت اطلاعات در جداول دیتادیکشنری از بین خواهد رفت این قاعده برای جداول مربوط به auditing(نظیر aud$unified) هم صادق است از اینرو نمی توان عملیات انجام شده توسط کاربران را در دیتابیس ذخیره کرد.

در این شرایط، در صورت استفاده از قابلیت Unified auditing، اوراکل auditهای انجام شده را در محیط سیستم عامل ثبت خواهد کرد.

عملیات انجام شده توسط کاربران در قالب فایلهای باینری، با پسوند bin. و در مسیر ORACLE_BASE/audit/$ORACLE_SID$ ثبت خواهند شد و امکان مشاهده محتویات این فایلهای باینری از طریق ویوی unified_audit_trail فراهم می شود.

(بیشتر…)

خارج کردن اطلاعات یک دستور از shared pool

ممکن است در شرایطی بخواهید صرفا فرم پارس شده یکی از دستورات را از حافظه خارج کنید، در این صورت می توانید از بسته DBMS_SHARED_POOL.PURGE استفاده کنید.

SQL>select ADDRESS, HASH_VALUE,sql_text from V$SQLAREA where  SQL_TEXT like ‘%delete mytbl where %’ and SQL_TEXT not like ‘%v$sql%’;

SQL> exec sys.DBMS_SHARED_POOL.PURGE ‘00000000774B91E0,3503309987′,’C’);

PL/SQL procedure successfully completed


SQL>select ADDRESS, HASH_VALUE,sql_text from V$SQLAREA where  SQL_TEXT like ‘%delete mytbl where %’ and SQL_TEXT not like ‘%v$sql%’;

no rows selected

توجه: پارامتر دوم در پروسیجر Purge(کارکتر C)، به نوع object اشاره دارد که علامت اختصاری objectها را در قسمت زیر می بینید:

–P   package/procedure/function        –JS   java source

–Q  sequence                                        –JC    java class

–R  trigger                                             –JR     java resource

–T  type                                                 –JD     java shared data

KEEP AUXILIARY در اوراکل 19c

همانطور که می دانید ایجاد دستی و یا خودکار Auxiliary Instance در زمان انجام عملیاتی چون Duplicate، PDB Point-in-Time Recovery، Table Point-in-Time Recovery و … الزامی می باشد البته با انجام هر کدام از این عملیاتها، Auxiliary Instance حذف خواهد شد و امکان استفاده از استفاده از این instance به صورت کلی از بین خواهد رفت.

(بیشتر…)

نکته ای در مورد elapsed_time برای parallel queyها

در گزارش AWR و همچنین ویوهایی نظیر V$SQLه، elapsed_timeای که برای parallel queryها نمایش داده می شود، جمع بین زمان سپری شدهquery coordinator و parallel query slaveها می باشد از این جهت، نباید این عدد را با elapsed_time واقعی پرس و جو اشتباه گرفت.

مثال زیر را ببینید:

SQL> select /*+parallel(3)*/ sum(id),sum(code),avg(count) from usef.myview;

   SUM(ID)  SUM(CODE) AVG(COUNT)

———- ———- ———-

 713031680 3548381184 68.1508522

Elapsed: 00:01:18.89

SQL> /

   SUM(ID)  SUM(CODE) AVG(COUNT)

———- ———- ———-

 713031680 3548381184 68.1508522

SQL> /

Elapsed: 00:01:17.08

SQL> /

   SUM(ID)  SUM(CODE) AVG(COUNT)

———- ———- ———-

 713031680 3548381184 68.1508522

Elapsed: 00:01:17.94

پس از اجرای دستورات فوق، در گزارش AWR خواهیم دید که Elapsed Time برای query اجرا شده برابر با 228 ثانیه می باشد در صورتی که این query در مدت زمان80 ثانیه(حدودا) اجرا شده است:

 

زبان های SQL و PL/SQL و تفاوت آنها

SQL(مخفف STRUCTURED QUERY LANGUAGE) یک زبان قدرتمند ولی ساده برای کار با بانک های اطلاعاتی است. SQL در ابتدا توسط شرکت IBM پیاده سازی شده است. در ادامه موسسه جهانی استاندارد، زبان SQL را به عنوان یک زبان رابطه ای برای کار با دیتابیس های از نوع رابطه ای تعیین کرده است. بنابراین زبان SQL به طور کامل مطابق با استانداردهای جهانی است.

(بیشتر…)