PL/SQL در مقابل SQLj: مقایسه‌ی سرعت در عملیات‌های ریاضی

اوراکل از زمان اوراکل 8i یک ماشین مجازی جاوا را به عنوان بخشی از پایگاه داده‌اش منتشر کرده است. خاطرم هست که چند سال پیش از کسی شنیدم که می‌گفت JVM اوراکل از PL/SQL در اجرای عملیات‌های ریاضی سریع‌تر است، اما هیچوقت به این گفته به شکل جدی نگاه نکردم. در این نوشته من یک مقایسه‌ی تطبیقی بر مبنای چند عملیات ریاضی پایه میان JVM اوراکل و PL/SQL انجام می‌دهم.
توجه کنید که من یک برنامه‌نویس PL/SQL هستم و از همین دید به قضیه نگاه می‌کنم. دلیل اینکه تمام آزمایش‌ها هم از PL/SQL فراخوانده شده‌اند همین است.

ادامه مطلب...
۰۸ ارديبهشت ۹۴ ، ۱۷:۱۶ ۰ نظر
مهدی غفاری

FTP از PL/SQL

گاهی اوقات بهتر است که کارهای FTP را بجای تکیه‌کردن بر بروی CRON یا AT، مستقیما از PL/SQL آغاز کنید.

شل اسکریپت

روش اول بر روی فرآیندی بر پایه‌ی جاوا اتکا دارد که می‌تواند برای آغاز کردن یک شل اسکریپت، و به طبع آن اجرا کردن فرآیندی انتقالی، به‌کار گرفته شود. این روش در دستورهای شل از  PL/SQL توضیح داده شده است. شل اسکریپت ممکن است شبیه چیزی باشد که به دنبال می‌آید:

#! /bin/ksh

# Move to appropriate directory on local server
cd /extracts

# FTP all files in directory
ftp -inv ftp.company.com <<EOF
user ftpuser ftppassword
# Move to appropriate directory on remote server.
cd /loads
ascii
mput *.*
bye
EOF

ادامه مطلب...
۰۸ ارديبهشت ۹۴ ، ۱۷:۱۱ ۰ نظر
مهدی غفاری

نحوه اختصاص‌دادن مستقیم role‌ها به برنامه‌های PL/SQL در اوراکل ۱۲c

کنترل دسترسی به شکل کد-مبنا (CBAC):

اختصاص‌دادن نقش به واحدهای برنامه‌نویسی PL/SQL در پایگاه داده‌ اوراکل 12.1

به طور پیش‌فرض: واحدهای برنامه‌نویسی PL/SQL با استفاده از اختیارات تعریف‌کننده‌ها ساخته می‌شوند و به همین خاطر هم با تمام اجازه‌ای که دارند، مستقیما به کاربری که آن‌ها را به‌وجود آورده، داده می‌شوند. چنین چیزی در زمانی که می‌خواهید کاری با اجازه بالا را به کاربری با اجازه پایین واگذار کنید، بسیار مفید خواهد بود. در این مواقع می‌توان کارها را در لفاف یه واحد برنامه‌ای PL/SQL پوشاند، و همراه با آن، اجازه اجراکردن آن را به کاربری با اجازه پایین اختصاص‌داد. مشکل تعریف‌کننده‌های اختیارات این است که خیلی ساده می‌توان اجازه‌ی بیش از حد به یک کاربر اختصاص‌داد.

ادامه مطلب...
۰۸ ارديبهشت ۹۴ ، ۱۷:۰۴ ۱ نظر
مهدی غفاری

رفع مشکل IO ERROR در SQL Developer

اگر بعد از اجرای SQL Developer هنگام اتصال به اوراکل به پیغام خطای زیر برخوردید مراحل را دنبال کنید:

An error was encountered performing the requested operation:

IO ERROR: The Network Adapter could not establish the connection.

Vendor code 17002

ادامه مطلب...
۰۸ ارديبهشت ۹۴ ، ۱۴:۴۰ ۱ نظر
مهدی غفاری

جستجوی انعطاف‌پذیر

نکته: دیتابیس اوراکل قابلیت PREPARE STATEMENT رو ساپورت میکنه

هرگاه بخواهیم در دستور SELECT خود، از کاربر ورودی دریافت نماییم، از & استفاده می‌کنیم. برای این مثال، از جدول PERSON استفاده خواهیم‌کرد.

دستور زیر تمام رکورد‌های جدول PERSON را به شرطی که فیلد NAME آن مساوی با ورودی کاربر باشد لیست می‌کند. دقت داشته باشید، بعد از اجرای کوئری پایگاه‌داده از شما مقدار ورودی را خواهد پرسید، به دستور زیر توجه کنید:

در پرس‌وجوی فوق از کاربر ورودی گرفته می‌شود، سپس جستجو در جدول PERSON آغاز می‌گردد و در انتها خروجی را به کاربر نمایش می‌دهد:

SELECT * FROM T5 WHERE AGE = &PLEASE_ENTER_YOUR_AGE;
ENTER VALUE FOR PLEASE_ENTER_YOUR_AGE: 10
AGE NAME
---- ------------
10 HOSSEIN

حالا می‌خوام INJECT کنم، می‌بینید که INJECT را قبول میکنه!!

