You are on page 1of 95

:

SQL-2 (SQL:1992)

SQL-3 (SQL:1999).





computational completeness.

((Abstraction))
(Encapsulation)
(Inheritance)

SQL-3
.
:
((distinct types)
y
)
(Structured types)

(distinct types)
,
y ..
integer,
integer varchar .

CREATE DISTINCT TYPE b_name_type


b
t
AS
VARCHAR(20) WITH COMPARISONS;
y WITH COMPARISONS


db2
,
(.., integer, date).

CREATE DISTINCT TYPE p_name_type AS


VARCHAR(20) WITH COMPARISONS;

CREATE DISTINCT TYPE headcount_type AS


INTEGER WITH COMPARISONS;
;
.

10

11


(, )
(, )
CREATE TABLE Business1
(Name varchar(20) not null primary key,
key
Headcount integer);
CREATE TABLE Person1
P
1
(Name varchar(20) not null primary key,
age integer);

12


,
.
insert into business1 values ('Jack', 20);
i
insert
t iinto
t person1
1 values
l
('J k' 35);
('Jack',
35)

13


.
select b.*, p.*
from person1 p, business1 b
where
h
p.name = b
b.name ;

14

15


(
(, )
(, ).
b_name_type

varchar(20)
( )

p_name_type
varchar(20).
CREATE TABLE Business2
(Name b_name_type not null primary key,
Headcount headcount_type);
yp );
CREATE TABLE Person2
(Name p_name_type
p name type not null primary key,
key
age int);

16


,
.
insert into business2 values ('Jack'
( Jack , 20);
insert into person2 values ('Jack', 35);

17


.
select b.*,
b * p.*
p*
from person2 p, business2 b
where p.name = b.name ;

18

19

20

.
.

.
y
y

.

.
y

21

(Attributes)
(Att ib t )
y (Methods)
y

.
:

22

y :
HisNurse Nurse;
HisNurse REF(Nurse);

23

Person

Employee

BusinessUnit

Student

Address_t

Manager

Architect

Brazil_addr_t

Germany_addr_t

US_addr_t

24

CREATE TYPE BusinessUnit_t AS (


N
Name
b
b_name_type,
t
Headcount INT)
REF USING INT
MODE DB2SQL;

25

CREATE TYPE

( )
.

VARCHAR(13).

.
.

26

27

28

CREATE TYPE Address_t AS (


street VARCHAR(30),
number CHAR(15),
city VARCHAR(30),
state VARCHAR(10))
MODE DB2SQL;
CREATE TYPE Germany_addr_t UNDER Address_t AS (
family_name VARCHAR(30))
MODE DB2SQL;
CREATE TYPE Brazil_addr_t UNDER Address_t AS (
neighborhood VARCHAR(30))
MODE DB2SQL;
CREATE TYPE US_addr_t UNDER Address_t AS (
zip CHAR(10))
MODE DB2SQL;

UNDER
. Germany_addr_t
Germany addr t
Address_t
.

29

30

31

CREATE TYPE Person_t AS (


Name p_name_type,
Age INT,
Address Address_t)
Address t)
INSTANTIABLE
REF USING VARCHAR(13) FOR BIT DATA
MODE DB2SQL;
INSTANTIABLE ( default)
()
. NOT INSTANTIABLE

32

CREATE TYPE Employee_t


Employee t UNDER Person_t
Person t AS (
SerialNum INT,
Salary INTEGER,
D t REF(BusinessUnit_t))
Dept
REF(B i
U it t))
MODE DB2SQL;

Dept
p REF(BusinessUnit
(
_t))
. Dept
BusinessUnit_t

33

CREATE TYPE Student_t


Student t UNDER Person_t
Person t AS
(SerialNum CHAR(6),
GPA DOUBLE)
MODE DB2SQL;
DB2SQL
CREATE TYPE Manager_t UNDER Employee_t AS
(Bonus INTEGER)
MODE DB2SQL;
CREATE TYPE Architect_t UNDER Employee_t AS
(StockOption INTEGER)
MODE DB2SQL;

34

35

36

37

CREATE TABLE BusinessUnit OF BusinessUnit_t


