Project Implementation for COSC 5050 Distributed Database Applications Lab2.
Distributed Database Applications COSC 5050 Week One.
-
Upload
jordan-green -
Category
Documents
-
view
218 -
download
1
Transcript of Distributed Database Applications COSC 5050 Week One.
Distributed Database Applications
COSC 5050Week One
Jiangping WangWebster University Distributed Database Applications
Outline
IntroductionCourse overviewOracle client environmentData dictionaryLanguage fundamentalsProgram control
Jiangping WangWebster University Distributed Database Applications
Introduction
Oracle databasePL/SQL Accessing Oracle serverDatabase objectsDDL and DML statements
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
Jiangping WangWebster University Distributed Database Applications
PL/SQL
Highly structured, readable, accessible languageStandard and portable languageEmbedded languageHigh-performance, highly integrated database language
Jiangping WangWebster University Distributed Database Applications
Advantages of PL/SQL
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;
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
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;
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;
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;
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;
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;
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
Jiangping WangWebster University Distributed Database Applications
Oracle SQL*Plus
Jiangping WangWebster University Distributed Database Applications
Oracle SQL Developer
Jiangping WangWebster University Distributed Database Applications
Oracle APEX
Jiangping WangWebster University Distributed Database Applications
Data Dictionary
USER_ALL_DBA_
select view_name from all_views where view_name like 'USER%';
Jiangping WangWebster University Distributed Database Applications
Language FundamentalsPL/SQL block structure
ModularizationScope
Anonymous blocksNamed blocks
ProceduresFunctions
Scope and visibility
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;
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;
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
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;
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,?);
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 /* … */
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
Jiangping WangDistributed Database Applications
Program ControlIF statementsCASELOOPWHILE loopCursor loop
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;/
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;/
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
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;/
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;/
Jiangping WangDistributed Database Applications
Loop Statement
Simple loopFOR loopWHILE loopCursor FOR loop
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
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;
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;
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;/
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;
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;
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;
/
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