SELECT * FROM T5 WHERE AGE = &PLEASE_ENTER_YOUR_AGE;
ENTER VALUE FOR PLEASE_ENTER_YOUR_AGE: 10 OR 1=1
AGE NAME
---- ----------
50 HAMID
20 AKBAR
10 HOSSEIN
30 HOSSEIN
15 AKBAR

در حقیقت عمل prepare statement‌ هم همینه یعنی پارامترها جدا میره سمت دیتابیس و دستور sql جدا میره سمت دیتابیس

نکته: من از قصد علامت & رو گذاشتم تا SQL INJECT رو قبول کنه ولی در فصل‌های آینده به این موضوع می‌رسیم که چجوری جلوی INJECT را در PREPARE STATEMENT بگیریم و دیگه دستور SQL رو به عنوان ورودی نگیره(پشت & یه علامت دیگه می‌ذاریم):

۰۱ ارديبهشت ۹۴ ، ۲۰:۵۵ ۰ نظر
مهدی غفاری

نحوه ذخیره تاریخ و زمان در جدول

به دستورات زیر دقت کنید:

SQL> CREATE TABLE MYDATE(BIRTHDATE DATE);
Table created.
SQL> INSERT INTO MYDATE VALUES (TO_DATE('22/09/14','DD/MM/YY'));
1 row created.
SQL> SELECT * FROM MYDATE;
BD
-------
22-SEP-14
SQL> ALTER SESSION SET NLS_CALENDAR='PERSIAN';
session altered
SQL> SELECT * FROM MYDATE;
BIRTHDATE
------------------
31 SHAHRIVAR 1393

ادامه مطلب...
۰۱ ارديبهشت ۹۴ ، ۱۸:۴۹ ۲ نظر
مهدی غفاری

توابع تاریخ و زمان

خیلی خوشحال می‌شدم تو این نوشته‌ها یه جاوای درست و حسابی هم میگفتم که باهم وارد jdbc بشیم و برخورد jdbc با type date رو بررسی کنیم. چون همیشه تو برنامه‌نویسی جاوا برنامه‌نویس‌ها تاریخ و زمان رو یا string می‌گیرن یا long، همیشه هم تو سطح اوراکل همه چیز رو اونجوری که دوست دارن می‌گیرن (البته اگه دیتابیس دست خودشون باشه)، به هر حال یه نقطه‌ای باید باشه که این ۲ تا رو به طور صحیح به هم وصل کنه.

جدول زیر در این پست مفروض است:

END_DATE START_DATE
02-May-90 02-May-89
10-May-89 04-May-89
10-May-90 04-May-89
04-Apr-89 04-Apr-89
04-May-89 04-Apr-89
10-May-89 04-Apr-89
10-May-91 04-Apr-89

این جدول T_DATE نام دارد. نوع داده‌های این جدول شامل موارد زیر می‌باشد.

  • فیلد START_DATE از نوع DATE
  • فیلد END_ DATE از نوع DATE

ادامه مطلب...
۰۱ ارديبهشت ۹۴ ، ۱۶:۰۹ ۶ نظر
مهدی غفاری

جدول DUAL

DUAL جدولی مجازی است که یک فیلد به نام DUMMY دارد. در هر کجا اگر جدول خاصی برای انتخاب وجود نداشته باشد، شما می‌توانید از جدول DUAL استفاده کنید.

به جای استفاده از جدول DUAL می‌توان از جدول‌های دیگه هم استفاده کرد(هر جدولی که دارای رکورد باشه) به طور دقیق هم همون کار DUAL را برای ما انجام می‌دهد ولی برای کارهای موقتی بهتره از جدول DUAL استفاده شود(شما می‌توانید خودتان هم به طور دستی یک جدول با یک فیلد برای کارهای TMP بسازید)

SELECT 2+2 FROM DUAL;

همان‌طور که در زیر می‌بینید جوابی که از این جدول مجازی یا هر جدول دیگری برای کارهای موقت ما بدست می‌آید 4 است.

2+2
----------
4
۰۱ ارديبهشت ۹۴ ، ۱۴:۴۰ ۰ نظر
مهدی غفاری

توابع پردازش رشته - LENGTH

این تابع طول یک رشته را بر می‌گرداند. به مثال زیر توجه نمایید.

SELECT NAME, LENGTH(NAME) FROM PERSON;

در دستور فوق بوسیله‌ی تابع LENGTH، طول داده‌های فیلد NAME از جدول PERSON را به دست می‌آوریم. پاسخ را در زیر مشاهده می‌کنید.

NAME     LENGTH(NAME)
-------- -------------
MOHAMMAD 8
MAHDI 5
MOHSEN 6
FARZAD 6
EHSAN 5

ادامه مطلب...
۰۱ ارديبهشت ۹۴ ، ۱۴:۳۴ ۰ نظر
مهدی غفاری

توابع ریاضی - Ceil, Floor, Round

CEIL

این تابع، یک عدد را به عدد بزرگتر بعد از آن گرد می‌کند. به مثال زیر، که به کارگیری این تابع را نشان می‌دهد، توجه کنید.

SELECT A,CEIL(A) FROM NUM_TEST;

همان‌گونه که در زیر مشاهده می‌کنید، داده‌های فیلد A، به عدد بزرگتر از خود گرد شده‌اند.

A      CEIL(A)
------ --------------
-5.65 -5
6.1 7
11 11
.33 1
-10 -10
1.598 2

ادامه مطلب...
۰۱ ارديبهشت ۹۴ ، ۱۴:۱۰ ۰ نظر
مهدی غفاری