Disadvantages Of SQL: 1. SQL does not have any procedural capabilities. 2. SQL statements are passed to Oracle engine one at a time. Each time the SQL statement is executed , the call is made to engine resources. This adds traffic on the network. Which decreases speed of data processing. 3. While processing SQL statement if an error occurs, the Oracle engine displays its own error message. Programming in Oracle with PL/SQL Procedural Language Extension to SQL PL/SQL • Allows using general programming tools with SQL, for example: loops, conditions, functions, etc. • This allows a lot more freedom than general SQL. • We write PL/SQL code in a regular file, for example PL.sql, and load it with @PL in the sqlplus console. PL/SQL Blocks • PL/SQL code is built of Blocks, with a unique structure. • There are two types of blocks in PL/SQL: 1. Anonymous Blocks: have no name (like scripts) • can be written and executed immediately in SQLPLUS • can be used in a trigger 2. Named Blocks: • Procedures • Functions Anonymous Block Structure: DECLARE (optional) /* Here you declare the variables you will use in this block */ BEGIN (mandatory) /* Here you define the executable statements (what the block DOES!)*/ EXCEPTION (optional) /* Here you define the actions that take place if an exception is thrown during the run of this block */ END; / (mandatory) Always put a new line with only a / at the end of a block! (This tells Oracle to run the block) A correct completion of a block will generate the following message: PL/SQL procedure successfully completed DECLARE Syntax identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr]; Examples Declare birthday age name magic valid Notice that PL/SQL includes all SQL types, and more… DATE; NUMBER(2) NOT NULL := 27; VARCHAR2(13) := 'Levi'; CONSTANT NUMBER := 77; BOOLEAN NOT NULL := TRUE; Declaring Variables with the %TYPE Attribute Examples DECLARE sname fav_boat my_fav_boat ... Accessing column sname in table Sailors Sailors.sname%TYPE; VARCHAR2(30); fav_boat%TYPE := 'Pinta'; Accessing another variable Declaring Variables with the %ROWTYPE Attribute Declare a variable with the type of a ROW Accessing of a table. table Reserves reserves_record Reserves%ROWTYPE; And how do we access the fields in reserves_record? reserves_record.sid:=9; Reserves_record.bid:=877; • Control Structures: • Conditional Control • Iterative Control • Sequential Control 1. Conditional Control: if <condition> then sequence of statements; end if; IF-THEN-ELSIF Statements . . . IF rating > 7 THEN v_message := 'You are great'; ELSIF rating >= 5 THEN v_message := 'Not bad'; ELSE v_message := 'Pretty bad'; END IF; . . . • Write PL/SQL code that will except an account number from the user and debit amount of Rs. 2000 from a/c if the balance of a/c remains minimum Rs.500. The process is to be fired on Account table. account (ac_Id, Name, bal) Declare ac_bal number(10,2); ac_no varchar2(6); debit_amt number(5) :=2000; min_bal constant number(5,2):=500; Begin ac_no:=&ac_no; select bal into ac_bal from account where ac_id=ac_no; ac_bal:=ac_bal - debit_amt; if ac_bal >= min_bal then update accounts set bal=bal – debit_amt where ac_Id=ac_no; end if; End; 2. Iterative Control: i) Simple loop ii) For loop iii) while loop • i) Simple loop loop sequence of statements; end loop; • ii) For loop for counter in [reverse]lowerbound .. Upperbound loop sequence of statements; end loop; • iii) while loop while <condition> loop <action> end loop; • Write a PL/SQL block to calculate the area of a circle for a value of radius varying from 3 to 7. Store the radius & the corresponding values of calculated area in a table, ‘Areas’. Declare pi constant number(4,2) := 3.14; radius number(5); area number(10,2); Begin radius:=3; while radius<=7 loop area:=pi*power(radius,2); insert into areas values(radius,area); end loop; End; • Write a PL/SQL block of code for inverting a number 5639 to 9365. Declare given_number(5):=‘5639’; str_len number(2); inverted_no varchar2(5); Begin str_len:=length(given_number); for cntr in reverse 1 .. Str_len 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; • Sequential Control: goto <code block name>; • Write PL/SQL block of code to achieve the following. If the price of product p1 is less than 4000, then change the price to 4000. Th price change is to be recorded in the old_price_table along with the product_no & the date on which the price was last changed. Declare selling_price number(10,2) Begin select sell_price into selling_price from product_master where product_no=‘p1’; if selling_price<4000 then goto add_old_price; else dbms_output.put_line(‘Current price’ || selling _price); end if <<Add_old_price>> update product_master set sell_price=4000 where product_no= ‘p1’ insert into old_price (prduct_no, date_change, old_price) values(‘p1’, sysdate, selling_price); dbms_output.put_line(‘the new price of p1 is 4000’); End; • Error Handling in PL/SQL: when <exception name> then user defined actions to be carried out; • Types Of Exceptions: 1. predefined exceptions: They are raised automatically by the system during run time. 2. user defined Exceptions: They must be raised explicitly using Raise statement. • Some Predefined Exceptions: 1. No_data_found 2. Cursor_already_open 3. Dup_val_on_index 4. Srorage_error 5. Program_error 6. Zero_divide 7. Invalid_cursor 8. Login_denied 9. Invalid_cursor 10. Too_many_rows • User Defined Exception: exception name <exception>; Raise Statement: raise <exception name>; • Declare exception name <exception>; Begin SQL sentense; if condition then raise <exception name>; end if; Exception when <exception name> then user defined actions to be carried out; End; • The X company wants to check qty_in_hand.if it is less than 500 the company wants to display msg. Declare lo_val exception; qty item_master.qty_in_hand%type; Begin select qty_in_hand into qty from item_master where itemcode=‘i100’; if qty<500 then raise lo_val; end if; Exception when lo_val then dbms_output.put_line=(‘Qty not enogh’); End;