Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 PL/SQL programming Procedures and Cursors Lecture 1 Akhtar Ali.

Similar presentations


Presentation on theme: "1 PL/SQL programming Procedures and Cursors Lecture 1 Akhtar Ali."— Presentation transcript:

1 1 PL/SQL programming Procedures and Cursors Lecture 1 Akhtar Ali

2 2 SQL refresher Basic commands SELECT, INSERT, DELETE, UPDATE Always remember to state the table(s) you are selecting data from Join tables using keys (Primary / Foreign) Filter data wherever possible Procedures are different from scripts

3 3 SQL scripts Set of commands to run in sequence. Stored as a text file (e.g. using Notepad) on a disk and not in the data dictionary. It is accessed by file name Executed using @ or Start. Script called: Create_User.sql Executed by: SQL> @Create_User.sql

4 4 Procedures in SQL Block of SQL statements stored in the Data dictionary and called by applications or from SQL* plus prompt. Usually used to implement application/business logic. When called all code within a procedure is executed (unlike packages). Action takes place on server side not client. Do not return value to calling program. Not available in Oracle 6 or older. Aid security as DBA will grant access to procedures not tables, therefore users can not access tables unless via a procedure.

5 5 Building a procedure 1. Create or replace command 2. Type of object to be created 3. Name of object 4. Any variables accessed or imported 5. Declare local variables 6. Write body of the object (code) 7. End procedure declaration

6 6 1. Create or replace command 2. Object to be created 3. Name of object 4. Any variables accessed or imported 5. Declare local variables 6. Body 7. End procedure declaration Create or replace procedure inflation_rise (inf_rate in number) Begin update employee set salary = salary + (salary * inf_rate / 100); commit; End; This procedure is called inflation_rise and used a variable accessed as inf_rate which is a number, this is passed in when the procedure is used. It simply updates the salary by the rate of inflation.

7 7 Compiling and executing procedures Like any program the code needs to be compiled. @inflation_rise will compile the procedure and make it available in the database Execute inflation_rise(2) will cause the procedure to execute, with 2 as an inflation rate. Remember to compile a procedure once it has been amended. For ease of use, it is easiest to write procedures in notepad, store as script files, and then run them, this means that they can be easily edited – also you will have a copy if required

8 8 Example CREATE OR REPLACE PROCEDURE validate_customer ( v_cust IN VARCHAR ) AS v_countNUMBER; BEGIN SELECT COUNT(*) INTO V_COUNT FROM customer WHERE c_id = v_cust; IF v_count > 0 THEN DBMS_OUTPUT.PUT_LINE( 'customer valid'); ELSE DBMS_OUTPUT.PUT_LINE('customer not recognised'); END IF; END; Any variables passed into procedure Local variables used by procedure SQL

9 9 Cursors in SQL Enables users to loop around a selection of data. Stores data selected from a query in a temp area for use when opened. Use complex actions which would not be feasible in standard SQL selection queries

10 10 Syntax for Cursors Declared as a variable in the same way as standard variables Identified as cursor type SQL included E.g. Cursor cur_emp is Select emp_id, surname name, grade, salary From employee Where regrade is true;

11 11 Cursors A cursor is a temp store of data. The data is populated when the cursor is opened. Once opened the data must be moved from the temp area to a local variable to be used by the program. These variables must be populated in the same order that the data is held in the cursor. The data is looped round till an exit clause is reached.

12 12 Active set Current row Cursor 7369SMITHCLERK 7566JONESMANAGER 7788SCOTTANALYST 7876ADAMSCLERK 7902FORDANALYST Cursor Functions

13 13 Controlling Cursor Create a named SQL area Create a named SQL area DECLAREDECLARE Identify the active set Identify the active setOPENOPEN Load the current row into variables Load the current row into variablesFETCHFETCH Test for existing rows Test for existing rows EMPTY? Return to FETCH if rows found Return to FETCH if rows found No Release the active set Release the active set CLOSECLOSEYes

14 14 Controlling Cursor… Open the cursor. Cursor Pointer Fetch a row from the cursor. Cursor Pointer Continue until empty. Cursor Pointer Close the cursor. Cursor

