مارا دنبال کنید : 

تصویر هدر ویونا

Loop

توضیحات
در اوراکل Loop این امکان را می‌دهد که قطعه کدی به تعداد نامشخص تکرار شود که شرط پایان اجازه نمی‌‌دهد از قبل بدانیم تعداد تکرار حلقه به چه تعداد است.
دستور
دستور برای Loop به صورت زیر نوشته می‌شود:
1
2
3
LOOP
   {...statements...}
END LOOP;
statements: دستوری است که در صورت اجرای حلقه در هر بار اجرا می‌شود.    
مثال
مثال‌هایی از اجرای حلقه:
1
2
3
4
LOOP
   monthly_value := daily_value * 31;
   EXIT WHEN monthly_value > 4000;
END LOOP;

While Loop

توضیحات
Loop while حلقه‌ای است که تا زمان برقرار بودن شرط ادامه می‌یابد.
دستور
دستور برای While Loop به صورت زیر نوشته می‌شود:
1
2
3
4
WHILE condition
LOOP
   {...statements...}
END LOOP;
Condition: شرطی است که برای اجرای حلقه لازم است. statements: دستوری است که در صورت اجرای حلقه در هر بار اجرا می‌شود.  
مثال
مثال‌هایی از اجرای حلقه:
1
2
3
4
WHILE monthly_value <= 4000
LOOP
   monthly_value := daily_value * 31;
END LOOP;

GOTO

توضیحات
دستور GOTO این امکان را می‌دهد تا بعد از اجرای این دستور به قسمتی از کد که لیبل گذاری شده است برود.
دستور
دستور Goto شامل دو بخش است دستور goto و قسمت لیبل گذاری شده:
1
2
3
4
5
6
GOTO label_name;
.
.
.
<<label_name>>
 {...statements...}
   
مثال
مثالی از استفاده goto را می‌توان مشاهده کرد:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
CREATE OR REPLACE Function FindCourse
   ( name_in IN varchar2 )
   RETURN number
IS
   cnumber number;
   CURSOR c1
   IS
     SELECT MAX(course_number)
     FROM courses_tbl
     WHERE course_name = name_in;
BEGIN
   open c1;
   fetch c1 into cnumber;
   IF c1%notfound then
      GOTO default_number;
   ELSE
      GOTO increment_number;
   END IF;
<<default_number>>
   cnumber := 0;
<<increment_number>>
   cnumber := cnumber + 1;
   close c1;
RETURN cnumber;
END;

Exit

توضیحات
در اوراکل دستور exit اصولا برای خاتمه دادن به یک حلقه به کار می‌رود.
دستور
دستور برای While Loop به صورت زیر نوشته می‌شود:
1
2
3
4
WHILE condition
LOOP
   {...statements...}
END LOOP;
boolean_condition: گزینه‌ای اختیاری است برای پایان دادن به حلقه.  
مثال
مثالی از کاربرد Exit را مشاهده می‌کنیم:
1
2
3
4
LOOP
   monthly_value := daily_value * 31;
   EXIT WHEN monthly_value > 4000;
END LOOP;

Cursor for loop

توضیحات
از دستور cursor for loop برای fech کردن و انجام دستور به ازای همه رکوردهای یک cursor استفاده می‌شود.
دستور
دستور برای cursor for loop به صورت زیر نوشته می‌شود:
1
2
3
4
FOR record_index in cursor_name
LOOP
   {...statements...}
END LOOP;
record_index: ایندکس رکورد را نشان می‌دهد. cursor_name: نام cursor را نشان می‌دهد. Statements: دستوری که به ازای تمام رکوردها در cursor اجرا می‌شود.    
مثال
مثالی از یک تابع که از cursor for loop استفاده می‌کند:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE Function TotalIncome
   ( name_in IN varchar2 )
   RETURN varchar2
IS
   total_val number(6);
   cursor c1 is
     SELECT monthly_income
     FROM employees
     WHERE name = name_in;
BEGIN
total_val := 0;
   FOR employee_rec in c1
   LOOP
      total_val := total_val + employee_rec.monthly_income;
   END LOOP;
   RETURN total_val;
END;

Commit

توضیحات
دستور commit تمام تغییرات انجام شده را ثبت می‌کند. هنگامی که دستور commit صادر می‌شود دیگر یوزرها می‌توانند تغییرات اعمال شده را مشاهده کنند.
دستور
دستور commit به صورت زیر نوشته می‌شود:
1
COMMIT [ WORK ] [ COMMENT clause ] [ WRITE clause ] [ FORCE clause ];
WORK: گزینه‌ای اختیاری است، دستور commit با work و بدون آن یک نتیجه را می‌دهد. COMMENT: گزینه‌ای اختیاری است، با این گزینه می‌توان برای اجرای تراکنش پیامی را در دیتابیس ثبت کرد که این پیام در جدول DBA_2PC_PENDING ذخیره می‌شود به ازای شماره تراکنش. WRITE: گزینه‌ای اختیاری است، اولویت‌ها را برای نوشتن اطلاعات redo در Redo log مشخص می‌کند. یا این دستور باید دو پارامتر مشخص شود. Wait یا Nowait (wait به صورت دیفالت است): Wait : اگر این گزینه انتخاب شود به این معنی است که تراکنش تا زمانی که LGWR پیغام اینکه تمام تغییرات را از Redo log buffer به online redolog file انتقال داد صبر می‌کند. Nowait: تراکنش منتظر LGWR برای نشان دادن اینکه تمام تغیرات به دیسک منتقل شده است نمی‌ماند. Immediate یا Batch(Immediate به صورت دیفالت است): Immediate :Log buffer پیغام می‌دهد به online redo log برای انتقال داده‌ها. Batch: به مجموعه‌ای از دستورات commit به صورت واحد نگاه می‌کند و به صورت دسته‌ای نگاه می‌کند. FORCE: گزینه‌ای اختیاری است، که اجبار به commit کردن می‌کند در هر شرایطی  
مثال
مثال‌هایی از دستور commit را مشاهده می‌کنیم:
1
2
3
COMMIT;
COMMIT WORK WRITE WAIT IMMEDIATE;
COMMIT COMMENT 'This is the comment for the transaction';

