Advertisement
kanciastopantalones

sokspyr

Dec 8th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.24 KB | None | 0 0
  1. Laboratorium IOR – SZBD Oracle
  2. Robert Sokołowski, Marcin Spyra
  3. Informatyka SSM 08.12.2016
  4.  
  5.  
  6. 3. Rozszerzenia obiektowe Oracle
  7.  
  8. 3.1. Uruchomić narzędzie SQLDeveloper:
  9.  
  10. 3.2. Połączyć się z bazą orcl jako użytkownik sys:
  11.  
  12. 3.3. Uruchomić wskazany przez prowadzącego skrypt user.sql, tworzący nowego użytkownika.
  13.  
  14. 3.4. Połączyć się z bazą orcl jako użytkownik ora1. W tym celu utworzyć nowe połączenie:
  15.  
  16. 3.5. Uruchomić wskazany przez prowadzącego skrypt PRAC_ZESP_TEM_WYPL.sql, tworzący nowe tabele.
  17.  
  18. 3.6. Używając polecenia: CREATE OR REPLACE TYPE … AS OBJECT (…) …;
  19. zdefiniować typ obiektowy o nazwie book_type, reprezentujący książkę, który może być dziedziczony przez inne typy (opcja NOT FINAL). W ramach typu
  20.  
  21. zdefiniować 3 atrybuty:
  22. bookno NUMBER,
  23. title VARCHAR2(30),
  24. genre VARCHAR2(20)
  25. oraz 3 funkcje o nazwach: get_bookno, show_super i show.
  26.  
  27. ROZWIĄZANIE:
  28.  
  29. CREATE OR REPLACE TYPE book_type AS OBJECT(
  30. bookno NUMBER,
  31. title VARCHAR2(30),
  32. genre VARCHAR2(20),
  33. MEMBER FUNCTION get_bookno RETURN NUMBER,
  34. STATIC FUNCTION show_super(book_obj in book_type) RETURN VARCHAR2,
  35. MEMBER FUNCTION show RETURN VARCHAR2) NOT FINAL;
  36.  
  37.  
  38. 3.7. Używając polecenia: CREATE OR REPLACE TYPE BODY … AS … END;)
  39. zdefiniować implementacje zadeklarowanych w poprzednim punkcie metod.
  40.  
  41. ROZWIĄZANIE:
  42.  
  43. CREATE OR REPLACE TYPE BODY book_type AS
  44. MEMBER FUNCTION get_bookno RETURN NUMBER IS
  45. BEGIN
  46. RETURN (bookno);
  47. END;
  48.  
  49. STATIC FUNCTION show_super(book_obj in book_type) RETURN VARCHAR2 IS
  50. BEGIN
  51. RETURN ('Id: ' || TO_CHAR(book_obj.bookno) || ', Title: ' || book_obj.title);
  52. END;
  53.  
  54. MEMBER FUNCTION show RETURN VARCHAR2 IS
  55. BEGIN
  56. RETURN book_type.show_super( SELF );
  57. END;
  58. END;
  59.  
  60.  
  61. 3.8. Wyświetlić opis typu book_type:
  62. SELECT type, text
  63. FROM user_source
  64. WHERE name = 'BOOK_TYPE’;
  65.  
  66. ROZWIĄZANIE:
  67.  
  68. SELECT type, text
  69. FROM user_source
  70. WHERE name = 'BOOK_TYPE';
  71.  
  72.  
  73. 3.9. Utworzyć tabele obiektową o nazwie book_obj_table, będącą specjalnym rodzajem tabeli, w której każdy wiersz reprezentuje jeden obiekt typu book_type:
  74.  
  75. CREATE TABLE … OF …;
  76.  
  77. ROZWIĄZANIE:
  78.  
  79. CREATE TABLE book_obj_table OF book_type;
  80.  
  81.  
  82. 3.10. Wstawić do tabeli 3-4 przykładowe obiekty i wyświetlić jej zawartość używając kolejno fraz:
  83. SELECT * FROM…;
  84. SELECT value(t) FROM … t; --SQLPLUS
  85.  
  86. ROZWIĄZANIE:
  87.  
  88. INSERT INTO book_obj_table VALUES(1, 'Ksiazka 1', 'gatunek 1');
  89. INSERT INTO book_obj_table VALUES(2, 'Ksiazka 2', 'gatunek 2');
  90. INSERT INTO book_obj_table VALUES(3, 'Ksiazka 3', 'gatunek 3');
  91.  
  92. SELECT * FROM book_obj_table;
  93. SELECT value(t) FROM book_obj_table t;
  94.  
  95. Zaobserwować różnice. Które zapytanie zwraca wiersz, jako instancję klasy?
  96.  
  97. Pierwsze zapytanie zwraca wiersz. Drugie zapytanie zwraca jako instancje klasy.
  98.  
  99.  
  100. 3.11. Wyświetlić (SQLPLUS) zawartość niejawnej kolumny sys_nc_rowinfo$ tabeli book_obj_table.
  101.  
  102. ROZWIĄZANIE:
  103.  
  104. SELECT sys_nc_rowinfo$ FROM book_obj_table;
  105.  
  106.  
  107. 3.12. Wyświetlić (SQLPLUS) zawartość niejawnej kolumny sys_nc_oid$ tabeli book_obj_table.
  108.  
  109. ROZWIĄZANIE:
  110.  
  111. SELECT sys_nc_oid$ FROM book_obj_table;
  112.  
  113.  
  114. 3.13. Utworzyć tabelę o nazwie book_col_table i kolumnach: store_id NUMBER oraz books BOOK_TYPE, w której druga kolumna jest typu obiektowego.
  115.  
  116. ROZWIĄZANIE:
  117.  
  118. CREATE TABLE book_col_table (
  119. store_id NUMBER,
  120. books book_type
  121. );
  122.  
  123.  
  124. 3.14. Wpisać 3-4 zestawy danych do utworzonej w poprzednim punkcie tabeli. Do kolumny books należy wpisać dane poprzez obiekt.
  125.  
  126. ROZWIĄZANIE:
  127.  
  128. INSERT INTO "BOOK_COL_TABLE" VALUES ('1', BOOK_TYPE('5', 'Ksiazka1', 'Dramat'));
  129. INSERT INTO "BOOK_COL_TABLE" VALUES ('2', BOOK_TYPE('6', 'Ksiazka2', 'Horror'));
  130. INSERT INTO "BOOK_COL_TABLE" VALUES ('3', BOOK_TYPE('7', 'Ksiazka3', 'Popularnonaukowa'));
  131. INSERT INTO "BOOK_COL_TABLE" VALUES ('4', BOOK_TYPE('8', 'Ksiazka4', 'Fantastyka'));
  132.  
  133.  
  134. 3.15. Wyświetlić dane wpisane w polu title tabeli book_col_table.
  135.  
  136. ROZWIĄZANIE:
  137.  
  138. SELECT p.books.title FROM book_col_table p;
  139.  
  140.  
  141. 3.16. Utworzyć typ obiektowy book_type2, pozwalający reprezentować serie książek:
  142.  
  143. ROZWIĄZANIE:
  144.  
  145. CREATE TYPE book_type2 AS OBJECT (
  146. title VARCHAR2(30),
  147. serie REF book_type2);
  148.  
  149.  
  150. 3.17. Utworzyć kolejną tabelę obiektową book_obj_table2 typu book_type2.
  151.  
  152. ROZWIĄZANIE:
  153.  
  154. CREATE TABLE book_obj_table2 OF book_type2;
  155.  
  156.  
  157. 3.18. Wstawić dane dotyczące pierwszej książki z serii (REF ustawić na NULL) – np. tytuł pierwszej książki
  158. Trylogii H. Sienkiewicza.
  159.  
  160. ROZWIĄZANIE:
  161.  
  162. INSERT INTO book_obj_table2 VALUES('Ogniem i mieczem', NULL);
  163.  
  164.  
  165. 3.19. Wstawić dane dotyczące kolejnej książki, przy czym ustawić jej REF na książkę dodaną w poprzednim punkcie:
  166. INSERT INTO book_obj_table2 SELECT book_type2 (‘Ogniem i mieczem’, REF(t))
  167. FROM book_obj_table2 t
  168. WHERE t.title = ‘…’;
  169.  
  170. ROZWIĄZANIE:
  171.  
  172. INSERT INTO book_obj_table2 SELECT book_type2 ('Potop', REF(t))
  173. FROM book_obj_table2 t
  174. WHERE t.title = 'Ogniem i mieczem';
  175.  
  176.  
  177. 3.20. Wyświetlić informacje zapisane w tabeli:
  178. SELECT t.title, DEREF(t.serie).title FROM book_obj_table2 t;
  179.  
  180. ROZWIĄZANIE:
  181.  
  182. SELECT t.title, DEREF(t.serie).title FROM book_obj_table2 t;
  183.  
  184.  
  185. 3.21. Dla wcześniej utworzonych tabel wyświetlić pełną listę ich niejawnych kolumn (systemowa tabela słownikowa USER_TAB_COLS).
  186.  
  187. ROZWIĄZANIE:
  188.  
  189. SELECT * FROM USER_TAB_COLS WHERE TABLE_NAME = 'BOOK_OBJ_TABLE' OR TABLE_NAME = 'BOOK_OBJ_TABLE2';
  190.  
  191. Czy sprawdzane tabele mają inny zestaw tych kolumn, czy ten sam?
  192.  
  193. Sprawdzane tabele mają ten sam zestaw kolumn.
  194.  
  195.  
  196. 3.22. Utworzyć typ lista_ksiazek_wyp będący tablicą o zmiennej długości (max. 10) typu VARCHAR2(80).
  197.  
  198. ROZWIĄZANIE:
  199.  
  200. CREATE TYPE lista_ksiazek_wyp AS VARRAY(10) of varchar2(80);
  201.  
  202.  
  203. 3.23. Utworzyć typ lista_ksiazek będący tablicą książek.
  204.  
  205. ROZWIĄZANIE:
  206.  
  207. CREATE TYPE lista_ksiazek is TABLE of book_type;
  208.  
  209.  
  210. 3.24. Utworzyć tabelę o nazwie classes zawierającą zagnieżdżoną tablicę książek NESTED TABLE borrows
  211. STORE borrows_tab. Zdefiniować atrybuty:
  212. class_no NUMBER PRIMARY KEY,
  213. branch CHAR(4),
  214. lecture book_type DEFAULT book_type(1,'Dziady',’dramat’),
  215. borrows book_type DEFAULT book_type()
  216.  
  217. ROZWIĄZANIE:
  218.  
  219. CREATE TABLE classes
  220. (
  221. class_no NUMBER PRIMARY KEY,
  222. BRANCH CHAR(4),
  223. lecture book_type DEFAULT book_type(1,'Dziady',’dramat’),
  224. borrows lista_ksiazek
  225. )
  226. NESTED TABLE borrows STORE AS borrows_tab;
  227.  
  228.  
  229. 3.25. Wpisać przykładowe dane do tabeli zdefiniowanej w poprzednim punkcie:
  230. INSERT INTO classes (class_no, branch, borrows) VALUES
  231. (1, 'a', book_type(
  232. ‘…’,
  233. ‘…’,
  234. …)
  235. );
  236.  
  237. ROZWIĄZANIE:
  238.  
  239. INSERT INTO classes (class_no, branch, borrows) VALUES
  240. (1, 'a', lista_ksiazek(
  241. book_type('7','Ksiazka1','Typ1'),
  242. book_type('8','Ksiazka2','Typ2')
  243. )
  244. );
  245.  
  246.  
  247. 3.26. Wyświetlić wpisane dane, wpisując zapytanie (tzw. rozgnieżdżanie kolekcji):
  248.  
  249. ROZWIĄZANIE:
  250.  
  251. SELECT e.*, d.*
  252. FROM classes d, TABLE(d.borrows) e;
  253.  
  254.  
  255. 3.27. Wyświetlić zawartość systemowej tablicy user_nested_tables.
  256.  
  257. ROZWIĄZANIE:
  258.  
  259. SELECT * FROM user_nested_tables;
  260.  
  261.  
  262. 3.28. Spróbować usunąć tabelę borrows_tab poleceniem DROP TABLE.
  263.  
  264. ROZWIĄZANIE:
  265.  
  266. DROP TABLE borrows_tab;
  267.  
  268. Co się stało?
  269.  
  270. Nie udało się usunąć tabeli.
  271.  
  272.  
  273. 3.29. Usunąć kolumnę tabeli zagnieżdżonej:
  274.  
  275. ROZWIĄZANIE:
  276.  
  277. ALTER TABLE classes DROP COLUMN borrows;
  278.  
  279. Czy stowarzyszona tabela została usunięta?
  280.  
  281. Stowarzyszona tabela została usunięta pomyślnie.
  282.  
  283. 3.30. Usunąć wcześniej stworzone typy o nazwie lista_ksiazek_wyp, lista_ksiazek.
  284.  
  285. ROZWIĄZANIE:
  286.  
  287. DROP TYPE lista_ksiazek_wyp;
  288. DROP TYPE lista_ksiazek;
  289.  
  290.  
  291. 3.31. Usunąć wcześniej stworzone tabele o nazwach: book_obj_table, book_obj_table2, szkola.
  292.  
  293. ROZWIĄZANIE:
  294.  
  295. DROP TABLE book_obj_table;
  296. DROP TABLE book_obj_table2;
  297. DROP TABLE classes;
  298.  
  299.  
  300. 3.32. Usunąć stworzony w punkcie 3.6 typ obiektowy o nazwie book_type oraz book_type2.
  301.  
  302. ROZWIĄZANIE:
  303.  
  304. DROP TYPE book_type FORCE;
  305. DROP TYPE book_type2;
  306.  
  307.  
  308. 4. XML w Oracle
  309.  
  310.  
  311. 4.1. Zadać zapytanie, wyświetlające dane zawarte w tabeli PRACOWNICY w formacie XML:
  312. SELECT nr_prac, XMLElement("PRACOWNICY",nazwisko ) AS "wynik"
  313. FROM pracownicy
  314. WHERE nr_prac < 5;
  315.  
  316. ROZWIĄZANIE:
  317.  
  318. SELECT nr_prac, XMLElement("PRACOWNICY",nazwisko ) AS "wynik"
  319. FROM pracownicy
  320. WHERE nr_prac < 5;
  321.  
  322.  
  323. 4.2. Zadać zapytanie SQL operujące na tabeli PRACOWNICY zwracające wynik w postaci XML:
  324. SELECT xmlgen.getXML(’select * from PRACOWNICY) FROM dual;
  325.  
  326. ROZWIĄZANIE:
  327.  
  328. SELECT dbms_xmlgen.getXML('select * from PRACOWNICY') FROM dual;
  329.  
  330.  
  331. 4.3. Zadać kolejno 3 następujące zapytania, porównując uzyskane efekty (sposób „sformatowania” dokumentu
  332. XML):
  333.  
  334. ROZWIĄZANIE:
  335.  
  336. SELECT XMLElement("PRACOWNICY", XMLAttributes(nr_prac,nazwisko)) AS "wynik"
  337. FROM pracownicy
  338. WHERE nr_prac < 5;
  339.  
  340. SELECT XMLElement
  341. ("Pracownicy",XMLAttributes(nr_prac AS "numer pracownika"),
  342. XMLColAttVal (nazwisko AS "Nazwisko pracownika"),
  343. XMLColAttVal (nr_zesp AS "Numer zespolu pracownika")) AS "wynik"
  344. FROM pracownicy
  345. WHERE nr_prac < 5;
  346.  
  347. SELECT XMLElement("PRACOWNICY",
  348. XMLAttributes(nr_prac AS "id"),
  349. XMLElement("NAZWISKO", nazwisko ),
  350. ' pracuje w zespole '||nr_zesp||' i urodzil sie ',
  351. XMLElement("data_ur", data_ur))
  352. AS "wynik"
  353. FROM pracownicy
  354. WHERE nr_prac < 5;
  355.  
  356.  
  357. 4.4. Zadać zapytanie zwracające ciąg elementów (czyli po prostu „las” elementów), dotyczących pracowników –
  358. ich nazwisk i dat urodzenia oraz inf. o zwolnieniu:
  359.  
  360. ROZWIĄZANIE:
  361.  
  362. SELECT XMLForest (nazwisko,
  363. data_ur as "urodzony",
  364. 'Tak' as "Zwolniony")
  365. FROM pracownicy;
  366.  
  367.  
  368. 4.5. Zadać zapytanie, grupujące informacje o pracownikach danego zespołu:
  369.  
  370. ROZWIĄZANIE:
  371.  
  372. select XMLElement (name "Zespoly",
  373. XMLAttributes(nr_zesp as "Numer"),
  374. XMLAgg(
  375. XMLElement (name "Pracownicy", nazwisko)
  376. )
  377. ) wynik
  378. from pracownicy
  379. group by nr_zesp;
  380.  
  381.  
  382. 4.6. Zadać zapytanie, zwracające w postaci elementu XML informacje o pracownicyach i ich kierownikach.
  383.  
  384. ROZWIĄZANIE:
  385.  
  386. SELECT XMLConcat ( XMLElement("SZEF", S.NAZWISKO ),
  387. XMLElement("PODWLADNY", P.NAZWISKO) )
  388. AS "wynik"
  389. FROM pracownicy p, zespoly z, pracownicy s
  390. WHERE p.nr_zesp = z.nr_zesp and z.nr_prac_kz=s.nr_prac;
  391.  
  392.  
  393. 4.7. Utworzyć tabelę o nazwie testXML na podstawie zapytania SQL selekcjonującego z tabeli PRACOWNICY
  394. informacje o pracownikach o numerze 1 i 2:
  395.  
  396. ROZWIĄZANIE:
  397.  
  398. CREATE TABLE testXML AS
  399. SELECT DBMS_XMLGEN.getXML
  400. ('SELECT * FROM pracownicy where nr_prac=1 or nr_prac=2')
  401. AS pracownicy
  402. FROM dual;
  403.  
  404.  
  405. 4.8. Utworzyć 4-kolumnową tabelę o nazwie PRACOWNICY2, zawierającą atrybut o nazwie prac_id (typ:
  406. NUMBER(3)), 1 atrybut prac_spec typu CLOB, zdolny do przechowania elementu XML (typ
  407. sys.XMLType), atrybut prac_name (typ VARCHAR2(35)) oraz funkcja_id (typ NUMBER(4)).
  408.  
  409. ROZWIĄZANIE:
  410.  
  411. CREATE TABLE pracownicy2 (
  412. prac_id NUMBER(3),
  413. prac_spec sys.XMLType,
  414. prac_name VARCHAR(35),
  415. funkcja_id NUMBER(4)
  416. );
  417.  
  418.  
  419. 4.9. Do utworzonej w poprzednim punkcie tabeli wpisać przykładowe dane:
  420.  
  421. ROZWIĄZANIE:
  422.  
  423. INSERT INTO pracownicy2 (prac_id, prac_spec)
  424. VALUES (101, sys.XMLType.createXML
  425. ('<Pracownicy nr="100">
  426. <charakter_zatrudnienia>Etatowy</charakter_zatrudnienia >
  427. </Pracownicy >'));
  428.  
  429.  
  430. 4.10. Wyświetlić zawartość tabeli PRACOWNICY2 („klasyczne” polecenie SELECT):
  431.  
  432. ROZWIĄZANIE:
  433.  
  434. SELECT * FROM PRACOWNICY2;
  435.  
  436.  
  437. 4.11. Wyświetlić (klasycznym poleceniem SELECT) zawartość kolumny prac_spec tabeli PRACOWNICY2,
  438. nadając jej na wydruku nazwę „Info o pracowniku”. Dla tabeli użyć aliasu.
  439.  
  440. ROZWIĄZANIE:
  441.  
  442. SELECT prac_spec "Info o pracowniku" FROM PRACOWNICY2 ;
  443.  
  444.  
  445. 4.12. Wyświetlić zawartość kolumny prac_spec utworzonej tabeli, korzystając z operatora extract (funkcja ta
  446. zwraca fragment dokumentu XML wskazany wyrażeniem XPath.):
  447.  
  448. ROZWIĄZANIE:
  449.  
  450. SELECT p.prac_spec.extract
  451. ('/Pracownicy/charakter_zatrudnienia/text()').getStringVal() "Rodzaj umowy"
  452. FROM pracownicy2 p;
  453.  
  454.  
  455. 4.13. Zaktualizować kolumnę prac_spec tabeli PRACOWNICY2, nadając jej funkcją createXML
  456. (sys.XMLType.createXML(…)) wartość:
  457.  
  458. ROZWIĄZANIE:
  459.  
  460. UPDATE PRACOWNICY2 SET prac_spec=sys.XMLType.createXML('<Pracownicy nr ="200">
  461. <charakter_zatrudnienia>Umowa-zlecenie</charakter_zatrudnienia>
  462. </Pracownicy>');
  463.  
  464.  
  465. 4.14. Ponownie wyświetlić polecenie SELECT zawartość tabeli PRACOWNICY2.
  466.  
  467. ROZWIĄZANIE:
  468.  
  469. SELECT * FROM PRACOWNICY2;
  470.  
  471.  
  472. 4.15. Dopisać jeszcze jeden zestaw danych do kolumn prac_id oraz prac_spec tabeli PRACOWNICY2.
  473.  
  474. ROZWIĄZANIE:
  475.  
  476. INSERT INTO pracownicy2 (prac_id, prac_spec)
  477. VALUES (102, sys.XMLType.createXML
  478. ('<Pracownicy nr="100">
  479. <charakter_zatrudnienia>Stale</charakter_zatrudnienia >
  480. </Pracownicy >'));
  481.  
  482.  
  483. 4.16. Poleceniem SELECT sprawdzić czy nowe dane zostały dopisane do tabeli PRACOWNICY2.
  484.  
  485. ROZWIĄZANIE:
  486.  
  487. SELECT * FROM PRACOWNICY2;
  488.  
  489.  
  490. 4.17. W celu skrócenia czasu odpowiedzi zapytań dotyczących wartości XMLType, użytkownik może skorzystać z
  491. indeksów na wyrażeniach (function-based indexes):
  492.  
  493. ROZWIĄZANIE:
  494.  
  495. CREATE INDEX prac_idx ON pracownicy2 p
  496. (p.prac_spec.extract('//Pracownicy').getStringVal());
  497.  
  498.  
  499. 4.18. Poleceniem DELETE usunąć dopisane w punkcie 4.15 dane. We frazie WHERE użyć:
  500. …WHERE p.prac_spec.extract
  501. ('// Pracownicy/charakter_zatrudnienia /text()').getStringVal() = 'tu wpisać wstawioną
  502. wartość’”);
  503.  
  504. ROZWIĄZANIE:
  505.  
  506. DELETE FROM pracownicy2 p WHERE p.prac_spec.extract
  507. ('// Pracownicy/charakter_zatrudnienia /text()').getStringVal() = 'Stale';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement