och databprogrammering Christilinda Göstson - PL/SQL, paket och ref cursor Du skall naturligtvis visa körexempel med output där det behövs i din rapport! OBS! Denna labb redovis i labbrapport via mail till handledaren. Mailet skall förutom labbrapporten innehålla en fungerande länk till en fil med namnet lotto.html. Filen skall du publicera på din www-katalog. Exempel på länk: http://users.du.se/~pdo/ora/lotto.html/ora/lotto.html Innehåll Under denna sista labb kommer du att få jobba med PL/SQL, paket, procedurer, funktioner och ref cursor. Se till att modularisera koden till små sub-program som gör en sak. Anropa sedan sub-programmen istället för att skriva all kod i en procedur. En sådan lösning med allt på ett eller två ställen blir underkänd. Gör en ritning över hur du tänkt att det ska fungera, så blir det enklare. Du skall skapa ett paket med namnet lotto i detta paket skall du deklarera en weak ref cursor type och en procedur med namnet spela_lotto. Övriga procedurer och funktioner som behövs ligger inkapslade i lotto paketets body, och är endt åtkomliga inifrån proceduren spela_lotto. Två tabeller skall skap en med namnet lottorad och en annan med namnet lottofacit. I tabellen lottofacit kommer jag att tillhandahålla en rätt rad, dvs den tabellen innehåller 7 nummer mellan 1 och 35 som utgör den rätta raden. I tabellen lottorad skall du generera en slumpmässig lottorad med 7 unika nummer mellan 1 och 35. Tabellen får endt innehålla 7 nummer (rader) åt gången, dvs en rad per spelomgång. Detta medför att du måste rensa tabellen innan du spelar nästa gång. Du skall ha funktioner som returnerar en ref cursor med din spelade rad.samt en annan funktion som returnerar den rätta facit-raden.. Slutligen behöver du en funktion som returnerar antal rätt.. All utskrift till skärmen sköter den publika proceduren spela_lotto om. OBS! Den spelade raden och facitraden skall vara sorterade. Börja med Skapa tabellerna lottorad och lottofacit, genom att kopiera nedanstående kod: ------------------Skapa tabeller Start-------------------------------------------------- create table lottorad( nr number(6)); create table lottofacit( nr number(6)); insert into lottofacit values(3); insert into lottofacit values(7); insert into lottofacit values(11); insert into lottofacit values(35); 1(7)
och databprogrammering Christilinda Göstson insert into lottofacit values(12); insert into lottofacit values(5); insert into lottofacit values(24); commit; ------------------Skapa tabeller Slut--------------------------------------------------- När du testkör ditt lottoprogram skall en utskrift generer enligt följande: SQL> exec lotto.spela_lotto; <html> <head> <title>oracle-lotto</title> </head> <body> <div align="center"> <h1>oracle-lotto</h1> <table border="2"> <tr> <td>min rad:</td> <td>5</td> <td>11</td> <td>14</td> <td>19</td> <td>25</td> <td>28</td> <td>29</td> </tr> <tr> <td>rätt rad:</td> <td>3</td> <td>5</td> <td>7</td> <td>11</td> <td>12</td> <td>24</td> <td>35</td> <tr> <td colspan="8">antal rätt: 2</td> </tr> </table> </div> </body> </html> PL/SQL procedure successfully completed. Utskriftstexten klistrar du sedan in i ett textdokument som du döper till lotto.html. Funktionen chr(10) gör en radbrytning. Jag har som mest fått 4 rätt! Försök slå det! Du kan, istället för att klistra in all kod för paketet i SQL/Plus köra ett script. Om du har paket-koden koden i en fil labb5.sql som ligger i roten på D:,, så kan du skriva följande kommando i SQL Developer: 2(7)
och databprogrammering Christilinda Göstson sql> @ d:\labb5.sql; När du tittar på filen lotto.html i webbläsaren kommer den att se ut så här: Tips! Bygg inte allt på en gång! Fundera först igenom vilka procedurer och funktioner du behöver, skapa sedan dessa, testa att de fungerar innan du stoppar in dem i paketet. Uppgift 1 Skapa lottopaketet! Fyll i xxxxx med ditt användarnamn. Länk till din HTML-sida: http://users.du.se/~xxxxx/oracle/lotto.html 3(7)
och databprogrammering Christilinda Göstson create or replace package lotto type rc is ref cursor; procedure spela_lotto; end lotto; / create or replace package body lotto function kolla_dublett( f_nyttnr in number) return number v_count number; select count(*) into v_count from lottorad where nr = f_nyttnr; if v_count = 1 then return 1; else return 0; end if; end kolla_dublett; procedure skapa_p_lottorad v_nyttnr lottorad.nr%type; i number; v_kolla_dublett number(1); i := 1; while (i < 8) loop v_nyttnr := get_lottonr; v_kolla_dublett := kolla_dublett(v_nyttnr); if v_kolla_dublett = 0 then insert into lottorad values (v_nyttnr); i := i + 1; end if; end loop; commit; end skapa_p_lottorad; function hämta_lottofacit return lotto.rc x lotto.rc; open x for select nr from lottofacit order by nr c; return x; 4(7)
och databprogrammering Christilinda Göstson end hämta_lottofacit; procedure töm_lottorad delete from lottorad; commit; end töm_lottorad; function antal_rätt return varchar2 v_sql varchar2(200); v_count varchar2(200); v_sql:= ('select count(*) from lottofacit where (nr)in (select nr from lottorad)'); execute immediate v_sql into v_count; return v_count; end antal_rätt; function hämta_lottorad return lotto.rc x lotto.rc; open x for select nr from lottorad order by nr c; return x; end hämta_lottorad; procedure spela_lotto rc lotto.rc; v_lottorad lottorad.nr%type; v_lottofacit lottofacit.nr%type; v_rätt varchar(2); töm_lottorad; skapa_p_lottorad; v_rätt:=antal_rätt; rc := hämta_lottorad; htp.print('<html>'); htp.print('<head>'); htp.print('<meta http-equiv="content-type" content="text/html">'); htp.print('<title>oracle-lotto</title>'); htp.print('</head>'); htp.print('<body>'); htp.print('<div align="center">'); htp.print('<h1>oracle lotto</h1>'); 5(7)
och databprogrammering Christilinda Göstson htp.print('<table cellpadding="3" cellspacing="2" border="2">'); htp.print('<td>min rad:</td>'); --loopen för lottoraden loop fetch rc into v_lottorad; exit when rc%notfound; htp.print('<td>' v_lottorad '</td>'); end loop; close rc; htp.print('</tr>'); htp.print('<td>rätt rad:</td>'); --loopen för lottofacit rc:=hämta_lottofacit; loop fetch rc into v_lottofacit; exit when rc%notfound; htp.print('<td>' v_lottofacit '</td>'); end loop; close rc; htp.print('<td colspan="8">antal rätt: ' v_rätt '</td>'); htp.print('</tr>'); htp.print('</table>'); htp.print('</div>'); htp.print('</body>'); htp.print('</html>'); end spela_lotto; end lotto; / http://users.du.se/~h09chrgo/oracle/lotto.html Uppgift 2 Egna reflektioner! Skriv något om labben! Vad har du lärt dig? För svårt? För lätt? För mycket? För lite? Det hade varit bra att ha tagit upp på någon föreläsning var detta med html-utskrift. Det där var sista labben! Hopp du inte fått nog av databer Laborationen lämn in i fronter. 6(7)
och databprogrammering Christilinda Göstson SQL-kod skall skriv väl strukturerad med typsnittet Courier New 10p Pär Douhan pdo@du.se 7(7)