15 15 Cursor Attributes AttributeType Description %ISOPENBoolean Evaluates to TRUE if the cursor is open %NOTFOUNDBoolean Evaluates to TRUE if the most recent fetch does not return a row %FOUNDBoolean Evaluates to TRUE if the most recent fetch returns a row; complement of %NOTFOUND %ROWCOUNTNumberEvaluates to the total number of rows returned so far Obtain status information about a cursor.

16 16 Create or replace procedure proc_test as v_empidnumber; Cursor cur_sample is Select empid from employee where grade > 4; Begin open cur_sample; loop fetch cur_sample into v_empid; exit when cur_sample%notfound; update employee set salary = salary + 500 where empid = v_empid; end loop; End; Open cursor for use. Loops round each value returned by the cursor Place the value from the cursor into the variable v_empid Stop when not more records are found 25463 12245 55983 12524 98543 Data returned by cursor Declare Cursor

17 17 Notepad file called: Create_procedure.sql 1) Open SQL*Plus and logon 2) At the prompt enter: @create_procedure You will get a prompt which should say ‘procedure created’ 3) To run the procedure enter: Execute proc_test 4) If you check your data you should now find that the procedure has run successfully

18 18 Use of conditions If statements can be used If Then ….. End if; Example Remember to end the if statement and use of indented code will make it easier to debug!... IF v_ename = 'MILLER' THEN v_job := 'SALESMAN'; v_deptno := 35; v_new_comm := sal * 0.20; END IF;... IF v_ename = 'MILLER' THEN v_job := 'SALESMAN'; v_deptno := 35; v_new_comm := sal * 0.20; END IF;...

19 19 The %ISOPEN Attribute Fetch rows only when the cursor is open. Use the %ISOPEN cursor attribute before performing a fetch to test whether the cursor is open. Example IF NOT cur_sample%ISOPEN THEN OPEN cur_sample; END IF; LOOP FETCH cur_sample... IF NOT cur_sample%ISOPEN THEN OPEN cur_sample; END IF; LOOP FETCH cur_sample...

20 20 DECLARE CURSOR emp_cursor IS SELECTempno, ename FROMemp; emp_recordemp_cursor%ROWTYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO emp_record;... DECLARE CURSOR emp_cursor IS SELECTempno, ename FROMemp; emp_recordemp_cursor%ROWTYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO emp_record;... Cursors and Records Process the rows of the active set conveniently by fetching values into a PL/SQL RECORD. Example

21 21 Cursor FOR Loops FOR record_name IN cursor_name LOOP statement1; statement2;... END LOOP; FOR record_name IN cursor_name LOOP statement1; statement2;... END LOOP; Syntax The cursor FOR loop is a shortcut to process cursors. Implicitly opens, fetches, and closes cursor. The record is implicitly declared.

22 22 Cursor FOR Loops: An Example Retrieve employees one by one until no more are left. Retrieve employees one by one until no more are left. Example Example DECLARE CURSOR emp_cursor IS SELECT ename, deptno FROM emp; BEGIN FOR emp_record IN emp_cursor LOOP -- implicit open and implicit fetch occur IF emp_record.deptno = 30 THEN... END LOOP; -- implicit close occurs END; DECLARE CURSOR emp_cursor IS SELECT ename, deptno FROM emp; BEGIN FOR emp_record IN emp_cursor LOOP -- implicit open and implicit fetch occur IF emp_record.deptno = 30 THEN... END LOOP; -- implicit close occurs END;

23 23 Seminar exercise The purpose of this exercise is to create a procedure which, when evoked, will increase the salary of a grade by £500 or £1000 depending on the level of the grade. You will need to populate the table first with a minimum of 10 entries, the empgrade value should be between 1 and 5, and the idea is the higher the grade the higher the manager. There is a script for this on the BlackBoard/homepage. Once you have done this you should compile the code this will then indicate if the procedure has compiled or not. If compilation is unsuccessful entering the command show errors will list any problems with the code. To run the procedure you type execute at the SQL prompt.


Download ppt "1 PL/SQL programming Procedures and Cursors Lecture 1 Akhtar Ali."

Similar presentations


Ads by Google