Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 JumpStart PL/SQL Wang Hao. 2 Outline PL/SQL Programming SQL*Plus and SQL commands.

Similar presentations


Presentation on theme: "1 JumpStart PL/SQL Wang Hao. 2 Outline PL/SQL Programming SQL*Plus and SQL commands."— Presentation transcript:

1 1 JumpStart PL/SQL Wang Hao

2 2 Outline PL/SQL Programming SQL*Plus and SQL commands

3 3 PL/SQL Programming PL/SQL is an extension to SQL with design features of programming languages. Data manipulation and query statements of SQL are included within procedural units of code.

4 4 Benefits of PL/SQL Integration of applications, shared library and Oracle server. Improve performance. applicationOther DBMSs SQL application Oracle with PL/SQL IF … THEN SQL ELSE SQL END IF;

5 5 PL/SQL Block Structure DECLARE –Optional –Variables, cursors, uer-define exceptions BEGIN – Mandatory –SQL statements –PL/SQL statements EXCEPTION – Optional –Actions to perform when errors occur END; - Mandatory

6 6 PL/SQL Block Structure(1) DECLARE v_variable VARCHAR2(5); BEGIN SELECT column_name INTO v_variable FROM table_name EXCEPTION … WHEN exception_name THEN END;

7 7 Block Types Procedure PROCEDURE name IS BEGIN -- statements [EXCETPION] END; Function FUNCTION name RETURN datatype IS BEGIN -- statements RETURN value; [EXCETPION] END; [DECLARE] BEGIN -- statements [EXCETPION] END;

8 8 Program Constructs Anonymous Block –Unnamed PL/SQL block that is embedded within an application or is issued interactively Stored procedure or function Named PL/SQL block stored in Oracle Server that can accept parameters and be invoked repeatedly by name. Package Named PL/SQL module that groups related procedures, functions and identifiers. Stored in Oracle server or Oracle Developer components – for example, Forms.

9 9 Handling Variables in PL/SQL Declare and initialize variables in the declaration section. Assign new values to variables in the executable section. Pass values into PL/SQL blocks through parameters. View results through output variables.

10 10 Types of PL/SQL Variables Scalar –BOOLEAN, DATE, NUMBER, VARCHAR2 Composite –Such as records. Reference –Pointers LOB (large objects) –Used to hold large objects such as images. Non-PL/SQL variables: bind and host variables.

11 11 Declaring PL/SQL Variables Examples: Declare v_hiredateDATE v_deptnoNUMBER(2) NOT NULL :=10; v_locationVARCHAR(13) := ‘New York’; v_tax_rateNUMBER(3,2) := 3.0; c_commCONSTANT NUMBER := 1400; Guidelines: –Follow naming conventions. –Initialize variables designated as NOT NULL. –Declare at most one identifier per line.

12 12 Base Scalar Datatypes VARCHAR2(maximum_length) –No default size; max = 32767 bytes NUMBER[(precision, scale)] –For fixed and floating numbers. CHAR[(maximum_length)] –For fixed-length character string. Default to 1. BOOLEAN –TURE, FALSE, or NULL BINARY_INTEGER –Base type of integers between -2,147,483,647 and 2,147,483,647. PLS_INTEGER –Same range as BINARY_INTEGER but requires less storage and are faster than NUMBER and BINARY_INTEGER values.

13 13 Declaring Variables with the % TYPE attribute Declare a variable according to –A database column definition –Another previously declared variables. Prefix % TYPE Examples: v_enameemp.ename%TYPE; v_balanceNUMBER(7,2); v_min_balancev_balance%TYPE := 10;

14 14 PL/SQL Block Syntax and Guidelines Statements can continue over several lines. Identifiers –Can contain up to 30 characters. –Must begin with alphabetic character. Literals –Enclosed in single quotation marks. A PL/SQL block is terminated by a slash / on a line by itself. Commenting code –Single-line comments with two dashes (--). –Place multi-line comments between /* and */

15 15 Operators Arithmetic +, -, *, /, **, Comparison =,, >=, <=, !=, IS NULL, LIKE, BETWEEN, IN Assignment := Statement terminator ; String concatenation || Logical NOTG, AND, OR

