آموزش PL/SQL قسمت یازدهم – EXCEPTION و EXCEPTION-HANDLER در اوراکل PL/SQL

در این قسمت EXCEPTION و روش استفاده از EXCEPTION-HANDLER را توضیح می دهیم. منظور از EXCEPTION رخداد خطا در زمان اجرای برنامه است. برای مثال به دنبال اطلاعاتی هستیم که در دیتابیس وجود ندارند یا یک ورودی اشتباه به زیربرنامه ارسال می کنیم.

زبان PL/SQL با استفاده از بلاک EXCEPTION-HANDLER به برنامه نویس کمک می کند تا نوع EXCEPTION برنامه را متوجه شود و در زمان رخداد آنها دستورات مناسب را اجرا کند.

(بیشتر…)

انجام query rewrite با استفاده از DBMS_ADVANCED_REWRITE

فرض کنید پرس و جوی زیر یکی از پرس و جوهای پراستفاده برنامه می باشد که به دلیل عدم دسترسی به سورس کد برنامه امکان تغییر متن آن وجود ندارد:

SQL>  select /*+INDEX(tbl1,IND_CODE)*/ count(*) from tbl1 where code=2 ;

  COUNT(*)

———-

  51199980

Elapsed: 00:00:05.23

همانطور که می بینید، این پرس و جو حدودا در زمان 4 ثانیه اجرا شده است با برداشتن HINTای که در این پرس  و جو موجود است، آن را مجددا اجرا می کنیم:

SQL> select count(*) from tbl1 where code=2 ;

  COUNT(*)

———-

  51199980

Elapsed: 00:00:01.60

مشاهده می کنید که زمان اجرای پرس و جو با برداشتن HINT از 5 ثانیه به 1 ثانیه کاهش پیدا کرده است قصد داریم با هر بار اجرای پرس و جوی اول، دیتابیس به صورت خودکار پرس و جوی دوم(که فاقد HINT است) را اجرا کند به عبارتی دیگر، دیتابیس در پس زمینه query rewrite را انجام دهد.

(بیشتر…)

استفاده از 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

نکته ای در مورد 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 ثانیه(حدودا) اجرا شده است:

 

GLOBAL TEMPORARY TABLE در دیتابیس اوراکل

گاهی اوقات در اجرای دستورات پیچیده SQL نیاز به نگه داری موقت اطلاعات برای محاسبه نتایج نهایی می باشد که می توان در این مواقع از جدول های TEMPORARY در دیتابیس اوراکل کمک گرفت. استفاده از این جدول ها می تواند سبب افزایش سرعت اجرای دستورات SQL شود. این جداول با نام مخفف GTT(GLOBAL TEMPORARY TABLE) شناخته می شوند.

(بیشتر…)

دو راهکار برای اجرای سریع تر shutdown immediate

همانطور که می دانید، در هنگام اجرای دستور shutdown immediate، بک گراند پروسس SMON باید تراکنشهای در حال اجرا را rollback کند و همچنین این بک گراند پروسس، Temporary segmentها را در صورت وجود پاکسازی کند.

برای تسریع در اجرای دستور shutdown immediate، می توان از طریق eventای؛ SMON را از انجام این دو وظیفه منصرف نمود و انجام آنها را به بعد از استارت بعدی دیتابیس موکول کرد.

(بیشتر…)

نصب اوراکل 19c بر روی اوراکل لینوکس 6 با بروزرسانی GLIBC

همانطور که می دانید، اوراکل از نصب نسخه 19c بر روی سیستم عامل Oracle Linux 6.X پیشتیانی نمی کند این مسئله به پایین بودن نسخه GLIBC(GNU libc) موجود در این نسخه از سیستم عامل برمی گردد:

 [root@ol6 ~]# cat /etc/issue

Oracle Linux Server release 6.7

[oracle@ol6 home]$ ./runInstaller

/19c/home/perl/bin/perl: /lib64/libc.so.6: version `GLIBC_2.14′ not found (required by /19c/home/perl/bin/perl)

در متن خطا می بینیم که این مشکل به دلیل نبود GLIBC نسخه 2.14 رخ داده است. برای حل این مسئله، می توان GLIBC_2.14(و یا نسخه های بالاتر) را به این نسخه از سیستم عامل اضافه کرد که در ادامه این کار را انجام خواهیم داد.

(بیشتر…)

External Table و In-Memory – اوراکل 18c

تا قبل از اوراکل 18c، امکان استفاده از قابلیت in memory برای جداول از نوع external وجود نداشت:

SQL*Plus: Release 12.2.0.1.0 Production on Mon May 18 12:05:36 2020

SQL> alter table mytbl inmemory;

ORA-30657: operation not supported on external organized table

این قابلیت در اوراکل 18c برای محیط exadata ارائه شد.

Connected to Oracle Database 18c Enterprise Edition Release 18.0.0.0.0

 SQL> alter table mytbl inmemory;

ORA-12755: Feature In-Memory External Tables is disabled due to unsupported capability.

SQL> alter system set “_exadata_feature_on”=true scope=spfile;

System altered.

SQL> startup force;

SQL> alter table mytbl inmemory;

Table altered

SQL> SELECT table_name, inmemory, inmemory_compression FROM user_external_tables;

TABLE_NAME   INMEMORY    INMEMORY_COMPRESSION

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

MYTBL        ENABLED        FOR QUERY LOW

(بیشتر…)