Rollback

توضیحات
دستور rollback برای از بین بردن تمام تغییرات به کار می‌رود.
دستور
دستور Rollback به صورت زیر نوشته می‌شود:  
1
ROLLBACK [ WORK ] [ TO [SAVEPOINT] savepoint_name  | FORCE 'string' ];
. WORK: گزینه‌ای اختیاری است، دستور Rollback با work و بدون آن یک نتیجه را می‌دهد. TO SAVEPOINT savepoint_name: گزینه‌ای اختیاری است، با قرار دادن این گزینه تمام تغییرات تا جایی که Save_point قرار داد از بین می‌رود. FORCE: گزینه‌ای اختیاری است، که اجبار به Rollback کردن می‌کند در هر شرایطی.    
مثال
مثال‌هایی از دستور Rollback را مشاهده می‌کنیم:
1
2
3
ROLLBACK;
ROLLBACK WORK;
ROLLBACK TO SAVEPOINT savepoint1;

Lock Table

توضیحات
دستور Lock table به منظور lock کردن جدول به کار می‌رود.
دستور
دستور lock Table به صورت زیر نوشته می‌شود:
1
2
lock_mode
LOCK TABLE tables IN lock_mode MODE [ WAIT [, integer] | NOWAIT ];
   
مثال
مثالی از lock table را مشاهده می‌کنیم:
1
LOCK TABLE suppliers IN SHARE MODE NOWAIT;

Set Transaction

توضیحات
دستور set transaction برای ست کردن یک تراکنش به عنوان read-only، read/write، سطح Isolation، تخصیص نام به تراکنش یا تخصیص یک rollback به یک تراکنش است.
دستور
دستور Set transaction به صورت زیر نوشته می‌شود:
1
2
3
4
SET TRANSACTION [ READ ONLY | READ WRITE ]
                [ ISOLATION LEVEL [ SERIALIZE | READ COMMITED ]
                [ USE ROLLBACK SEGMENT 'segment_name' ]
                [ NAME 'transaction_name' ];
. READ ONLY: گزینه‌ای اختیاری است، اگر ست شود فقط به عنوان یک تراکنش read-only در نظر گرفته می‌شود. READ WRITE: گزینه‌ای اختیاری است، اگر ست شود به عنوان یک تراکنش read/write در نظر گرفته می‌شود. ISOLATION LEVEL: گزینه‌ای اختیاری است، که دو انتخاب دارد: • ISOLATION LEVEL SERIALIZE : اگر یک تراکنش تلاش برای آپدیت کردن منبعی داشته باشد که قبلا توس منبع دیگر آپدیت شده بود ولی commit نشده بود تراکنش لغو شود. • ISOLATION LEVEL READ COMMITTED: اگر تراکنش به یک row lock برخورد باید صبر کند تا آن lock برطرف شود. USE ROLLBACK SEGMENT: گزینه‌ای اختیاری است، اگر به کار رود به این معنی است که تراکنش را به بخش rollback تخصیص می‌دهد که توسط segment_name نام‌گذاری شده است.    
مثال
مثال‌هایی از دستور Set Transaction را مشاهده می‌کنیم:
1
2
3
SET TRANSACTION READ ONLY NAME 'RO_example';
SET TRANSACTION READ WRITE NAME 'RW_example';

AFTER DELETE Triger

توضیحات
AFTER DELETE Trigger به معنی این است که بعد از اجرای یک دستور delete، یک تریگر فعال (fire) شود.
دستور
دستور Ater delete triger به صورت زیر نوشته می‌شود:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE [ OR REPLACE ] TRIGGER trigger_name
AFTER DELETE
   ON table_name
   [ FOR EACH ROW ]
DECLARE
   -- variable declarations
BEGIN
   -- trigger code
EXCEPTION
   WHEN ...
   -- exception handling
END;
. OR REPLACE: گزینه‌ای اختیاری است، اگر فعال شود به این معنی است که می‌توان دوباره تریگری با این نام ساخت بدون اینکه نیاز باشد این تریگر پاک شود. table_name: نام جدولی که تریگر بر روی آن ساخته شده است. نکته: این دستور را می‌توان برای insert و update به صورت after insert و after delete نوشت.    
مثال
مثالی از دستور ساخت After Delete triger را مشاهده می‌کنیم:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
CREATE TABLE orders
( order_id number(5),
  quantity number(4),
  cost_per_item number(6,2),
  total_cost number(8,2)
);
CREATE OR REPLACE TRIGGER orders_after_delete
AFTER DELETE
   ON orders
   FOR EACH ROW
DECLARE
   v_username varchar2(10);
BEGIN
   -- Find username of person performing the DELETE on the table
   SELECT user INTO v_username
   FROM dual;
   -- Insert record into audit table
   INSERT INTO orders_audit
   ( order_id,
     quantity,
     cost_per_item,
     total_cost,
     delete_date,
     deleted_by)
   VALUES
   ( :old.order_id,
     :old.quantity,
     :old.cost_per_item,
     :old.total_cost,
     sysdate,
     v_username );
END;