16 16 SQL Statements in PL/SQL Extract a row of data from the database by using the SELECT command. Only a single set of values can be returned. Make changes to rows in the database by using DML commands. (INSERT, UPDATE, DELETE). Control a transaction with the COMMIT, ROLLBACK or SAVEPOINT command. Determine DML outcome with implicit cursors. Does not support DDL (CREATE TABLE, ALTER TABLE, or DROP TABLE) and DCL (GRANT, REVOKE)

17 17 SELECT Statements in PL/SQL Retrieve data from the database with SELECT. Example: DECLARE v_dept_noNUMBER(2); v_locVARCHAR2(15); BEGIN SELECTdeptno, loc INTOv_deptno, v_loc FROMdept WHEREdname=‘SALES’; END;

18 18 Manipulating Data Using PL/SQL INSERT BEGIN INSERT INTO emp(empno, ename, job, deptno) VALUES(empno_sequence.NEXTVAL, ‘Jack’, ‘CTO’, 10); END; UPDATE BEGIN UPDATE emp SETsal = sal + 10; WHERE job = ‘ANALYST’; END;

19 19 Manipulating Data Using PL/SQL DELETE BEGIN DELETE FROM emp WHERE name = ‘JACK’; END;

20 20 Writing Control Structures Conditional IF statements. IF v_dept_no = 10 THEN v_bonus := 5000; ELSIF v_dept_no=20 THEN v_bonus := 7500; ELSE v_bonus := 2000; END IF;

21 21 Writing Control Structures Iterative control: loop statements –Basic loop –FOR loop –WHIE loop Basic loop BEGIN LOOP INSERT INTO item(ordid, itemid) VALUES (610, v_counter); v_counter := counter + 1; EXIT WHEN v_counter > 10; END LOOP; COMMIT; END;

22 22 Writing Control Structures FOR loop BEGIN FOR i IN 1..100 LOOP …… END LOOP; END; WHILE loop BEGIN WHILE i <= 100 LOOP …… END LOOP; END; Nested loop is allowed.

23 23 SQL Cursor A cursor is a private SQL work area. Each SQL statement executed by the Oracle Server has an individual cursor associated with it. There are two types of cursors: –Implicit cursors –Explicit cursors The Oracle Server uses implicit cursors to parse and execute your SQL statements. Explicit cursors are explicitly declared by the programmer.

24 24 SQL Cursor Attributes Using SQL cursor attributes, you can test the outcome of your SQL statements. SQL%ROWCOUNTNumber of rows affected by the most recent SQL statement. (an integer value). SQL%FOUNDBoolean attribute that evaluates to TRUE if the most recent SQL statement affects one or more rows. SQL%NOTFOUNDBoolean attribute that evaluates to TRUE if the most recent SQL statement does not affect any row. SQL%ISOPENAlways evaluates to FALSE because PL/SQL closes implicit cursors immediately after they are executed.

25 25 Cursor Writing Explicit Cursors Use explicit cursors to individually process each row returned by a multi-row SELECT statement. Active Set 7369SMITHCLERK 7430JONESMANAGER 7788SCOTTANALYST 7789JACKCTO Current Row

26 26 Writing Explicit Cursors: Example DECLARE v_empnoemp.empno%TYPE; v_enameemp.ename%TYPE; CURSOR emp_cursor IS SELECT empno, ename FROM emp; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_empno, v_ename; EXIT WHEN emp_cursor%NOTFOUND; …… END LOOP; CLOSE emp_cursor;

27 27 Cursors with Parameters Example: pass the department number and job title to the WHERE clause. DECALRE CURSOR emp_cursor (p_deptno NUMBER, p_job VARCHAR2) IS SELECT empno, ename FROMemp WHEREdeptno = v_deptno ANDjob = v_job; BEGIN OPEN emp_cursor(10, ‘CLERK’); ……

28 28 Cursors with Subqueries DECALRE CURSOR my_cursor IS SELECT t1.deptno, t1.dname, t2.STAFF FROMdept t1, (SELECT deptno, count(*) STAFF FROM emp GROUP BY deptno) t2 WHEREt1.deptno = t2.deptno ANDt2.STAFF >= 5;

