מדריך PL-SQL – לולאות ותנאים
תנאים
אנו מציינים תנאים ב-PL/SQL ע"י המילים השמורות IF … ELSEIF … ELSE … END IF
כמובן, שאת הביטויים ELSE ו- ELSEIF ניתן להשמיט מהתנאי, אם אין לנו צורך בהם.
IFTHEN --Action ELSEIF THEN --Action ELSE --Action END IF;
לולאות
לולאה פשוטה
loop -- Sequence of statements; end loop;
לולאה זו תסתיים אך ורק כאשר נשתמש בביטוי EXIT WHEN :
loop -- Sequence of statements; EXIT WHENend loop;
לכן חשוב לא לזכוח לציין את תנאי העצירה, כדי לא להכנס ללולאה אינסופית.
סכום המספרים בין 1 ל-100:
--SUM OF 100 NUMBERS Declare a number; s1 number default 0; Begin a:=1; loop s1:=s1+a; exit when (a=100); a:=a+1; end loop; dbms_output.put_line('Sum between 1 to 100 is '||s1); End;
WHILE LOOP
הלולאה תתבצע כל עוד התנאי המצויין מתקיים.
While [condition] loop --sequence of statements end loop;
דוגמא נוספת:
--SUM OF 100 ODD NUMBERS .. WHILE LOOP declare n number; endvalue number; sum1 number default 0; begin endvalue:=&endvalue; n:=1; while (n < endvalue) loop sum1:=sum1+n; n:=n+2; end loop; dbms_output.put_line('Sum of odd numbers between 1 and ' || endvalue || ' is ' || sum1); end;
FOR LOOP
זוהי לולאת מנייה, שתתבצע כל עוד המונה נמצא בטווח המספרים.
FOR i in 1..10 loop --sequence of statements end loop;
לולאה המחשבת את סכום המספרים הזוגיים, מ-1 ועד למספר הנקלט מהמשתמש:
--SUM OF odd NUMBERS USING USER INPUT...for loop declare n number; sum1 number default 0; endvalue number; begin endvalue:=&endvalue; n:=1; for n in 1.. endvalue loop if mod(n,2)=1 then sum1:=sum1+n; end if end loop; dbms_output.put_line('sum = ' || sum1); end;
GOTO
הפקודה מציינת שיש לעבור למקום מסויים בקוד:
GOTO X; << X >>
--SEQUENTIAL CONTROL GOTO..... declare --takes the default datatype of the column of the table price cost price.minprice%type; begin select stdprice into cost from price where prodial in (Select prodid from product where prodese = "shampoo"); if cost > 7000 then goto Upd; end if; << Upd >> Update price set minprice = 6999 where prodid=111; end;
דוגמאות נוספות
--CALCULATION OF NET SALARY declare ename varchar2(15); basic number; da number; hra number; pf number; netsalary number; begin ename:=&ename; basic:=&basic; da:=basic * (41/100); hra:=basic * (15/100); if (basic < 3000) then pf:=basic * (5/100); elsif (basic >= 3000 and basic <= 5000) then pf:=basic * (7/100); elsif (basic >= 5000 and basic <= 8000) then pf:=basic * (8/100); else pf:=basic * (10/100); end if; netsalary:=basic + da + hra -pf; dbms_output.put_line('Employee name : ' || ename); dbms_output.put_line('Providend Fund : ' || pf); dbms_output.put_line('Net salary : ' || netsalary); end;
--MAXIMUM OF 3 NUMBERS Declare a number; b number; c number; Begin dbms_output.put_line('Enter a:'); a:=&a; dbms_output.put_line('Enter b:'); b:=&b; dbms_output.put_line('Enter c:'); c:=&b; if (a>b) and (a>c) then dbms_output.putline('A is Maximum'); elsif (b>a) and (b>c) then dbms_output.putline('B is Maximum'); else dbms_output.putline('C is Maximum'); end if; End;
--QUERY EXAMPLE--IS SMITH EARNING ENOUGH declare s1 emp.sal %type; begin select sal into s1 from emp where ename = 'SMITH'; if(no_data_found) then raise_application_error (20001,'smith is not present'); end if; if(s1 > 10000) then raise_application_error (20002,'smith is earning enough'); end if; update emp set sal=sal + 500 where ename='SMITH'; end;
--PRIME NO OR NOT DECLARE no NUMBER (3) := &no; a NUMBER (4); b NUMBER (2); BEGIN FOR i IN 2..no - 1 LOOP a := no MOD i; IF a = 0 THEN GOTO out; END IF; END LOOP; <> IF a = 1 THEN DBMS_OUTPUT.PUT_LINE (no || ' is a prime number'); ELSE DBMS_OUTPUT.PUT_LINE (no || ' is not a prime number'); END IF; END;
--SIMPLE EXAMPLE OF LOOP STATEMENT I.E. EXIT WHEN Declare a number:= 100; begin loop a := a+25; exit when a=250; end loop; dbms_output.put_line (to_Char(a)); end;
--EXAMPLE OF WHILE LOOP Declare i number:=0; j number:= 0; begin while i <=100 loop j := j+1; i := i +2; end loop; dbms_output.put_line(to_char(i)); end;
/*CALCULATE THE AREA OF A CIRCLE FOR A VALUE OF RADIUS VARYING FROM 3 TO 7. STORE THE RADIUS AND THE CORRESPONDING VALUES OF CALCULATED AREA IN A TABLE AREAS.*/ Declare pi constant number(4,2) := 3.14; radius number(5); area number(14,2); Begin radius := 3; While radius <=7 Loop area := pi* power(radius,2); Insert into areas values (radius, area); radius:= radius+1; end loop; end;
--INVERTING A NUMBER 5639 TO 9365 Declare given_number varchar(5) := '5639'; str_length number(2); inverted_number varchar(5); Begin str_length := length(given_number); For cntr in reverse 1..str_length loop inverted_number := inverted_number || substr(given_number, cntr, 1); end loop; dbms_output.put_line('The Given no is ' || given_number); dbms_output.put_line('The inverted number is ' || inverted_number); end;
תגובות בפייסבוק