Distributed Database Applications

advertisement
Distributed Database
Applications
COSC 5050
Week One
Outline
Introduction
Course overview
Oracle client environment
Data dictionary
Language fundamentals
Program control
Webster University
Distributed Database Applications
Jiangping Wang
Introduction
Oracle database
PL/SQL
Accessing Oracle server
Database objects
DDL and DML statements
Webster University
Distributed Database Applications
Jiangping Wang
PL/SQL
Many Oracle applications are built using
client-server architecture
The Oracle database resides on the server
PL/SQL is like any other programming
language
PL/SQL is not a stand-alone
programming language
PL/SQL is a part of the Oracle RDBMS
Webster University
Distributed Database Applications
Jiangping Wang
PL/SQL
Highly structured, readable, accessible
language
Standard and portable language
Embedded language
High-performance, highly integrated
database language
Webster University
Distributed Database Applications
Jiangping Wang
Advantages of PL/SQL
Webster University
Distributed Database Applications
Jiangping Wang
SQL Example
The 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;
Webster University
Distributed Database Applications
Jiangping Wang
PL/SQL Example
Page 7, 8, 9, 39 examples
When Oracle reads a PL/SQL block, a
semicolon marks the end of the
individual statement within the block
It is not a block terminator!
The “/” executes the PL/SQL block
Webster University
Distributed Database Applications
Jiangping Wang
Integration with SQL
DECLARE
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;
Webster University
Distributed Database Applications
Jiangping Wang
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;
Webster University
Distributed Database Applications
Jiangping Wang
When Things Go Wrong
CREATE 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;
Webster University
Distributed Database Applications
Jiangping Wang
Creating a Stored Program
CREATE OR REPLACE FUNCTION wordcount (str IN VARCHAR2)
RETURN PLS_INTEGER
AS
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;
Webster University
Distributed Database Applications
Jiangping Wang
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;
Webster University
Distributed Database Applications
Jiangping Wang
Access Oracle
Oracle server (service and host name)
cronus, icarus.acs.webster.edu
Oracle client
Oracle 11g client download
SQL*Plus
SQL Developer
Application Express (APEX) Workspace
Your login and password
Documentations
Webster University
Distributed Database Applications
Jiangping Wang
Oracle SQL*Plus
Webster University
Distributed Database Applications
Jiangping Wang
Oracle SQL Developer
Webster University
Distributed Database Applications
Jiangping Wang
Oracle APEX
Webster University
Distributed Database Applications
Jiangping Wang
Data Dictionary
USER_
ALL_
DBA_
select view_name from all_views where
view_name like 'USER%';
Webster University
Distributed Database Applications
Jiangping Wang
Language Fundamentals
PL/SQL block structure
Modularization
Scope
Anonymous blocks
Named blocks
Procedures
Functions
Scope and visibility
Webster University
Distributed Database Applications
Jiangping Wang
PL/SQL Block Structure
Header
Declaration section
Execution section
Exception section
PROCEDURE 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;
Webster University
Distributed Database Applications
Jiangping Wang
Anonymous Blocks
No header
Begin with either DECLARE or BEGIN
Cannot be called
BEGIN
DBMS_OUTPUT.PUT_LINE (SYSDATE);
END;
DECLARE
l_right_now DATE := SYSDATE;
BEGIN
DBMS_OUTPUT.PUT_LINE (l_right_now);
END;
Webster University
Distributed Database Applications
Jiangping Wang
Named Blocks
Procedures
Functions
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
Webster University
Distributed Database Applications
Jiangping Wang
Named Blocks
function get_department(ssn_in in employee.ssn%type)
return department.dept_name%type
is
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;
Webster University
Distributed Database Applications
Jiangping Wang
Named Blocks in DB2
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,?);
Webster University
Distributed Database Applications
Jiangping Wang
Language Fundamentals
PL/SQL character set
Case-insensitive language
Identifiers
Up to 30 characters in length
Must start with a letter
Can include $, _, and #
Cannot contain spaces
PL/SQL keywords
Comments
Single-line comments using “--”
Multi-line comments using /* … */
Webster University
Distributed Database Applications
Jiangping Wang
PL/SQL Character Set
Type
Characters
Letters
A-Z, a-z
Digits
0-9
Symbols
~!@#$%*()_-+=|:;"'<>,.?/^
Whitespace
Tab, space, newline, carriage return
Webster University
Distributed Database Applications
Jiangping Wang
Program Control
IF statements
CASE
LOOP
WHILE loop
Cursor loop
Distributed Database Applications
Jiangping Wang
IF Statement
IF salary > 40000
THEN
give_bonus (employee_id, 500);
END IF;
IF salary <= 40000
THEN
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;
/
Distributed Database Applications
Jiangping Wang
IF Statement
declare
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;
/
Distributed Database Applications
Jiangping Wang
CASE Statement
Simple CASE statement
declare
salary_level number := &salary;
begin
case salary_level
when 1 then
dbms_output.put_line('give bonus
when 2 then
dbms_output.put_line('give bonus
when 3 then
dbms_output.put_line('give bonus
else
dbms_output.put_line('give bonus
end case;
end;
/
Distributed Database Applications
1500.');
1000.');
500.');
0.');
Jiangping Wang
CASE Statement
Searched 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;
/
Distributed Database Applications
Jiangping Wang
CASE Statement
CASE expression
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;
/
Distributed Database Applications
Jiangping Wang
Loop Statement
Simple loop
FOR loop
WHILE loop
Cursor FOR loop
Distributed Database Applications
Jiangping Wang
Simple Loop
PROCEDURE 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
Distributed Database Applications
Jiangping Wang
For Loop
PROCEDURE 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;
Distributed Database Applications
Jiangping Wang
WHILE Loop
PROCEDURE 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;
Distributed Database Applications
Jiangping Wang
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;
/
Distributed Database Applications
Jiangping Wang
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;
Distributed Database Applications
Jiangping Wang
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;
Distributed Database Applications
Jiangping Wang
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;
/
Distributed Database Applications
Jiangping Wang
Homework
Given the table layout, write the SQL to
create the table
Create a script file to load database table
Create an anonymous PL/SQL block to
retrieve data from above database table
Create a simple procedure in your DB2
Company schema to retrieve employee data
Project proposal
Webster University
Distributed Database Applications
Jiangping Wang
Download