29 29 Using Arrays Item type: VARRAY (short for Variable-size arrays). A varray can have only one dimension and must be indexed by integers. A varray has a maximum size. Example: DECALRE TYPE list IS VARRAY(25) of NUMBER(3); v1 v_list; BEGIN FOR i IN 1..25 v1(i) := 1; END LOOP; END;

30 30 Subprograms Subprograms are named PL/SQL blocks that can take parameters and be invoked. PL/SQL has two types of subprograms called procedures and functions. Example: a procedure named debit_account, which debits a bank account:

31 31 PROCEDURE debit_account (acct_id INTEGER, amount REAL) IS old_balance REAL; new_balance REAL; overdrawn EXCEPTION; BEGIN SELECT bal INTO old_balance FROM accts WHERE acct_no = acct_id; new_balance := old_balance - amount; IF new_balance < 0 THEN RAISE overdrawn; ELSE UPDATE accts SET bal = new_balance WHERE acct_no = acct_id; END IF; EXCEPTION WHEN overdrawn THEN... END debit_account;

32 32 Writing Functions Consider the function sal_ok, which determines if a salary is out of range: FUNCTION sal_ok (salary REAL, title VARCHAR2) RETURN BOOLEAN IS min_sal REAL; max_sal REAL; BEGIN SELECT losal, hisal INTO min_sal, max_sal FROM sals WHERE job = title; RETURN (salary >= min_sal) AND (salary <= max_sal); END sal_ok;

33 33 Parameter Modes IN mode (the default) –passes values to a subprogram. –actual parameter is passed by reference (a pointer to the value is passed in) OUT mode (must be specified) –returns values to the caller. –actual parameter is passed by value (a copy of the value is passed out) unless NOCOPY is specified IN OUT mode (must be specified) –passes initial values to a subprogram and returns updated values to the caller. –actual parameter is passed by value.

34 34 Declaring Subprograms You can declare subprograms in any PL/SQL block, subprogram, or package. But, you must declare subprograms at the end of a declarative section after all other program items. PL/SQL requires that you declare an identifier before using it. Therefore, you must declare a subprogram before calling it.

35 35 Packaging Subprograms You can group logically related subprograms in a packages, which is stored in the database. Packaged subprograms can be shared by many applications, while hiding implementation details. Package spec: declares the subprograms, and Package body: implements the subprograms. Example:

36 36 Creating Package Spec: CREATE OR REPLACE PACKAGE emp_actions AS PROCEDURE hire_employee (emp_id INTEGER, name VARCHAR2,...); PROCEDURE fire_employee (emp_id INTEGER); PROCEDURE raise_salary (emp_id INTEGER, amount REAL);... END emp_actions; Creating Package Body:

37 37 CREATE OR REPALCE PACKAGE BODY emp_actions AS PROCEDURE hire_employee (emp_id INTEGER, name VARCHAR2,...) IS BEGIN... INSERT INTO emp VALUES (emp_id, name,...); END hire_employee; PROCEDURE fire_employee (emp_id INTEGER) IS BEGIN DELETE FROM emp WHERE empno = emp_id; END fire_employee; PROCEDURE raise_salary (emp_id INTEGER, amount REAL) IS BEGIN UPDATE emp SET sal = sal + amount WHERE empno = emp_id; END raise_salary;... END emp_actions;

38 38 Packaging Subprograms You can define subprograms in a package body without declaring their specs in the package spec. However, such subprograms can be called only from inside the package. Guidelines: –Put package spec and body in separate files. –Compile package spec first before compiling package body.

39 39 Referencing Package Contents To reference the types, items, subprograms, and call specs declared within a package spec, use dot notation, as follows: –package_name.type_name –package_name.item_name –package_name.subprogram_name –package_name.call_spec_name Example: SQL> CALL emp_actions.hire_employee('TATE', 'CLERK',...);

40 40 Oracle Packages: DBMS_OUTPUT Package DBMS_OUTPUT enables you to display output from PL/SQL blocks and subprograms, which makes it easier to test and debug them. You display the information by calling the procedure get_line or by setting SERVEROUTPUT ON in SQL*Plus. For example, suppose you create the following stored procedure:

