در این متن قصد داریم نحوه نصب Oracle APEX 22.1 را در دیتابیس نسخه 21c و در محیط لینوکس شرح دهیم. برای این کار نیاز است تا مراحل زیر را طی کنیم:
1.نصب اوراکل لینوکس(نسخه 8)
2.نصب و آماده سازی اوراکل(نسخه 21c)
3.نصب APEX
4.نصب ORDS
……….آموزش، مشاوره و پشتیبانی……….
در این متن قصد داریم نحوه نصب Oracle APEX 22.1 را در دیتابیس نسخه 21c و در محیط لینوکس شرح دهیم. برای این کار نیاز است تا مراحل زیر را طی کنیم:
1.نصب اوراکل لینوکس(نسخه 8)
2.نصب و آماده سازی اوراکل(نسخه 21c)
3.نصب APEX
4.نصب ORDS
در متن “JSON و دیتابیس اوراکل” توضیح دادیم که چگونه اوراکل در نسخه 12c امکان ذخیره و کنترل اطلاعات JSON را در قالب دیتاتایپ CLOB، varchar و … فراهم کرده است و همچنین مطالبی را در مورد نحوه ایندکس گذاری کلیدهای JSON ارائه کرده ایم(برای مطالعه). در نسخه 21c بهبودهای دیگری نظیر نوع داده JSON، تابع JSON_TRANSFORM و … هم به این مجموعه قابلیتها اضافه شد که قبلا بعضی از آنها را مستند کرده ایم و در این متن قصد داریم در مورد یکی دیگر از این قابلیتها که JSON Multi value index است، نکاتی را بنویسیم.
می دانیم که قرار نیست ما به ازای هر کلید در JSON، صرفا یک مقدار ذخیره شود و در مواردی ممکن است مقدار یک کلید، یک آرایه(یا همان لیست) باشد. در این شرایط استفاده از روشهای قبلی ایندکس گذاری برای جستجو چندان کارآمد نخواهند بود و باید به دنبال روش جدیدی برای این حالت باشیم. در ادامه با ارائه مثالی، بیشتر این موضوع را توضیح خواهیم داد.
در نسخه 12c، اوراکل با ارائه تابع STANDARD_HASH، امکان محاسبه hash value را برای یک فیلد و یا عبارت فراهم کرده است:
SQL> select id,salary,substr(STANDARD_HASH(id||salary),1,20) hash_id_sal from tbl1;
ID SALARY HASH_ID_SAL
---------- ---------- ----------------------
1 10 5E796E48332AF4142B10
2 12 E2154FEA5DA2DD0D1732
3 17 F44A286F486D11990238
4 18 93AC1946CB917ABC4735
با این روش می توانیم از تغییر مقدار سطرهای جدول باخبر شویم. البته در نسخه های قبل از 12c هم می توانستیم از توابع دیگری نظیر ora_hash بدین منظور استفاده کنیم:
SQL> select id,salary,ora_hash(id||salary) hash_id_sal from tbl1;
ID SALARY HASH_ID_SAL
---------- ---------- -----------
1 10 3316966336
2 12 1402677848
3 17 3795753203
4 18 936769390
در نسخه 21c هم قابلیت جدیدی در این زمینه ارائه شد و اوراکل با معرفی تابع checksum، امکان شناسایی تغییر دیتا را در سطح ستون فراهم کرده است.
تا قبل از نسخه 21c، صرفا می توانستیم از سه عملگر مجموعه ای INTERSECT، MINUS و UNION [ALL] در اوراکل استفاده کنیم اما در نسخه 21c دو عملگر جدید EXCEPT و EXCEPT ALL به این مجموعه اضافه شدند که این دو عملگر معادل عملگرهای MINUS و MINUS ALL هستند و صرفا به دلیل استفاده از عبارتهای EXCEPT و EXCEPT ALL در دیتابیسهای دیگر، اوراکل هم این دو عملگر را به مجموعه عملگرهای خود اضافه کرده است.
مجددا تاکید می شود که در عمل تفاوتی بین EXCEPT و MINUS وجود ندارد و حتی در صورت استفاده از عملگر EXCEPT، اوراکل در زمان اجرای پرس و جو، در مرحله Query Transformation، عملگر EXCEPT را به MINUS تبدیل می کند.
با این توضیحات، در شرایط زیر، برای برگرداندن رکوردهایی که در t1.c1 وجود دارند اما در t2.c1 وجود ندارد(با حذف رکوردهای تکراری!!) دو انتخاب داریم، عملگرEXCEPT و عملگر MINUS:

