Transcript Document

Wykład 4
Obiektowość w obiektoworelacyjnych bazach danych na
przykładzie Oracle
SZB, L.Banachowski
1
Rodzaje obiektów
1. Obiekty typów obiektowych
2. Duże obiekty LOB
3. Java składowana w bazie danych
SZB, L.Banachowski
2
Zasadnicze pytanie
Bazy danych są na ogół relacyjne, a aplikacje klienckie obiektowe.
Dlaczego nie przejść na bazy danych obiektowe?
1. Prawe wszystkie dane są aktualnie przechowywane w tabelach
relacyjnych.
2. Obiektowe bazy danych wydają się być mniej wydajne.
3. Relacyjne bazy danych mogą być projektowane i używane
przez osoby, które nie są programistami.
Jak zbliżyć do siebie oba niespójne względem siebie
modele danych?
SZB, L.Banachowski
3
Typ obiektowy
• Złożony typ danych definiowany przez użytkownika.
Metoda
Wyślij
Id_zam
Info_klient
Pozycje
Status
Anuluj
Atrybut
Wyśw_Status
• Hermetyzuje strukturę danych łącznie z metodami
potrzebnymi do operowania na strukturze danych.
Zatrzymaj
SZB, L.Banachowski
4
Struktura typu obiektowego
Specyfikacja typu
Publiczny
interfejs
Deklaracje atrybutów
Specyfikacje metod
Ciało typu
Prywatna
implementacja
SZB, L.Banachowski
Ciała metod
5
Tworzenie specyfikacji typu
obiektowego
Składnia
CREATE TYPE nazwa_typu AS OBJECT
[(atrybut1 typdanych,
atrybut2 typdanych,
. . .]
[MEMBER procedura1 | funkcja1 spec,
procedura2 | funkcja2 spec,
. . .)]
SZB, L.Banachowski
6
Tworzenie ciała typu obiektowego
Składnia
CREATE TYPE BODY nazwa_typu AS
[MEMBER procedura1 | funkcja1 body,
procedura2 | funkcja2 body,
. . .]
END
SZB, L.Banachowski
7
Przykład
SQL> CREATE TYPE name_typ AS OBJECT(
f_name VARCHAR2(25),
l_name VARCHAR2(25),
initials
VARCHAR2(7),
MEMBER FUNCTION full_name RETURN VARCHAR2,
PRAGMA RESTRICT_REFERENCES( full_name,
WNDS, RNDS, WNPS, RNPS ));
SZB, L.Banachowski
8
Przykład
SQL> CREATE TYPE BODY name_typ AS
MEMBER FUNCTION full_name RETURN VARCHAR2
IS
BEGIN
RETURN (l_name || ' ' || f_name );
END full_name;
END;
SZB, L.Banachowski
9
Przykład
SQL> CREATE TYPE emp_typ AS OBJECT(
emp_id
NUMBER(7),
name
name_typ, -- typ obiektowy
street
VARCHAR2(25),
city
VARCHAR2(15),
state
CHAR(2),
zip
INTEGER,
MEMBER FUNCTION get_name RETURN VARCHAR2,
PRAGMA RESTRICT_REFERENCES(get_name,
WNDS, RNDS, WNPS, RNPS),
MEMBER PROCEDURE set_l_name (v_name VARCHAR2));
SZB, L.Banachowski
10
Przykład
SQL> CREATE TYPE BODY emp_typ AS
MEMBER FUNCTION get_name RETURN VARCHAR2
IS
BEGIN
RETURN (name.l_name ||' '|| name.f_name);
END;
MEMBER PROCEDURE set_l_name (v_name VARCHAR2)
IS
BEGIN
name.l_name := v_name;
END;
END;
SZB, L.Banachowski
11
Rodzaje metod
v
MEMBER – z niejawnym pierwszym parametrem
SELF – definiowanego typu danych.
– Metody służące do porównywania obiektów.
v
v
STATIC – bez SELF; wywoływane
type_name.method
(np. metody konstruktorów obiektów definiowane
przez użytkowników).
Implementowane w PL/SQL, Java, C.
SZB, L.Banachowski
12
Rodzaje metod
v
v
Metody konstruktorów obiektów – jeden
zdefiniowany przez system (parametrami są
atrybuty obiektu), inne przez użytkownika.
Metody porównywania:
– MAP – przez odwzorowanie układu wartości
atrybutów na liczbę;
– ORDER – bezpośrednio wylicza wynik porównania
dwóch obiektów < to -1, = to 0, > to 1.
SZB, L.Banachowski
13
MAP
CREATE TYPE rectangle_typ AS OBJECT
( len NUMBER,
wid NUMBER,
MAP MEMBER FUNCTION area RETURN NUMBER);
CREATE TYPE BODY rectangle_typ AS
MAP MEMBER FUNCTION area RETURN NUMBER IS
BEGIN RETURN len * wid; END area;
END;
SZB, L.Banachowski
14
ORDER
CREATE TYPE location_typ AS OBJECT
( building_no NUMBER,
city VARCHAR2(40),
ORDER MEMBER FUNCTION match (l location_typ)
RETURN INTEGER );
CREATE TYPE BODY location_typ AS
ORDER MEMBER FUNCTION match (l location_typ)
RETURN INTEGER IS
BEGIN
IF building_no < l.building_no THEN RETURN -1;
ELSIF building_no > l.building_no THEN RETURN 1;
ELSE RETURN 0; END IF;
END;
END;
SZB, L.Banachowski
15
Dziedziczenie (jednokrotne)
SQL> CREATE TYPE Person AS OBJECT (
first VARCHAR2(50),
last VARCHAR2(50)) NOT FINAL;
SQL>
CREATE TYPE Emp UNDER Person (
salary NUMBER) FINAL;
SQL>
DECLARE
x Emp:=Emp('Jan','Kowalski',10000);
BEGIN
DBMS_OUTPUT.Put_line(x.first||' '||x.last
||' '||x.salary);
END;
NOT FINAL – wymagane aby móc definiować podtypy.
SZB, L.Banachowski
16
Typ bez instancji
NOT INSTANTIABLE
Nie posiada konstruktora. Nie można tworzyć
obiektów tego typu.
v
v
v
CREATE TYPE Address_t AS OBJECT(...) NOT
INSTANTIABLE NOT FINAL;
CREATE TYPE USAddress_t
UNDER Address_t(...);
CREATE TYPE IntlAddress_t
UNDER Address_t(...);
SZB, L.Banachowski
17
Metoda bez instancji
NOT INSTANTIABLE
v
v
v
v
Typ nie dostarcza implementacji metody.
Typ, który zawiera metody bez instancji,
musi sam być NOT INSTANTIABLE.
Typ bez instancji może być definiowany jako
podtyp typu z instancjami.
Typ bez instancji nie może być FINAL.
SZB, L.Banachowski
18
Polimorfizm
Przedefiniując dziedziczone metody w podtypie mamy możliwość
zdefiniowania innego sposobu wykonania metod na obiektach
podtypu.
Obiekt podtypu może być użyty w kodzie w miejsce obiektu
nadtypu – definiując dla różnych podtypów różne działania.
SZB, L.Banachowski
19
Przesłanianie
CREATE TYPE Figure AS OBJECT (
NOT INSTANTIABLE MEMBER FUNCTION area RETURN NUMBER
) NOT INSTANTIABLE NOT FINAL;
CREATE TYPE Rect UNDER Figure (
x NUMBER, y NUMBER,
OVERRIDING MEMBER FUNCTION area RETURN NUMBER);
CREATE TYPE BODY Rect AS
OVERRIDING MEMBER FUNCTION area RETURN NUMBER IS
BEGIN RETURN x*y; END;
END;
SZB, L.Banachowski
20
Informacje w słowniku danych Oracle
Informacje o typach obiektowych znajdują się w
•
USER_OBJECTS
Informacje o metodach typów obiektowych znajdują się w
• USER_METHOD_PARAMS,
• USER_METHOD_RESULTS,
• USER_TYPE_METHODS
SZB, L.Banachowski
21
Tworzenie tabeli obiektowej i
wywoływanie metod
SQL>
SQL>
SQL>
CREATE TABLE name_table OF name_typ;
INSERT INTO name_table
VALUES('Marilyn','Monroe','MM');
SELECT nt.f_name, nt.full_name()
FROM
name_table nt;
SZB, L.Banachowski
22
Widoki tabeli obiektowej
v
v
Tabela jedno-kolumnowa: każdy wiersz jest
obiektem; można wykonywać operacje
obiektowe.
Tabela wielokolumnowa: każdemu atrybutowi
obiektu odpowiada jedna kolumna.
Rodzaje obiektów
1. wierszowe
2. kolumnowe
SZB, L.Banachowski
23
Metoda konstruktora obiektu
SQL> CREATE TYPE tv_type AS OBJECT (
tv_category VARCHAR2(20),
screen_size
NUMBER(4));
DECLARE
v_new_tv
tv_type := tv_type('WEB tv', 32);
v_alt_tv
tv_type;
BEGIN
v_alt_tv := tv_type('Big Screen', 72);
END;
SQL> CREATE TABLE tv OF tv_type;
SQL> INSERT INTO tv VALUES(tv_type('Color tv', '28'));
SZB, L.Banachowski
24
SELECT na tabeli obiektowej
Wynikiem zbiór wierszy:
SELECT * FROM name_table p
WHERE p.l_name LIKE 'M%';
Wynikiem zbiór obiektów:
SELECT VALUE(p) FROM name_table p
WHERE p.l_name LIKE 'M%';
„Kanoniczna” reprezentacja obiektu w SQL*Plus:
-- NAME_TYP('Marilyn','Monroe','MM')
SZB, L.Banachowski
25
INSERT do tabeli obiektowej
Bezpośrednio:
BEGIN
INSERT INTO name_table
VALUES('Marilyn','Monroe','MM');
END;
Z użyciem konstruktora typu obiektowego:
BEGIN
INSERT INTO name_table
VALUES(name_typ('Marilyn','Monroe','MM'));
END;
SZB, L.Banachowski
26
UPDATE na tabeli obiektowej
BEGIN
UPDATE name_table p
SET
p.l_name = 'Janusz'
WHERE p.l_name = 'Jan';
END;
Z użyciem konstruktora typu obiektowego:
BEGIN
UPDATE name_table p
SET
p = name_typ('Janusz','Kowalski','JK')
WHERE p.l_name = 'Jan';
END;
SZB, L.Banachowski
27
DELETE na tabeli obiektowej
BEGIN
DELETE FROM name_table p
WHERE p.l_name = 'Janusz';
END;
SZB, L.Banachowski
28
Funkcja VALUE i pseudokolumna OBJECT_VALUE
SELECT VALUE(p)
SELECT OBJECT_VALUE
FROM person_obj_table p;
FROM person_obj_table;
Można ograniczyć do obiektów z podtypu:
SELECT VALUE(p)
FROM person_obj_table p
WHERE VALUE(p) IS OF (part_time_student_typ);
-- lub
SELECT VALUE(p)
FROM person_obj_table p
WHERE VALUE(p) IS OF (ONLY part_time_student_typ);
Można użyć do UPDATE:
UPDATE person_obj_table p
SET VALUE(p) = person_typ(12, 'Bob Jones', '1-800-555-1243')
WHERE p.idno = 12;
SZB, L.Banachowski
29
Tabela relacyjna
v
CREATE TABLE Emp1(
Empno NUMBER PRIMARY KEY,
Name Name_typ, -- kolumna typu obiektowego
Sal NUMBER,
Kier REFERENCES Emp1);
SZB, L.Banachowski
30
OID, REF
v
v
v
Każdy obiekt wierszowy jest jednoznacznie
identyfikowany przez swój systemowy, obiektowy
identyfikator OID, 16 bajtowy – stanowiący dodatkową,
indeksowaną, jednoznaczną kolumnę w tabeli
obiektowej (opcja OBJECT IDENTIFIER IS SYSTEM
GENERATED w CREATE TABLE) – opcja domyślna.
Gdy istnieje klucz główny, można jego wartości użyć jako
OID (opcja OBJECT IDENTIFIER IS PRIMARY KEY w
CREATE TABLE).
Referencja REF – logiczny wskaźnik do obiektu
wierszowego konstruowany z OID obiektu i metadanych.
SZB, L.Banachowski
31
Typ referencyjny
CREATE TYPE Dept_Type AS OBJECT(
Name VARCHAR2(10),
Loc VARCHAR2(50));
CREATE TABLE Obj_Dept
OF Dept_Type;
CREATE TYPE Emp_Type AS OBJECT(
Name VARCHAR2(20),
Sal Number,
Dept_ref REF Dept_Type );
CREATE TABLE Obj_Emp OF Emp_Type
(Dept_ref SCOPE IS Obj_Dept);
SZB, L.Banachowski
CREATE TABLE Rel_emp(
Id NUMBER PRIMARY KEY,
Name VARCHAR2(20),
Sal Number,
Dept_ref REF Dept_Type
SCOPE IS Obj_Dept);
32
Użycie referencji
SELECT o.name, o.Dept_Ref.name FROM
obj_emp o
NAME
DEPT_REF.NAME
-------------------- ------------------------KOWALSKI
KADRY
SZB, L.Banachowski
33
Użycie referencji
DECLARE
x REF Dept_Type;
BEGIN
SELECT REF(o) INTO x FROM obj_dept o
WHERE o.name='KADRY';
INSERT INTO obj_emp VALUES('KOWALSKI',2000,x);
END;
Operatory:
REF(o) – referencja do obiektu o
DEREF(x) – obiekt o referencji x.
SZB, L.Banachowski
34
Tworzenie tabeli obiektowej z obiektami
różnych podtypów
CREATE TABLE person_obj_table OF person_typ;
INSERT INTO person_obj_table
VALUES (person_typ(12, 'Bob Jones', '111-555-121'));
INSERT INTO person_obj_table
VALUES (student_typ(5, 'Joe Lan', ‘6555-131', 12, 'HISTORY'));
INSERT INTO person_obj_table
VALUES (employee_typ(55, 'Jane Smith', ‘6555-776', 100,
'Jennifer Nelson'));
INSERT INTO person_obj_table
VALUES (part_time_student_typ(52, 'Kim Patel', '1555-1232',
14, 'PHYSICS', 20));
SZB, L.Banachowski
35
Ograniczanie wartości w kolumnie tabeli
obiektowej
CREATE TYPE office_typ AS OBJECT
(office_id VARCHAR(10),
location location_typ,
occupant person_typ ) NOT FINAL;
CREATE TABLE office_tab OF office_typ
COLUMN occupant IS OF (ONLY employee_typ);
SZB, L.Banachowski
36
Kolekcje
Atrybut typu obiektowego lub kolumna tabeli może być
typu kolekcji:
1. VARRAY – typ tablicy jednowymiarowej (jak
wektor) o ustalonym maksymalnym rozmiarze;
2. TABLE – typ tabeli zagnieżdżonej o nie ustalonym
maksymalnym rozmiarze.
SZB, L.Banachowski
37
Przykład
v
v
v
CREATE TYPE Projekt AS OBJECT (
Num_proj NUMBER(3),
Tytuł VARCHAR2(35),
Koszt NUMBER(7,2));
CREATE TYPE Lista AS
VARRAY(3) OF Projekt;
CREATE TABLE Wydziały (
Id_wydz NUMBER(2),
Nazwa VARCHAR2(15),
Budżet NUMBER(11,2),
Projekty Lista);
SZB, L.Banachowski
38
Przykład c.d.
v
v
INSERT INTO Wydziały VALUES(1,'Informatyka',100000,
Lista(Projekt(1,'Analiza',123), Projekt(2,'Projekt',456)));
SELECT w.Projekty
FROM Wydziały w
WHERE w.Nazwa = ‘Informatyka’;
v
Projekty
------------------------------------------------------------------------------LISTA(PROJEKT(1,'Analiza',123),PROJEKT(2,'Projekt',456))
SZB, L.Banachowski
39
Kolekcje w PL/SQL
v
CREATE OR REPLACE PROCEDURE Wypisz AS
lis Lista;
BEGIN
FOR z IN (SELECT * FROM Wydzialy)
LOOP
DBMS_OUTPUT.Put_line('Proj. Wydziału: '||z.Nazwa);
lis:=z.Projekty;
FOR i IN 1..lis.Count LOOP
DBMS_OUTPUT.Put_line(lis(i).Num_proj||'
'||lis(i).Tytul);
END LOOP;
END LOOP;
END;
SZB, L.Banachowski
40
Cykliczność powiązań
v
v
v
CREATE TYPE Dept_Type; -- niepełna
specyfikacja typu Dept_Type
CREATE TYPE Emp_Type
AS OBJECT(
Name VARCHAR2(20),
Sal NUMBER,
Dept_ref REF Dept_Type);
CREATE TYPE Pracownicy AS
VARRAY(100) OF REF Emp_Type;
SZB, L.Banachowski
41
v
v
v
CREATE TYPE Dept_Type
-- powtórna, pełna specyfikacja typu Dept_Type
AS OBJECT(
Name VARCHAR2(10),
Loc VARCHAR2(50),
Kadra Pracownicy);
CREATE TABLE Obj_Dept OF Dept_Type;
CREATE TABLE Obj_Emp OF Emp_Type
(Dept_ref SCOPE IS Obj_Dept);
SZB, L.Banachowski
42
Składowanie obiektów
Każdy obiektowy typ danych określa drzewo, w którego liściach
znajdują się:
• atrybuty prostych typów danych jak NUMBER, VARCHAR2 lub
REF;
• atrybuty typów kolekcji;
• atrybuty typów obiektowych rozwijają się w poddrzewa
odpowiadające ich typom, jak również w poddrzewa wszystkich
podtypów ich typów.
Tabela obiektowa jest reprezentowana przez tabelę relacyjną, której
kolumny odpowiadają atrybutom tego drzewa plus kolumny
odpowiadające atrybutom drzew wszystkich podtypów danego typu.
SZB, L.Banachowski
43
Składowanie obiektów
• Oracle dodaje dodatkowe kolumny do tworzonej tabeli relacyjnej:
• dla generowanego przez system OID obiektu;
• dla każdego reprezentowanego typu – wartość logiczna czy
NULL;
• dla każdego reprezentowanego typu posiadającego podtypy
kolumnę określającą podtyp aktualnego obiektu (typeid).
• VARRAY jest zapisywane jako pojedyncza wartość INLINE lub
BLOB.
• Dla kolumny typu tabeli zagnieżdżonej jest określona jedna tabela
relacyjna z wierszami wszystkich tabel zagnieżdżonych zapisywanej
w tej kolumnie.
SZB, L.Banachowski
44
Perspektywy obiektowe
Alternatywnie, można samemu zdefiniować relacyjną bazę danych i
udostępniać ją jako obiektową za pomocą perspektyw
obiektowych.
1. Zdefiniowanie typu obiektowego: atrybuty odpowiadają
istniejącym kolumnom tabel relacyjnych.
2. Zapisanie zapytania określającego jak wydobywać dane z tabel
relacyjnych – kolumny w takiej kolejności jak atrybuty typu
obiektowego.
3. Określenie jednoznacznego identyfikatora umożliwiającego
tworzenie wskaźników do obiektów w perspektywie (np.
istniejący klucz główny).
4. W przypadku złożonej perspektywy można użyć wyzwalaczy
INSTEAD OF do przeprowadzania modyfikacji danych w
perspektywie obiektowej.
SZB, L.Banachowski
45
Przykład
1.
CREATE TABLE emp_table
(empnum NUMBER (5), ename VARCHAR2 (20),
salary NUMBER (9,2), job VARCHAR2 (20));
2.
CREATE TYPE employee_t AS OBJECT
(empno NUMBER (5), ename VARCHAR2 (20),
salary NUMBER (9,2), job VARCHAR2 (20));
3.
CREATE VIEW emp_view OF employee_t
WITH OBJECT IDENTIFIER (empno) AS
SELECT e.empnum, e.ename, e.salary, e.job
FROM emp_table e WHERE e.job = 'Developer';
SZB, L.Banachowski
46
REFERENCJE w perspektywie obiektowej
CREATE TYPE dept_t AS OBJECT (
deptno NUMBER, deptname VARCHAR2(20), address address_t);
CREATE VIEW dept_view OF dept_t WITH OBJECT
IDENTIFIER (deptno) AS
SELECT d.deptno, d.deptname,
address_t(d.deptstreet,d.deptcity,d.deptstate,d.deptzip) AS deptaddr
FROM dept d;
CREATE TYPE emp_t AS OBJECT (
empno NUMBER, ename VARCHAR2(20), salary NUMBER,
deptref REF dept_t);
CREATE OR REPLACE VIEW emp_view OF emp_t WITH
OBJECT IDENTIFIER(empno) AS
SELECT e.empno, e.empname, e.salary,
MAKE_REF(dept_view, e.deptno) FROM emp e;
SZB, L.Banachowski
47
Podtabela (nie w Oracle)
CREATE TABLE demo_table (
id INTEGER PRIMARY KEY,
txtdata VARCHAR(20)) ;
CREATE TABLE demo_sub_table (
new_col VARCHAR(10),
UNDER demo_table ) ;
Wiersze wstawione do nad-tabeli demo_table, nie są widoczne przez
select na pod-tabeli.
Wiersze wstawione do pod-tabeli są widoczne przez select na nadtabeli.
W oparciu o: http://docs.openlinksw.com/virtuoso/CREATETABLE.html#under
SZB, L.Banachowski
48
Duże obiekty LOB
• Atrybut typu obiektowego
• Kolumna w tabeli
• Wartość zmiennej w PL/SQL
Foto
(BLOB)
Przepis
(CLOB)
SZB, L.Banachowski
Film
(BFILE)
49
Anatomia obiektu LOB
DECLARE
lobloc BLOB;
BEGIN
SELECT col1 INTO lobloc
FROM LOB_Table WHERE col2=123;
END;
Lokator LOB
Wartość LOB
SZB, L.Banachowski
50
Wewnętrzne obiekty LOB
Foto
(BLOB)
Przepis
(CLOB)
SZB, L.Banachowski
51
Tabela z obiektami LOB
SQL>
2
3
4
5
CREATE TABLE employee
(emp_id
NUMBER,
emp_name
VARCHAR2(35),
resume
CLOB,
picture
BLOB);
SZB, L.Banachowski
52
Zewnętrzne obiekty LOB zapisywane w pliku systemu
operacyjnego
Film (BFILE)
SZB, L.Banachowski
53
Obiekt bazy danych - katalog
DIRECTORY
DIRECTORY
lob_path =
'/oracle/lob/'
Film (BFILE)
SZB, L.Banachowski
54
Posługiwanie się obiektami LOB
• Pakiet DBMS_LOB
• Wsparcie SQL - tabele, funkcje EMPTY_CLOB(), ...
• Katalog DIRECTORY, funkcja BFILENAME
SZB, L.Banachowski
55
Wstawianie obiektów LOB
SQL> INSERT INTO employee VALUES
2> (7897,'Jan Kowalski','Znakomity aktor', NULL);
SQL> INSERT INTO employee VALUES
2> (7898,'Marilyn Monroe', EMPTY_CLOB(),
3> BFILENAME('IMG','MARILYN.IMG'));
SQL> UPDATE employee SET resume =
2> (SELECT resume FROM employee
3> WHERE emp_name='Default')
4> WHERE emp_id = 4508;
SZB, L.Banachowski
56
Dopisywanie do obiektów LOB w
PL/SQL
DECLARE
lobloc CLOB; -- lokator LOB
text VARCHAR2(2000);
amount NUMBER;
offset INTEGER;
BEGIN
text := 'tekst do wpisania do CLOB';
SELECT resume INTO lobloc
-- lokator LOB
FROM employee
WHERE emp_id = 5887 FOR UPDATE;
offset := DBMS_LOB.GETLENGTH(lobloc) + 1;
amount := length(text);
DBMS_LOB.WRITE (lobloc, amount, offset, text);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Wpisano ' ||
to_char(amount) ||' znaków');
END;
SZB, L.Banachowski
57
Usuwanie obiektów LOB
Usunięcie wiersza z obiektem LOB:
SQL>DELETE FROM person_tab
2 WHERE pname = 'Opie Griffith';
Usunięcie obiektu LOB w wierszu:
SQL>UPDATE person_tab SET resume = EMPTY_CLOB()
2 WHERE pname = 'Laura Roshto';
SZB, L.Banachowski
58
Pakiet DBMS_LOB
Modyfikacje
SZB, L.Banachowski
Tylko-odczyt
APPEND
COMPARE
COPY
FILEGETNAME
ERASE
INSTR
TRIM
GETLENGTH
WRITE
READ
FILECLOSE
SUBSTR
FILECLOSEALL
FILEEXISTS
FILEOPEN
FILEISOPEN
59
READ i WRITE
PROCEDURE READ (
lobsrc IN BFILE|BLOB|CLOB,
amount IN OUT BINARY_INTEGER,
offset IN INTEGER,
buffer OUT RAW|VARCHAR2 )
PROCEDURE WRITE (
lobdst IN OUT BLOB|CLOB,
amount IN OUT BINARY_INTEGER,
offset IN INTEGER := 1,
buffer IN RAW|VARCHAR2 ) -- RAW dla BLOB
SZB, L.Banachowski
60
Programowanie obiektowe w bazie danych Java składowana w bazie danych
 Kod Javy może być zapisywany w bazie danych oraz
może być realizowany na serwerze bazy danych tak jak kod
języka SQL – w ramach tej samej sesji i tej samej transakcji.
 Obiekty Javy tworzone przy wykonywaniu kodu nie są
składowane w bazie danych (tylko kod).
 Na serwerze bazy danych można wywołać tylko metody
statyczne klas Javy.
SZB, L.Banachowski
61
import java.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
public class GenericDrop {
public static void dropIt (String object_type, String object_name)
throws SQLException {
// Połącz się z bazą danych Oracle używając sterownika JDBC
Connection conn = new OracleDriver().defaultConnection();
// Zbuduj instrukcję SQL
String sql = "DROP " + object_type + " " + object_name;
try {
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
stmt.close();
}
catch (SQLException e) {System.err.println(e.getMessage());}
}
}
SZB, L.Banachowski
62
Pierwsza metoda
loadjava -user scott/tiger GenericDrop
W SQL*Plus:
CREATE OR REPLACE PROCEDURE DropIt(
obj_type VARCHAR2,
obj_name VARCHAR2)
AS LANGUAGE JAVA
NAME 'GenericDrop.dropIt(java.lang.String, java.lang.String)';
CALL DropIt('TABLE', 'Emp');
SZB, L.Banachowski
63
Druga metoda
CREATE AND COMPILE JAVA SOURCE NAMED "Hello" AS
public class hello {
public static String world() {
return "Hello World"; }
};
CREATE OR REPLACE FUNCTION HelloWorld RETURN
VARCHAR2 AS LANGUAGE JAVA
NAME 'hello.world() return java.lang.string';
myString VARCHAR2;
CALL HelloWorld() INTO :myString;
PRINT myString;
SZB, L.Banachowski
64