41 41 CREATE PROCEDURE calc_payroll (payroll OUT NUMBER) AS CURSOR c1 IS SELECT sal, comm FROM emp; BEGIN payroll := 0; FOR c1rec IN c1 LOOP c1rec.comm := NVL(c1rec.comm, 0); payroll := payroll + c1rec.sal + c1rec.comm; END LOOP; /* Display debug info. */ DBMS_OUTPUT.PUT_LINE('Value of payroll: ' || TO_CHAR(payroll)); END; In SQL*Plus SQL> SET SERVEROUTPUT ON SQL> VARIABLE num NUMBER SQL> CALL calc_payroll(:num); Value of payroll: 31225

42 42 Oracle Packages: UTL_FILE Package UTL_FILE allows your PL/SQL programs to read and write operating system (OS) text files. It provides a restricted version of standard OS stream file I/O, including open, put, get, and close operations.

43 43 UTL_FILE Functions UTL_FILE.FOPEN ( location IN VARCHAR2, filename IN VARCHAR2, open_mode IN VARCHAR2) RETURN UTL_FILE.FILE_TYPE; Open_mode: 'r', 'w‘, 'a‘ The maximum line size is the default to 1023. To read a line of max. length > 1023, use UTL_FILE.FOPEN ( location IN VARCHAR2, filename IN VARCHAR2, open_mode IN VARCHAR2, max_linesize IN BINARY_INTEGER) RETURN file_type;

44 44 UTL_FILE Functions UTL_FILE.IS_OPEN (file IN FILE_TYPE) RETURN BOOLEAN; UTL_FILE.FCLOSE (file IN OUT FILE_TYPE); UTL_FILE.GET_LINE ( file IN FILE_TYPE, buffer OUT VARCHAR2); Text is read up to but not including the line terminator, or up to the end of the file. If the line does not fit in the buffer, then a VALUE_ERROR exception is raised. If no text was read due to "end of file," then the NO_DATA_FOUND exception is raised. The maximum size of an input record is 1023 bytes.

45 45 BEGIN v_fid := utl_file.fopen('e:\log','h.log','r'); BEGIN LOOP utl_file.get_line(v_fid,in_row); IF substr(in_row,1,6)='Table' AND substr(in_row,- 1,1) = ':' THEN h_table_name := rtrim(substr(in_row,7,30),':'); ELSEIF substr(in_row,-7,7) = 'loaded.' THEN h_no_rows := to_number(substr(in_row,3,instr (in_row,'R')-4)); ENDIF; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; utl_file.fclose(v_fid); END;

46 46 Useful Links http://oraweb.comp.nus.edu.sg/RDBMS/app dev.816/a77069/toc.htm PL/SQL User's Guide and Referencehttp://oraweb.comp.nus.edu.sg/RDBMS/app dev.816/a77069/toc.htm http://www.elementkjournals.com/dbm/000 5/dbm0053.htm Using the UTL_FILE packagehttp://www.elementkjournals.com/dbm/000 5/dbm0053.htm

47 47 Using SQL*Plus A client for users to interactively execute commands on Oracle Server. Useful commands –Describe a table structure: desc –List all tables under you: select table_name from user_tables. –Run packages: @

48 48 SQL*Plus Commands Show errors: show error ; Edit the previously executed command(s): Edit Enable output on SQL*PLUS: SET SERVEROUTPUT ON Solve array overflow problem: SET ARRAYSIZE 1

49 49 SQL Commands DROP TABLE employee CREATE TABLE employee ( empno INTEGER NOT NULL, name VARCHAR2(50) NOT NULL, sal REAL NOT NULL, primary key (empno)); INSERT INTO employee VALUES (1, 'Jack', 6000) UPDATE employee SET sal=500 WHERE name=‘Jack’ DELETE FROM employee WHERE name=‘Jack’; CREATE INDEX test_index on employee(sal) DROP INDEX test_index


Download ppt "1 JumpStart PL/SQL Wang Hao. 2 Outline PL/SQL Programming SQL*Plus and SQL commands."

Similar presentations


Ads by Google