select t1.c1 from t1 MINUS select t2.c1 from t2; D Z select t1.c1 from t1 EXCEPT select t2.c1 from t2; D Z
اوراکل در نسخه 19c اجازه نمی دهد که یک pdb را به زمانی از یک ORPHAN incarnation برگردانیم:
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Apr 21 08:28:57 2022
Version 19.3.0.0.0
SQL> SELECT con_id, status, pdb_incarnation# inc#, begin_resetlogs_scn, end_resetlogs_scn FROM v$pdb_incarnation ORDER BY 3;
CON_ID STATUS INC# BEGIN_RESETLOGS_SCN END_RESETLOGS_SCN
---------- ------- ---------- ------------------- -----------------
3 PARENT 0 1920977 1920977
3 ORPHAN 1 1963437 1963437
3 CURRENT 2 1964176 1964176
SQL> alter pluggable database pdb1401 close;
Pluggable database altered.
SQL> flashback pluggable database to scn 1962565;
ORA-39889: Specified System Change Number (SCN) or timestamp is in the middle of a previous PDB RESETLOGS operation.
SQL> flashback pluggable database PDB1401 to scn 1963437;
ORA-39889: Specified System Change Number (SCN) or timestamp is in the middle of a previous PDB RESETLOGS operation.
[oracle@stb ~]$ rman target sys/sys@192.168.1.20:1521/pdb1401
RMAN> reset pluggable database pdb1401 to incarnation 1;
'RMAN-07536: command not allowed when connected to a Pluggable Database'
اما در نسخه 21c این قابلیت به وجود آمد تا بتوان یک PDB را به هر زمانی در گذشته برگرداند(البته گذشته نزدیک). در ادامه با سناریوی زیر و با ایجاد یک ORPHAN incarnation بیشتر با این فیچر را آشنا خواهیم شد.
ANY_VALUE تابع جدیدی است که در اوراکل 21c معرفی شده و البته در Release Updateهای انتهایی اوراکل نسخه 19c(یعنی از 19.8 به بالا) هم قابل استفاده است. در متن پیش رو با این تابع آشنا خواهیم شد.
*پرس و جوی زیر در pdb1 اجرا می شود و قرار است مشخص کند هر tablespace چند دیتافایل دارد:
select t.ts#, t.name, count(*) "Tedad_DataFile" from v$datafile d, v$tablespace t where t.ts# = d.ts# group by t.ts#, t.name;

همانطور که مشاهده می کنید، در پرس و جوی فوق هر دو ستون ts# و name در قسمت group by قید شده اند در صورتی که عدم درج ستون name در قسمت group by، تغییری در خروجی ایجاد نمی کند اما اوراکل اجازه این کار را به ما نمی دهد:
ORA-00979: not a GROUP BY expression
در محیط Container Database می توان در سطح هر containerء، از Time Zone به خصوصی استفاده کرد این امکان در نسخه 12cR1 هم وجود داشت. اسامی Time Zoneها از طریق ویوی V$TIMEZONE_NAMES قابل مشاهده است و با دستور “ALTER DATABASE SET TIME_ZONE” می توان Time Zone دلخواه را برای هر PDB تنظیم کرد:
SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tel_Aviv'; Database altered. SQL> alter session set container=IranPdb; Session altered. SQL> ALTER DATABASE SET TIME_ZONE='Asia/Tehran'; Database altered. SQL> alter session set container=cdb$root; Session altered. SQL> startup force; SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> SELECT dbtimezone FROM DUAL; DBTIMEZONE ------------- 'Asia/Tel_Aviv' SQL> alter session set container=IranPdb; Session altered. SQL> SELECT dbtimezone FROM DUAL; DBTIMEZONE ----------- 'Asia/Tehran'
به عنوان یک قابلیت جدید در اوراکل 12cR1 می توانستیم در زمان برگرداندن دامپ خصوصیت فشرده سازی را برای جداول فعال/غیرفعال کنیم. این کار از طریق پارامتر TRANSFORM در دستور impdp قابل انجام است:
SQL*Plus: Release 12.2.0.1.0 Production SQL> select compression from dba_tables where table_name = 'TBL1'; COMPRESS -------- DISABLED SQL> drop table usef.tbl1; Table dropped. [oracle@oshost ~]$ impdp usef/a directory=drm dumpfile=test.dmp tables=usef.tbl1 TRANSFORM=TABLE_COMPRESSION_CLAUSE:\"ROW STORE COMPRESS ADVANCED\" SQL> select compression,COMPRESS_FOR from dba_tables where table_name = 'TBL1'; COMPRESS COMPRESS_FOR -------- ------------------------------ ENABLED ADVANCED
قابلیت unified auditing در اوراکل نسخه 21c، عملیات auditing را برای همه editionهای یک object امکان پذیر می سازد و حتی اگر در آینده edition جدیدی ایجاد شود، auditing در سطح edition جدید هم اعمال خواهد شد. برای مثال، ویوی vw_IRIR را در دو edition مختلف ایجاد می کنیم:
SQL> alter session set edition=IR_EDITION1; Session altered SQL> CREATE EDITIONING VIEW vw_IRIR AS select * from usef.tbl1; View created SQL> alter session set edition=IR_EDITION2; Session altered SQL> CREATE OR REPLACE EDITIONING VIEW vw_IRIR AS select owner from usef.tbl1; View created SQL> select object_name, edition_name from user_objects_ae where object_name='VW_IRIR'; OBJECT_NAM EDITION_NAME ---------- -------------- VW_IRIR IR_EDITION1 VW_IRIR IR_EDITION2
از اوراکل 21c، همه پسوردها در پسوردفایل به صورت case-sensitive ذخیره می شوند در صورتی که تا قبل از این نسخه می توانستیم با کمک پارامتر IGNORECASE در دستور orapwd، این ویژگی را غیرفعال کنیم.
اوراكل 19c:
[oracle@linux7 dbs]$ orapwd file=/oracle19c/home/dbs/orapwtajmifullssd sys=Y force=Y format=12 ignorecase=Y password=EST_est_123
[oracle@linux7 dbs]$ sqlplus “sys/est_est_123@linux7:1521/pdb1 as sysdba”
SQL*Plus: Release 19.0.0.0.0 – Production on Thu Nov 11 08:59:55 2021
Version 19.11.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.11.0.0.0
SQL>