(REF IS Oid USER GENERATED);

BusinessUnit
BusinnessUnit_t.


BusinessUnit BusinessUnit_t



(Oid)
(Oid).

"" Oid
REF IS ... USER GENERATED


"Oid"
.

38

INSERT INTO BusinessUnit (Oid, Name, Headcount)


VALUES(BusinessUnit_t(1), 'Toy', 15);


Oid
.

39

40

41

, U User Defined , H

Reference,

42

43

CREATE TABLE Person OF Person_t


(REF IS Oid USER GENERATED);
CREATE TABLE Employee OF Employee_t UNDER Person
INHERIT SELECT PRIVILEGES
(SerialNum WITH OPTIONS NOT NULL,
Dept WITH OPTIONS SCOPE BusinessUnit );

INHERIT SELECT PRIVILEGES


y



.
.

WITH OPTIONS NOT NULL


y . ,

E l
Employee

S i lN
SerialNum

Dept WITH OPTIONS SCOPE BusinessUnit


y Dept

Employee.
Employee
Employee2 Employee_t Dept
.
.

44


varchar(13). O default
.

45

CREATE TABLE Student OF Student_t UNDER Person


INHERIT SELECT PRIVILEGES;
CREATE TABLE Manager OF Manager_t UNDER Employee
INHERIT SELECT PRIVILEGES;
CREATE TABLE Architect OF Architect_t UNDER Employee
INHERIT SELECT PRIVILEGES;

46


.
.

47

INSERT INTO Person


P
(Oid,
(Oid Name,
N
A
Age, address)
dd
)
VALUES (Person_t('z'), 'Tasos', 20,
address_t( )
..street('Bakely Avenue')
..number('555')
..city('San Jose')
..state('CA'));
Person_t('z'):
_ ( )

.
address . ,
.

48

INSERT INTO Employee


E l
(Oid,
(Oid Name,
N
A
Age, SerialNum,
S i lN
S l
Salary,
D
Dept)
t)
VALUES (Employee_t('d'), 'Dennis', 26, 105, 30000, BusinessUnit_t(1));

Employee_t('d') .
BusinessUnit_t(1)
.

49

Select Name, Age


from Person;

Person
Employee

50

Select Name, Salary, Dept->Name


From Employee;

51

Select Name, Age


From ONLY(Employee);

ONLY



employee

Employee

52

Select Name, Age


From Employee
p y
E
Where E.Age > 35 and DEREF(E.OID) IS OF (Manager_t,
Architect_t);

Anna

Manager_t
Architect_t

53

SELECT p.Name, p.Address..street, p.Address..number


FROM Person
P
p

..

54

Select Name, Age, oid


F
From
P
Person
Where age > 35;

Select Name, Age, oid


From Employee
Where age > 35;
Select
S
l t oid
id
From BusinessUnit;

55

56

57

58


CREATE TYPE ALTER
TYPE.

:
ALTER TYPE Manager_t
ADD METHOD total_salary()
RETURNS integer
LANGUAGE SQL;

59

60

61

CREATE TYPE address_t2


dd
t2 AS
(STREET VARCHAR(30),
NUMBER CHAR(15)
CHAR(15),
CITY
VARCHAR(30),
STATE
VARCHAR(10))
MODE DB2SQL
METHOD SAMEZIP (addr address_t2)
RETURNS INTEGER
LANGUAGE SQL
CONTAINS SQL
.

62

63

CREATE METHOD


.

:
y ,
y SQL.
SQL

64

CREATE METHOD _

(_1
(

1 1,

1 ))
RETURNS __ FOR ___
RETURN SQL
SQL-command
command

65

:
CREATE METHOD total_salary()
RETURNS integer FOR Manager_t
RETURN select SELF..Salary + SELF..Bonus from manager;

CREATE METHOD total_salary()


RETURNS INTEGER FOR Manager_t
RETURN SELF..Salary + SELF..Bonus;

66

67

:
( )
_
y()
select name, DEREF(oid)..total_salary()
from Manager;

Select name, oid-> total_salary()


From Manager;

68

