Distributed Database Applications COSC 5050 Week One.

41
Distributed Database Applications COSC 5050 Week One

Transcript of Distributed Database Applications COSC 5050 Week One.

Page 1: Distributed Database Applications COSC 5050 Week One.

Distributed Database Applications

COSC 5050Week One

Page 2: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Outline

IntroductionCourse overviewOracle client environmentData dictionaryLanguage fundamentalsProgram control

Page 3: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Introduction

Oracle databasePL/SQL Accessing Oracle serverDatabase objectsDDL and DML statements

Page 4: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

PL/SQLMany Oracle applications are built using client-server architecture

The Oracle database resides on the server

PL/SQL is like any other programming languagePL/SQL is not a stand-alone programming languagePL/SQL is a part of the Oracle RDBMS

Page 5: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

PL/SQL

Highly structured, readable, accessible languageStandard and portable languageEmbedded languageHigh-performance, highly integrated database language

Page 6: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Advantages of PL/SQL

Page 7: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

SQL ExampleThe semicolon terminates CREATE, INSERT, SELECT, and DROP statements

CREATE TABLE STUDENT( FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(20));

INSERT INTO STUDENT VALUES (‘JOHN’, ‘LUCKY’);

SELECT FIRST_NAME, LAST_NAME FROM STUDENT;

DROP TABLE STUDENT;

Page 8: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

PL/SQL Example

Page 7, 8, 9, 39 examplesWhen Oracle reads a PL/SQL block, a semicolon marks the end of the individual statement within the blockIt is not a block terminator!The “/” executes the PL/SQL block

Page 9: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Integration with SQLDECLARE l_book_count INTEGER;BEGIN SELECT COUNT(*) INTO l_book_count FROM books WHERE author LIKE '%Feuerstein, Steven%';

DBMS_OUTPUT.PUT_LINE( 'Steven have written (or co-written) ' || l_book_count || ' books.');

UPDATE books SET author = REPLACE (author, 'Steven', 'Stephen') WHERE author LIKE '%Feuerstein, Steven%';END;

Page 10: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Control and Conditional Logic

CREATE OR REPLACE PROCEDURE pay_out_balance( account_id_in IN accounts.id%TYPE)IS l_balance_remaining NUMBER;BEGIN LOOP l_balance_remaining := account_balance (account_id_in);

IF l_balance_remaining < 1000 THEN EXIT; ELSE apply_balance ( accont_id_in, l_balance_remaining); END IF; END LOOP;END pay_out_balance;

Page 11: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

When Things Go WrongCREATE OR REPLACE PROCEDURE check_account(account_id_in IN accounts.id%TYPE)IS l_balance_remaining NUMBER; l_balance_below_minimum EXCEPTION; l_account_name accounts.name%TYPE;BEGIN SELECT name INTO l_account_name FROM accounts WHERE id = account_id_in; l_balance_remaining := account_balance (account_id_in); DBMS_OUTPUT.put_line ( 'Balance for ' || l_account_name || ' = ' || l_balance_remaining); IF l_balance_remaining < 1000 THEN RAISE l_balance_below_minimum; END IF;EXCEPTION WHEN NO_DATA_FOUND THEN log_error (...); WHEN l_balance_below_minimum THEN log_error (...); RAISE;END;

Page 12: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Creating a Stored ProgramCREATE OR REPLACE FUNCTION wordcount (str IN VARCHAR2) RETURN PLS_INTEGERAS words PLS_INTEGER := 0; len PLS_INTEGER := NVL(LENGTH(str),0); inside_a_word BOOLEAN;BEGIN FOR i IN 1..len + 1 LOOP IF ASCII(SUBSTR(str, i, 1)) < 33 OR i > len THEN IF inside_a_word THEN words := words + 1; inside_a_word := FALSE; END IF; ELSE inside_a_word := TRUE; END IF; END LOOP; RETURN words;END;

Page 13: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Executing, Showing, and Dropping a Stored Program

BEGIN DBMS_OUTPUT.PUT_LINE(

'There are ' || wordcount(CHR(9)) || ' words in a tab'); END;

SELECT * FROM USER_OBJECTS;

DESC wordcount

SELECT TEXT FROM USER_SOURCE WHERE NAME = 'WORDCOUNT';

DROP FUNCTION wordcount;

Page 14: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Access OracleOracle server (service and host name)

cronus, icarus.webster.edu

Oracle clientOracle 11g client downloadSQL*PlusSQL DeveloperApplication Express (APEX) Workspace

