Date post: | 02-Jan-2016 |
Category: |
Documents |
Upload: | jordan-green |
View: | 216 times |
Download: | 1 times |
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