Manager_t
ALTER TYPE Manager_t
M
t ADD METHOD comparesalary
l
( l manager_t)
(sal
t)
RETURNS integer
LANGUAGE SQL;

CREATE METHOD comparesalary (sal manager_t)


RETURNS INTEGER
FOR manager_t
RETURN
(CASE
WHEN (self..salary >= sal..salary)
THEN 1
ELSE 0
END)

select m1
m1.name,
name m2
m2.name,
name DEREF(m1
DEREF(m1.oid)..comparesalary(deref(m2.oid))
oid) comparesalary(deref(m2 oid))
from Manager M1, Manager M2
Where m1.oid != m2.oid

69

70

71

1
1.






:
DROP METHOD TOTAL_SALARY FOR MANAGER_T;;
.
2.

,,

ALTER TYPE MANAGER_T DROP METHOD TOTAL_SALARY

72



.
:
1.

Java, C
2. SQL
SQL return
3. Sourced

73


y ,
y ,

y .

74

Create definition in db2



.
1. ,
2.
3 RETURNS
3.
4. SQL
5.
6.
7. ( !)
(
INT,, value2 INT))
CREATE FUNCTION BitAnd(value1
RETURNS integer
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'DB2Appl1!testUDF';

75

Java code
import java
java.sql.*;
sql *;
import java.lang.*;
import COM.ibm.db2.app.*;
class DB2Appl1 extends UDF {
public static int testUDF(int value1, int value2) {
try {
return(value1 & value2);
}
catch(Exception e) {
return(0);
( );
}
}
}
class directory
c:\Program Files\IBM\SQLLIB\FUNCTION

76


SELECT name, BitAnd(110,headcount)
Bi A d(110 h d
)
FROM Business1;

77

78

Create definition in db2


2
2o

CREATE FUNCTION concat(value1 varchar(20),


varchar(20) value2
varchar(20))
RETURNS varchar(40)
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'DB2Appl2!concatstrings';

79

80

Java code
import java
java.sql.*;
sql *;
import java.lang.*;
import COM.ibm.db2.app.*;
class DB2Appl2 extends UDF {
public static String concatstrings(String value1, String value2) {
String value3 = value1 + value2;
return value3;
}
}

81


create table personexample(
code integer not null primary key,
Surname varchar(20),
Name varchar(20));
( ));
insert into personexample values (1,'Obama', 'Barak');
insert into personexample values (2
(2,'Bush'
Bush , 'George');
George );
SELECT name
name, concat(name,surname)
concat(name surname)
FROM personexample;
.

82

83

SQL Return
. Select

.

84

create function agef(birthdate date)


g
returns integer
language SQL
contains SQL
return year(current_date) - year(birthdate);

85

create
t table
t bl a((
aname char(20) not null primary key,
afield date);
insert into a values ('John', '1/1/1970'),
('George', '1/6/1980');
select aname, agef(afield)
from a;

86

87

CREATE FUNCTION oursum(nameofobjects integer)


RETURNS integer

LANGUAGE SQL
select
READS SQL DATA

NO EXTERNAL ACTION
BEGIN ATOMIC
DECLARE RESULTADO integer;
IF (nameofobjects = 1) THEN
SET RESULTADO = (Select Sum(Salary) From ONLY(Manager));
ELSEIF (nameofobjects = 2) THEN
SET RESULTADO = ((Select Sum(Salary)
(
y) From ONLY(Architect));
(
));
END IF;
RETURN RESULTADO;
END @
select distinct oursum(1)
from Employee;

88

SOURCE

: Head_Max
max
o

H d
Head_count
t


integer.
i t
CREATE FUNCTION Head_MAX(Headcount
(
_type)
yp )
RETURNS Headcount_type
SOURCE SYSIBM.max(INTEGER);
SELECT Head_Max(Headcount) as max
FROM Business2
.

89

90

RDBMS ,
ORDBMS
RDBMS

92

.

.
y ORDBMS SQL3, SQL2
y OODBMS OQL

SQL

93

ORDBMS DBMS
.
OODBMS




.
,
,
OO
OODBMS
S

DBMS
S
, ORDBMS

DBMS.

94

You might also like