Your login and password

Page 15: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Oracle SQL*Plus

Page 16: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Oracle SQL Developer

Page 17: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Oracle APEX

Page 18: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Data Dictionary

USER_ALL_DBA_

select view_name from all_views where view_name like 'USER%';

Page 19: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Language FundamentalsPL/SQL block structure

ModularizationScope

Anonymous blocksNamed blocks

ProceduresFunctions

Scope and visibility

Page 20: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

PL/SQL Block StructureHeaderDeclaration sectionExecution sectionException sectionPROCEDURE get_happy (ename_in IN VARCHAR2)IS hiredata DATE;BEGIN hiredate := SYSDATE – 2; INSERT INTO employee (emp_name, hiredate) VALUES (ename_in, hiredate);EXCEPTION WHEN dup_val_in_index THEN DBMS_OUTPUT.PUT_LINE (‘Cannot insert.’);END;

Page 21: Distributed Database Applications COSC 5050 Week One.

Jiangping Wang

No headerBegin with either DECLARE or BEGINCannot be called

Webster University Distributed Database Applications

Anonymous Blocks

BEGIN DBMS_OUTPUT.PUT_LINE (SYSDATE);END;

DECLARE l_right_now DATE := SYSDATE;BEGIN DBMS_OUTPUT.PUT_LINE (l_right_now);END;

Page 22: Distributed Database Applications COSC 5050 Week One.

Jiangping Wang

ProceduresFunctions

Webster University Distributed Database Applications

Named Blocks

procedure Add_employee (ssn in varchar2, fname in varchar2, lname in varchar2, dept_num in number, code in number, sup_ssn in varchar2)

is begin

insert into employee values (ssn, fname, lname, dept_num, code, sup_ssn);

end; -- Add_employee

Page 23: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Named Blocksfunction get_department(ssn_in in employee.ssn%type) return department.dept_name%typeis l_dept_name department.dept_name%type;begin select dept_name into l_dept_name from department inner join employee on employee.dept_num = department.dept_num where ssn = ssn_in; dbms_output.put_line('department name: ' || l_dept_name); return l_dept_name;exception when no_data_found then dbms_output.put_line( 'no such employee or not in any department!'); return null;end;

Page 24: Distributed Database Applications COSC 5050 Week One.

Jiangping Wang

Named Blocks in DB2

Webster University Distributed Database Applications

CREATE PROCEDURE sum( IN p_a INTEGER, IN p_b INTEGER, OUT p_s INTEGER) LANGUAGE SQL BEGIN SET p_s = p_a + p_b; END;

CALL sum(100,200,?);

Page 25: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

Language FundamentalsPL/SQL character setCase-insensitive languageIdentifiers

Up to 30 characters in lengthMust start with a letterCan include $, _, and #Cannot contain spaces

PL/SQL keywordsComments

Single-line comments using “--”Multi-line comments using /* … */

Page 26: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

PL/SQL Character Set

Type Characters

Letters A-Z, a-z

Digits 0-9

Symbols ~ ! @ # $ % * ( ) _ - + = | : ; " ' < > , . ? / ^

Whitespace Tab, space, newline, carriage return

Page 27: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

Program ControlIF statementsCASELOOPWHILE loopCursor loop

Page 28: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

IF StatementIF salary > 40000THEN give_bonus (employee_id, 500);END IF;

IF salary <= 40000THEN give_bonus (employee_id, 0);ELSE give_bonus (employee_id, 500);END IF;

declare salary number := 40000;begin IF salary > 40000 THEN dbms_output.put_line('Salary is greater than 40000'); ELSE dbms_output.put_line('Salary is not greater than 40000'); END IF;end;/

Page 29: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

IF Statementdeclare salary number := &salary;begin IF salary BETWEEN 10000 AND 20000 THEN dbms_output.put_line('Give bonus 1500.'); ELSIF salary BETWEEN 20000 AND 40000 THEN dbms_output.put_line('Give bonus 1000.'); ELSIF salary > 40000 THEN dbms_output.put_line('Give bonus 500.'); ELSE dbms_output.put_line('Give bonus 0.'); END IF;end;/

Page 30: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

CASE Statement

declare salary_level number := &salary;begin case salary_level when 1 then dbms_output.put_line('give bonus 1500.'); when 2 then dbms_output.put_line('give bonus 1000.'); when 3 then dbms_output.put_line('give bonus 500.'); else dbms_output.put_line('give bonus 0.'); end case;end;/

Simple CASE statement

Page 31: Distributed Database Applications COSC 5050 Week One.

Jiangping Wang

Searched CASE statement

Distributed Database Applications

CASE Statement

declare salary number := &salary;begin case when salary between 10000 and 20000 then dbms_output.put_line('give bonus 1500.'); when salary between 20000 and 40000 then dbms_output.put_line('give bonus 1000.'); when salary > 40000 then dbms_output.put_line('give bonus 500.'); else dbms_output.put_line('give bonus 0.'); end case;end;/

Page 32: Distributed Database Applications COSC 5050 Week One.

Jiangping Wang

CASE expression

Distributed Database Applications

CASE Statement

declare salary number := &salary; bonus_amount number;begin bonus_amount := case when salary BETWEEN 10000 AND 20000 THEN 1500 when salary BETWEEN 20000 AND 40000 THEN 1000 when salary > 40000 THEN 500 else 0 end; dbms_output.put_line( 'Give bonus ' || bonus_amount || '.');end;/

Page 33: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

Loop Statement

Simple loopFOR loopWHILE loopCursor FOR loop

Page 34: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

Simple LoopPROCEDURE set_all_ranks (max_rank_in IN INTEGER)

IS

ranking_level NUMBER (3) := 1;

BEGIN

LOOP

EXIT WHEN ranking_level > max_rank_in;

set_rank (ranking_level);

ranking_level := ranking_level + 1;

END LOOP;

END set_all_ranks;

Use EXIT or EXIT WHEN to exit loop

Page 35: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

For LoopPROCEDURE set_all_ranks (max_rank_in IN INTEGER)

IS

ranking_level NUMBER (3) := 1;

BEGIN

FOR ranking_level IN 1 .. max_rank_in

LOOP

set_rank (ranking_level);

END LOOP;

END set_all_ranks;

Reverse loop:

FOR counter IN REVERSE 1 .. max

LOOP

END LOOP;

Page 36: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

WHILE LoopPROCEDURE set_all_ranks (max_rank_in IN INTEGER)

IS

ranking_level NUMBER (3) := 1;

BEGIN

WHILE ranking_level <= max_rank_in

LOOP

set_rank (ranking_level);

ranking_level := ranking_level + 1;

END LOOP;

END set_all_ranks;

Page 37: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

Cursor FOR Loop

Cursor with simple loop

DECLARE CURSOR name_cur IS SELECT lname, fname FROM employee WHERE ssn like '8%'; name_rec name_cur%ROWTYPE;BEGIN OPEN name_cur; LOOP FETCH name_cur INTO name_rec; EXIT WHEN name_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE( name_rec.fname || ' ' || name_rec.lname); END LOOP; CLOSE name_cur;END;/

Page 38: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

Cursor FOR Loop

Cursor with simple loop

DECLARE CURSOR occupancy_cur IS SELECT pet_id, room_number FROM occupancy WHERE occupied_dt = TRUNC(SYSDATE); occupancy_rec occupancy_cur%ROWTYPE;BEGIN OPEN occupancy_cur; LOOP FETCH occupancy_cur INTO occupancy_rec; EXIT WHEN occupancy_cur%NOTFOUND; update_bill (occupancy_rec.pet_id, occupancy_rec.room_number); END LOOP; CLOSE occupancy_cur;END;

Page 39: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

Cursor FOR Loop

Cursor For loop

DECLARE CURSOR occupancy_cur IS SELECT pet_id, room_number FROM occupancy WHERE occupied_dt = TRUNC(SYSDATE);BEGIN FOR occupancy_rec IN occupancy_cur LOOP update_bill (occupancy_rec.pet_id, occupancy_rec.room_number); END LOOP;END;

Page 40: Distributed Database Applications COSC 5050 Week One.

Jiangping WangDistributed Database Applications

Cursor FOR Loop

Cursor FOR loop

DECLARE

CURSOR name_cur IS

SELECT lname, fname

FROM employee WHERE ssn like '8%';

BEGIN

FOR name_rec IN name_cur

LOOP

DBMS_OUTPUT.PUT_LINE(

name_rec.fname || ' ' || name_rec.lname);

END LOOP;

END;

/

Page 41: Distributed Database Applications COSC 5050 Week One.

Jiangping WangWebster University Distributed Database Applications

HomeworkGiven the table layout, write the SQL to create the tableCreate a script file to load database tableCreate an anonymous PL/SQL block to retrieve data from above database tableCreate a simple procedure in your DB2 Company schema to retrieve employee dataProject proposal