Baza danych Oracle jako otwarte, rozszerzalne i potężne
Transkrypt
Baza danych Oracle jako otwarte, rozszerzalne i potężne
XIII Konferencja PLOUG .RFLHOLVNR 3D(G]LHUQLN Baza danych Oracle jako otwarte, UR]V]HU]DOQHLSRW *QHURGRZLVNR obliczeniowe. Integracja Maszyny Wirtualnej 3HUOD]MGUHP2UDFOH 3LRWU-DUPX* ITTI sp. z o.o. [email protected] Abstrakt3URMHNWLDUW\NXáPDMQDFHOXSRND]DQLH*H2UDFOHWRFR]QDF]QLHZL FHMQL*W\ONRF]DUQDVNU]\QNDSU]HWZDU]DMFD]DS\WaQLD 64/ : ED]LH GDQ\FK 2UDFOH LVWQLHMH V]HUHJ RWZDUW\FK L XGRNXPHQWRZDQ\FK $3, XPR*OLZLDMF\FK GRZROQH UR]V]HU]DQLH MGUD 2UDFOH 3DU ODW WHPX ]DMáHP VL SURMHNWHP KREE\VW\F]Q\P PDMF\P QD FHOX ]LQWHJURZDQLH URGRZLVND M ]\ND 3HUO L ED]\ GDQ\FK 2UDFOHXPR*OLZLHQLHSLVDQLDSURFHGXUVNáDGRZDQ\FKZ3HUOX:\NRU]\VWDQLHGRVNRQDá\FK]GROQRFLPerla do przetwarzania tekstów ]H VNDORZDOQRFL 2UDFOH SR]ZROLáRE\ QD X]\VNDQLH FDáNLHP QRZHM MDNRFL $UW\NXá RSLVXMH RJyOQ DUFKLWHNWXU Oracle’a, podstawy maszyny wirtualnej 3HUOD SRP\Vá VSRVyE L V]F]HJyá\ LPSOHPHQWDF\MQH UHDOL]DFML SURMHNWX LQWHJUDF\MQHJR $UW\NXá GRW\F]\ ED]\ Ganych Oracle 9i r2 i wersji maszyny Perla 5.8.0. Informacja o autorze.3LRWU-DUPX*ZODWDFKVWXGLRZDáQD3ROLWHFKQLFH3R]QDVNLHMQDNLHUXQNX(OHNWURWHFKQLND:ODWDFK NRQW\QXRZDá VWXGLD Z ()3 )UDQFXVNR3ROVNLHM :\*V]HM 6]NROH 7HFKQLN ,QIRUPDW\F]QR.RPXQLNDF\MQ\FK Z 3R]QDQLX W URNX RGE\á SyáURF]Q\ VWD* Z LQVW\WXFLH EDGDZF]R UR]ZRMRZ\P Forschung und Technik 'DLPOHU%HQ] Z %HUOLQLH 6WRSLH PDJLVWUD LQ*\QLHUD X]\VNDá Z URNX Z G]LHG]LQLH V\VWHPyZ UR]SURV]RQ\FK 2G URNX SUDFRZDá QD VWDQRZLVNX SURJUDPLVW\ aplikacji baz danych w firmie Praendle Software *PE+Z%HUOLQLH2GURNXSUDFRZDáMDNRNLHURZQLNSROVNLHMJUXS\SURJUDPLVWyZ przy projekcie Messe Frankfurt Online w Bertelsman Nionex w Guetersloh w Niemczech. Od 2002 do 2004 jako administrator i deweloper baz danych Oracle w firmie ASCO GmbH w %UDXQVFKZHLJ1LHPF\3RSRZURFLHGR3ROVNLSU]H]SyáURNXSUDFRZDáMDNR NRQVXOWDQW Z ILUPLH '*$ 6$ Z 3R]QDQLX 'R NRFD URNX Z ,77, QD VWDQRZLVNX NRQVXOWDQWD UHDOL]RZDá SURMHNW\ ]ZL]DQH zDQDOL] SURMHNWRZDQLHP L EXGRZ V\VWHPyZ LQIRUPDW\F]Q\FK RUD] ] ]DJDGQLHQLDPL EH]SLHF]HVWZD LQIRUPDFML 2G VW\F]QLD pracuje jako Database Analyst w GSK Technical &HQWUHL]DMPXMHVL DGPLQLVWURZDQLHPED]GDQ\FK2UDFOHL0664/6HUYHUZNRUSRUacji GSK. Baza danych 2UDFOHMDNRRWZDUWHUR]V]HU]DOQHLSRW *QHURGRZLVNRREOLF]HQLRZH 237 Audytorium 'RNXPHQW WHQ SU]H]QDF]RQ\ MHVW GOD UHGQLR L Z\VRNR]DDZDQVRZDQ\FK X*\WNRZQLNyZ Oracle’a. Wymagana jest elementarna wiedza na temat systemu UNIX/Linux, bardzo dobra ]QDMRPRüDUFKLWHNWXU\VHUZHUDED]GDQ\FK2UDFOHZUR]G]LDáDFKGRW\F]F\FKVWUXNWXU\SURFHVyZ LVWUXNWXUJOREDOQHMG]LHORQHMSDPL FL:\PDJDQDMHVW]DDZDQVRZDQD]QDMRPRü3/64/LPerla ZV]F]HJyOQRFLZNRQWHNFLHLQWHJUDFMLREXM ]\NyZ]URGRZLNVLHPruntimowym „C”, API OCI i SHUOHPEHG HOHPHQWDUQD ]QDMRPRü ]DVDG IXQNFMRQRZDQLD QRZRF]HVQ\FK LQWHUSUHWHUyZ bytecodowych jak Java i Perl oraz ogólna wiedza na temat technik kompilacji, architektury kompilatorów w systemów POSIX-owych. 1. Rozszerzalna architektura Oracle 6HUZHUED]\GDQ\FK2UDFOHWRQLHW\ONR]Z\Ná\VHUZHU64/F]DUQDVNU]\QNDGRNWyUHMZU]XFD VL ]DS\WDQLD64/RZHLRF]HNXMHQDWDEXODU\F]QHUH]XOWDW\6HUZHU2UDFOHWRSRW *QHURGRZLVNR REOLF]HQLRZHXPR*OLZLDMFHUR]ZL]\ZDQLHQDZHWQDMEDUG]LHMVNRPSOLNRZDQ\FKSURMHNWyZZGX *HMPLHU]HZVDP\PVHUZHU]H>7.<7(@6HUZHUED]\GDQ\FK2UDFOHRIHUXMHZLHOHGREU]HRSLVaQ\FKLRWZDUW\FK$3,XPR*OLZLDMF\FKáDWZLQWHJUDFM ]LVWQLHMF\PRSURJUDPRZDQLHP]Z\NoU]\VWDQLHPVWDQGDUGRZ\FKSURWRNRáyZ6HUZHU2UDFOHSRVLDGDRSUyF]VWDQGDUGRZHJRengina SQL ]JRGQHJR]HVWDQGDUGHP$16,V]HUHJZEXGRZDQ\FKM ]\NyZSURJUDPRZDQLDLJHQHUaFML:MGU]H2UDFOH]LQWHJURZDQQ\]64/MHVWM ]\NJHQHUDFML3/64/RGZHUVML[ZVNáDG VHUZHUD 2UDFOH ZFKRG]L ZáDVQD LPSOHPHQWDFMD PDV]\Q\ ZLUWXDOQHM Java „Aurora” oraz standarGRZHURGRZLVNRUXQWLPRZH-5(JHQHUDFMLRUD]GRSURJUDPRZDQLDQDQDMQL*V]\PSR]LRPLH M ]\NÄ&´GRUR]ZL]\ZDQLDQDMEDUG]LHMQLHW\SRZ\FK]DGDGODNWyU\FKZ\PDJDQLDF]DVRZHV NU\W\F]QHRUD]GODW\FK]DGDJG]LHZ\PDJDQDMHVWLQWHJUDFMD]LVWQLHMF\PV\VWHPDPLGODNWóU\FKLVWQLHMW\ONRLQWHUIHMV\ELQDUQHZM ]\NXÄ&´ 1.1 PL/SQL - ]\N 3/64/ MHVW M ]\NLHP JHQHUDFML ED]RZDQ\P QD M ]\NX $GD ZEXGRZDQ\P Z engine 64/RZ\ZMGU]HVHUZHUD3/64/MHVWM ]\NLHPSURFHGXUDOQ\P]UR]V]HU]HQLDPLobjektowymi REVáXJXMF\PZ\MWNLLWUDQVDNFMHOracle’a. Wspiera wszystkie standardowe typy danych SQL na poziomie QDW\ZQ\PW]QQLHZ\PDJDQDMHVW*DGQDNRQZHUVMDSRPL G]\SQL-em a PL/SQL-em. Konstrukty PL/64/DPRJLVWQLHüZSRVWDFLSURFHGXUIXQNFML]DUyZQRQLH]DOH*Q\FKMDNL]JUupowanych w logiczne i funkcjonalne pakiety. 1.2 Java 2GZHUVML[2UDFOHRIHUXMHQRZ\M ]\N±JHQHUDFML-DYD2UDFOH]DLPSOHPHQWRZDáZáDVQ ZHUVM -90$XURUDNWyUDMHVW]GHF\GRZDQLHV]\EV]DLOHSLHMQDGDMHVL GRUR]ZRMXRSURJUDPowania w -DYLHQL*MDNDNROZLHNLQQDLPSOHPHQWDFMD-90'ODRVyE]DMPXMF\FKVL SURIHVMRQDlnym rozwojem oprogramowania w -DYLHQDMZD*QLHMV]\MHVWIDNWL*QLHZ\PDJDQ\MHVWUHVWDUWVHrwera, przy ponownej kompilacji i instalacji pakietów i klas Javy. Maszyna wirtualna Java jest ]LQWHJURZDQD FLOH ] MGUHP Oracle’a tzn. bytecode i dane -DY\ ]QDMGXM VL Z WHM VDPHM SU]estrzeni adresowej co dane serwera, w tym ]FDFKRZDQH EORNL ED] GDQ\FK FR XPR*OLZLD EH]SoUHGQLPDQLSXODFM NRGRZL-DY\QDW\FKGDQ\FKEH]NRQLHF]QRFLGURJLHJRSU]HáF]DQLDNRQWHkstów na poziomie systemu operacyjnego. Kod -DY\PR*QDWZRU]\üEH]SRUHGQLR]DSRPRFkonstruktów DDL „create or replace and FRPSLOH´DOERSU]\JRWRZDüQD]HZQWU]L]DLQVWDORZDüSoSU]H]SDNLHW]DU]GF]\GEPVBMDYD]SR]LRPX64/DDOER]DSRPRFQDU] G]LDload_java z linii komendy 3LRWU-DUPX* 238 1.3 „C” i model external stored procedures 2UDFOHRIHUXMHPR*OLZRüSLVDQLDSURFHGXUVNáDGRZDQ\FKZM ]\NXÄ&´RGEDUG]RZF]HVQ\FK ZHUVML3URFHGXU\SLVDQHZÄ&´PDMQDMZL NV]HPR*OLZRFL=HZ]JO GXQDEH]SLHF]HVWZRGaQ\FKSURFHGXU\VNáDGRZDQHSLVDQHZÄ&´VLPSOHPHQWRZDQH]XSHáQLHRGPLHQQLHQL*SURFHGXU\ w PL/SQL i -DY\ NWyUH V ]LQWHJURZDQH EH]SRUHGQLR Z MGU]H Oracle’a. PL/SQL i -DYD PDM VZyMZáDVQ\ZEXGRZDQ\PHFKDQL]PGRVW SXGRGDQ\FKLQLHXPR*OLZLDME\design manipulacji QD ZVND(QLNDFK FR QLH PR*H VNXWNRZDü SU]\SDGNRZ\P ]QLV]F]HQLHP GDQ\FK VHUZHUD LOXE FR gorsza) danych SHUV\VWHQWQ\FKZVDPHMED]LH.RGZÄ&´QLHPDWDNLFK]DEH]SLHF]HLXPR*OLZLD ]URELHQLHZV]\VWNLHJRQDFRSR]ZDODVDPM ]\NLELEOLRWHNLZNRQWHNFLHX*\WNRZQLNDV\VWHPowego. W przypadku procedur pisanych w „C”, Oracle tworzy nowy model komunikacji danych. 3URFHGXU\SLVDQHZÄ&´VWHFKQLF]QLH]DZDUWHZELEOLRWHFHG\QDPLF]QHMOLQNRZDQHM]]HZQ WUznym w stosunku do serwera Oracle procesem o nazwie extproc w celu separacji przestrzeni adreVRZ\FK 7DND VHSDUDFMD SRZRGXMH L* QLHPR*OLZD MHVW EH]SRUHGQLD PDQLSXODFMD QD GDQ\FK EOoków ED]RGDQRZ\FK L LFK SU]\SDGNRZH ]QLV]F]HQLH DOH WDN*H ]ZL NV]D WR NRV]W\ SRMHG\QF]HJR Z\ZRáDQLD]HZ]JO GXQDSU]HáF]DQLHNRQWHNVWyZLNRQLHF]QRüVWRVRZDQLDVWRVXQNRZRÄFL *NLFK´PHWRGNRPXQLNDFML,3&3URFHGXU\ZÄ&´PR*QDSLVDüQDSR]LRPLHQLVNLPX*\ZDMFPechanizmów OCI (Oracle Call Interface) albo z wykorzystaniem prekompilatora i bibliotek Pro*C. 2. Perl i maszyna wirtualna :EUHZSRZV]HFKQHMRSLQLLM ]\N3HUOQLHMHVWM ]\NLHPF]\VWR LQWHUSUHWRZDQ\P 0R*QD ZyUy*QLüW\SRZHID]\FKDUDNWHU\VWV\F]QHGODM ]\NyZNRPSLORZDQ\FKWDNLFKMDNÄ&´OXE Java. Interpreter 3HUODVNáDGDVL ]parsera i wykonawcy. 3DUVHUGRNRQXMHDQDOL]\V\QWDNW\F]QHMPRGXáX a wyniNLHP MHJR SUDF\ MHVW W\PF]DVRZD LVWQLHMFD W\ONR Z SDPL FL VWUXNWXUD bytecodu (tzw. pcode). Struktura taka reprezentuje w UXQWLPLH NRPSLORZDQ IXQNFM L MHVW SU]HND]\ZDQD GR PoGXáXZ\NRQDZF\ Bytecode 3HUODMHVW]DVDGQLF]RUy*Q\RGbytecodu Javy. Bytecode Javy odpoZLDGDPQLHMZL FHMM ]\NRPPDV]\QRZ\PGODLVWQLHMF\FKDUFKLWHNWXUSURFHVRUyZL]DZLHUDSoQDG SURVW\FK LQVWUXNFML PDQLSXOXMF\FK VWRVHP L VWDQHP PDV]\Q\ RSHUXMF\FK QD prostuch operandach 1, 2, 4 i 8 bytowych. Bytecode Perla zawiera ponad 600 RSFRGyZNWyUHRGSRZLDGDM ZEXGRZDQ\PIXQNFMRPLRSHUDWRURPMDNLRSHUDFMRPSRGVWDZRZ\PQDGX*RZ\*V]\PSR]LRPLH np. jednym opcodem w Perlu jest referencja do tablicy KDV]XMFHMáF]QLH]REOLF]HQLHPZDUWRFL KDV]XMFHMGODNOXF]DOXESREUDQLHHOHPHQWX]WDEOLF\FRZ-DYLHRGSRZLDGDáRE\ZQDMOHSV]\P SU]\SDGNX NLONXG]LHVL FLX UR]ND]RP 2SFRG\ Z PRGXOH Z\NRQDZF]\P RGSRZLDGDM Z\VRFH ]RSW\PDOL]RZDQ\PIXQNFMRPQDSLVDQ\PU F]QLHZÄ&´7DNLPRGHOVSUDZLD*HX]DVDGQLRQHMHVW P\OHQLH R Perlu jak o skryptowalnym „C”. Maszyna wirtualna Perla jest zaimplementowana w bibliotece OLESHUOZFKRG]FHMZVNáDGVWDQGDUGRZHMLQVWDODFML 3HUODQDND*GHMSODWIRUPLH7DN ZL FLQWHUSUHWHUPerla w linii komendy jest prostym programem ]OLQNRZDQ\P]WELEOLRWHNDFD áHVNRPSOLNRZDQHSU]HWZDU]DQLHGDQ\FKLNRGXPerla zaimplementowane jest w bibliotece libperl LXGRVW SQLRQHSURJUDPRPZÄ&´SRSU]H]GREU]H]GHILQLRZDQ\LRWZDUW\LQWHUIHMV:V]F]HJyOQoFL UR]G]LHORQH V NURNL WZRU]HQLD L LQLFMDOL]DFML PDV]\Q\ ZLUWXDOQHM NRPSLODFML PRGXáyZ Perla RUD]SU]HND]\ZDQLDSDUDPHWUyZZáDFLZHJRZ\NRQDQLDNRGXL]ZURWXZDUWRFL:W\PSURMHNFLH Z\NRU]\VWDOLP\$3,perlembed. 3. =DáR*HQLDLRJUDQLF]HQLDV\VWHPX &Dá\SURMHNW]GHF\GRZDQRVL ]DLPSOHPHQWRZDüZQDVW SXMF\PURGRZLVNX • System operacyjny Linux Debian 3.0 • Serwer bazy danych Oracle 9i r2 • Perl wersja 5.8.0 • Kompilator GNU „C” 2.8.0 Baza danych 2UDFOHMDNRRWZDUWHUR]V]HU]DOQHLSRW *QHURGRZLVNRREOLF]HQLRZH 239 =HZ]JO GXQDRJUDQLF]HQLDF]DVRZHSURMHNWXMDNLSRWHQFMDOQHSUREOHP\]Z\GDMQRFL]DGeF\GRZDQRL*LQWHJUDFMDZLUWXDOQHMPDV]\Q\3HUOD]VHUZHUHP2UDFOHRJUDQLF]RQDE G]LHW\ONRGR NRQILJXUDFML]VHUZHUHPGHG\NRZDQ\P:WHG\JZDUDQWRZDQHMHVWLVWQLHQLH]HZQ WU]Q\FKSURFesów extproc w stosunku 1:1GRGHG\NRZDQ\FKVHUZHUyZSURFHVyZX*\WNRZQLNDDW\PVDP\P QLH LVWQLHMH NRQLHF]QRü ]DSDPL W\ZDQLD VWDQX PDV]\Q\ ZLUWXDOQHM 3HUOD ZHZQWU] NRQWHNVWX 2UDFOH >7.<7(@ FR E\áRE\ R W\OH QLHHIHNW\ZQH FR SUDZLH QLHPR*OLZH MDNR *H VWDQ PDV]\Q\ wirtualnej 3HUODMHVWGRVW SQ\W\ONRSRSU]H]ÄRSDTXHKDQGOH´]SR]LRPXM ]\NDÄ&´2UDFOHRIeUXMH VSRVyE QD SU]HFKRZ\ZDQLH JOREDOQ\FK GDQ\FK Ä&´ VNRMDU]RQ\FK ] VHVM X*\WNRZQLND w strukturze 2&,&RQWH[WQLHPQLHMMHGQDNQLHLVWQLHMHáDWZ\VSRVyEQDVHULDOL]DFM VWDQXPDV]\Q\ L]DSLVDQLHMHMZSRVWDFLVWUXPLHQLDE\WyZ%\áRE\WRMDNZVSRPQLDQRZ\*HMEDUG]RQLHHIHNW\wQH=DWHPRJUDQLF]HQLHSURMHNWXGRNRQILJXUDFML]VHUZHUHPGHG\NRZDQ\PPDVHQVLMHVWFDáNLHP UR]VGQH3RQDGWRQDZHWSU]\NRQILJXUDFML]VHUZHUHPG]LHORQ\PLVWQLHMHPR*OLZRüÄZ\PXV]eQLD´GHG\NRZDQHJRSRáF]HQLDLFR]DW\PLG]LHGHG\NRZDQHJRSURFHVXVHUZHUDLSURFHVXextproc poprzez odpowiedni VWULQJLQLFMDOL]XMF\SRáF]HQLHOXEodpoowiedni wpis TNS w pliku konfiguracyjnym po stronie klienta. 4. Interfejsy System posiada dwa interfejsy. Pierwszy interfejs to standardowy interfejs SQL i PL/SQL 2UDFOH¶D RIHURZDQ\ ND*GHPX NOLHQWRZL ED]\ GDQ\FK 3RGVXPRZXMF NRG Z 3HUOX PR*H E\ü wVSRVyE SU]H(URF]\VW\ Z\ZRá\ZDQ\ ] GRZROQHM DSOLNDFML Oracle’owej. Drugi interfejs to interIHMV ]DU]GF]\ VáX*F\ GR GHILQLRZDQLD QRZ\FK IXQNFML SURFHGXU L SDNLHWyZ Z Perlu oraz ich wrapperów widocznych dla klienta. 3U]\NáDGRZ\NRGNOLHQWD declare l_length number; l_file varchar2(30):= 'file.txt'; begin l_length:=perl_demo(l_file); dbms_output.put_line('Length of file' || l_file || ' is ' || l_length); end; 3RZ\*V]\ NRG Z\ZRá\ZDQ\ MHVW G\QDPLF]QLH GRZROQ LORü UD]\ EH] NRQLHF]QRFL wykonywania dodatkowych kroków. Kod procedury ZUDSSHUDNRQZHUWXMF\SDUDPHWU\ZHMFLRZHGRWDEOLF\W\SXYDUFKDULRGdaMF\ VWHURZDQLH GR JHQHU\F]QHJR SXQNWX ZHMFLD GR PDV]\Q\ ZLUWXDOQHM Perla. Ewentualne SDUDPHWU\Z\MFLRZHOXEZDUWRü]ZUDFDQDSU]H]IXQNFM VSDNRZDQHZWDEOLF stringów i konZHUWRZDQHGRZáDFLZHJRW\SXSRSRZURFLHGRNRGXZ\ZRáXMFHJR create or replace function perl_demo(p_file varchar2) authid current_user return number as l_inarr: t_perl_array; l_outarr: t_perl_array; begin l_inarr[1]:=p_file; perl_entry_point(l_inarr, l_outarr); return outarr[1]; end; 3RZ\*V]\ NRG Z\NRQ\ZDQ\ MHVW MHGQRNURWQLH SR ]DLQVWDORZDQLX QRZHM funkcji.procedury 3HUOD3HáQLURO SRUHGQLNDPL G]\NRGHPNOLHQWDDgenerycznym wrapperem. 240 3LRWU-DUPX* 7U]\NROHMQHLQVWUXNFM Z\NRQ\ZDQHVMHGQRNURWQLHSRGF]DVLQVWDODFMLV\VWHPX 2WRGHNODUDFMDSXQNWXZHMFLDGRPDV]\Q\ZLUWXDOQHMPerla. create or replace procedure perl_entry_point(p_inarray t_perl_array, p_outarray t_perl_array) as language C name "C_perl_entry_point" library oraperl with context parameters(context, p_inarray OCICOLL, p_outarray OCICOLL); .RG LPSOHPHQWXMF\ SRZ\*V] SURFHGXU QDSLVDQ\ MHVW Z Ä&´ L ]DZDUW\ MHVW Z ELEOLRWHFH dzielonej oraperl. Biblioteka RUDSHUO SHáQL URO NRGX áF]FHJR 2UDFOH L 3HUO Z\NRU]\VWXMH $3, OCI Oracle’a i perlembed Perla. Definicja biblioteki oraperl. create library oraperl as '/var/lib/oraperl.so'; 3U]\NáDGRZH SROHFHQLH ''/ ]H]ZDODMFH X*\WNRZQLNRZL scott QD Z\ZRá\ZDQLH SURFHGXU w Perlu. grant execute on oraperl to scott; Kod 3HUODUHDOL]XMF\IXQNFM perl_demo. package Demo; sub perl_demo { my p_file=shift; my @arr=stat(p_file); return $arr[7]; } ,QWHUIHMV ]DU]GF]\ PD QD FHOX GHILQLZDQLH XVXZDQLH PRG\ILNDFM SDNLHWyZ Perla i w przyV]áRFLDXWRPDW\F]QJHQHUDFM NRGX3/64/wrappera dla funkcji i/lub procedury oraz jej autoPDW\F]QNRPSLODFM LLQVWDODFM ZED]LHGDQ\FK3RSU]H]LQWHUIHMV]DU]GF]\PR*QD]GHILQLZDü czy kod 3HUODE G]LHSU]HFKRZ\ZDQ\ZV\VWHPLHSOLNyZF]\WH*ZVSHFMDOQ\FKWDEOLcach w dedyNRZDQ\PVFKHPDFLHZVDPHMED]LH2UDFOH,VWQLHMHQDZHWPR*OLZRü]GHF\GRZDQLDF]\NRGPerla Z\NRQ\ZDQ\ E G]LH Z NRQWHNFLH ZáDFLFLHOD F]\ WH* X*\WNRZQLND VáRZR NOXF]RZH $87+,' przy definicji wrappera. create type t_perl_array as table of varchar2; create or replace package dbms_perl as procedure setDBSource(p_flag boolean); function getDBSource return boolean; procedure addSearchPath(p_path varchar2); procedure deleteSearchPath(p_path varchar2); procedure addPerlSource(p_file varchar2); procedure deletePerlSource(p_path varchar2); procedure compileFunction(p_name varchar2, p_body varchar2); procedure dropFunction(p_name varchar2); procedure compileProcedure(p_name varchar2, p_body varchar2); procedure dropProcedure(p_name varchar2); function listSearchPaths() return t_perl_array; function listPerlFunctions() return t_perl_array; function listPerlProcedures() return t_perl_array; end; Baza danych 2UDFOHMDNRRWZDUWHUR]V]HU]DOQHLSRW *QHURGRZLVNRREOLF]HQLRZH 241 5. Architektura systemu 1DU\VXQNXSU]HGVWDZLRQD]RVWDáDRJyOQDDUFKLWHNWXUDLPSOHPHQWRZDQHJRV\VWHPX dedicated server process extproc IPC oraperl.so SGA I/O buffer cache and library cache libperl.so Data Base Blocks I/O File System Net 8 Perl package Perl package client Rys. 1 Opis systemu: Z punktu widzenia Oracle’a maszyna wirtualna 3HUODGRVW SQDMHVWSRSU]H]VWDQGDUGRZ\LQWHrIHMV]HZQ WU]Q\FKSURFHGXUVNáDGRZDQ\FKZÄ&´,QWHUIHMVWHQUHDOL]XMHSURFHVRQD]ZLHextproc. Sama maszyna wirtualna 3HUOD]QDMGXMHVL ZELEOLRWHFHlibperl.so%LEOLRWHNDWDZFKRG]LZVNáDG UXQWLPXND*GHMLQVWDODFML3HUOD1DV]NRGVSU] JDMF\]DZDUW\MHVWZELEOLRWHFHRQD]ZLHoraperl.so%LEOLRWHNDWDGHILQLXMHSXQNWZHMFLDGRPDV]\Q\ZLUWXDOQHMC_perl_entry_point oraz zajmuje VL LQLFMDOL]DFMVWHURZDQLHPSU]HSá\ZXLSU]HND]\ZDQLHPGDQ\FKOraclowych do Perla i danych zwrotnych w kierunku przeciwnym. Procedury z biblioteki oraperl ]DMPXM VL WH* EDUG]R SRdVWDZRZ REVáXJ Eá GyZ %á G\ runtimu 3HUOD V Z\FKZ\W\ZDQH Z ELEOLRWHFH oraperl a do 2UDFOH¶D ]ZUDFDQ\ MHVW Z\MWHN SRSU]H] PHFKDQL]P OCIExtProcRaiseExcp 5HDVXPXMF SR RWZDUFLXVHVMLSU]H]NOLHQWD2UDFOHZNRQILJXUDFMLVHUZHUDGHG\NRZDQHJRWZRU]RQ\MHVWGRNáDGQLH MHGHQ SURFHVZWHN X*\WNRZQLND *G\ DSOLNDFMD NOLHQFND SR UD] SLHUZV]\ RGZRáXMH VL GR NRGX 3HUODF]\OL]SXQNWXZLG]HQLD2UDFOHMHVWWRNRGÄ&´WRVHUZHUWZRU]\]HZQ WU]Q\SURFHVextproc, który dynamicznie OLQNXMHVL ]QDV]ELEOLRWHNRUDSHUOSRSU]H]ZL]DQLDzdefiniwane przy deklaracji generycznego wrappera. Implementacja funkcji C_perl_entry_point sprawdza czy jest Z\ZRáDQDSRUD]SLHUZV]\ZVHVMLLMHOLWDNWRLQLFMDOL]XMHPDV]\Q ZLUWXDOQPerla poprzez mechanizm perl_alloc, perl_construct 'OD ND*GHJR Z\ZRáDQLD Z\NRQ\ZDQ\ MHVW NRG perl_parse i call_argvSU]HND]XMF\DUJXPHQW\]inarray do funkcji 3HUODRUD]áDGXMF\ZDUWRFL]ZURWQHGR tablicy outarray po powrocie z funckji Perla. Biblioteka oraperl czyta z bazy danych parametry 242 3LRWU-DUPX* LQLFMDOL]XMFHDE\ZLHG]LHüJG]LHPDV]XNDüLMDNORNDOL]RZDüSDNLHW\ Perla (w systemie plików PERL_PATH lub w bazie danych z tablicy perl_code w schemacie perl:\ZRáDQLHperl_parse dokonuje analizy syntaktycznej, a wynikiem jego jest zoptymalizowany bytecode Perla odpowiaGDMF\ NRPSLORZDQHM IXQNFML :\ZRáDQLH SHUOBSDUVH MHVW ZHZQ WU]QLH ]RSW\PDOL]RZDQH W]Q ZLHORNURWQHZ\ZRáDQLHperl_parse na tym samym kodzie Perla nie powoduje wielokrotnej kompilaFML:\ZRáDQLHcall_argvSRZRGXMHZHMFLHGRPDV]\Q\Perla i wykonanie naszej funkcji. 3U]HSá\ZGDQ\FKLVWHURZDQLDGODSU]\NáDGRZHJRZ\ZRáDQLD: 3URJUDPNOLHQWDPR*HWRE\üGRZROQ\NOLHQWOracle’a np. SQL*Plus albo TOAD, lub dowolna DSOLNDFMDQSX*\ZDMFD-'%&Javy albo DBI 3HUODZ\V\áD]DS\WDQLH64/RZH]DZLHUDMFHSoUHGQL UHIHUHQFMH GR ]HZQ WU]QHM SURFHGXU\ VNáDGRZDQHM Z 3HUOX .OLHQW PR*H ZLG]LHü W\ONR funkcje SQL-a, funkcje PL/64/DDOERDQRQLPRZHEORNL]DZLHUDMFHSURFHGXU\3/SQL-a. Procedury jak i funkcje PL/64/DPRJE\üVDPRG]LHOQHMDNLQDOH*HüGRSDNLHWX.OLHQWZLG]LQDV] IXQNFM 3/64/NWyUDMHVWZUDSSHUHPGODNRGXZÄ&´LSRUHGQLRNRGXZPerlu, przekazuje paUDPHWU\ZHMFLRZHGRJHQHU\F]QHJRSXQNWXZHMFLDGRPDV]\Q\ZLUWXDOQHM3HUODJG]LHQDVW SXMH ZDUXQNRZDNRPSLODFMDMHOLNRGMHVWGRVWDUF]RQ\SRUD]SLHUZV]\GRWHMLQVWDQFMLPDV]\Q\ZLUWuDOQHMLZ\NRQDQLHQDVW SQLHHZHQWXDOQHZDUWRFL]ZURWQHSU]HND]\ZDQHV]SRZURWHPGRIXQkcji ZUDSSHUD L RU\JLQDOQHJR NRGX NOLHQWD 3U]HND]\ZDQH SDUDPHWU\ PRJ E\ü GRZROQHJR W\SX VNDODUQHJRQLHLVWQLHMHPR*OLZRüSU]HND]\ZDQLDNROHNFMLUHNRUGyZLobjektów SQL-a), wszystkie parametry przed przekazaniem do 3HUODNRQZHUWRZDQHVGRstringów i pakowane do tablicy. 3HUOMHVWM ]\NLHPWUDNWXMF\PGDQHSROLPRUILF]QLHW]Q]DOH*QLHRGNRQWHNVWXGDQDPR*HE\üZiG]LDQDMDNRWHNVWOLF]EDVWDáROXE]PLHQQRSU]HFLQNRZDGDWDSRMHG\QF]\]QDN(ZHQWXDOQDNRnZHUVMDGRNRQ\ZDQDMHVWÄOHQLZLH´W]QEH]SRUHGQLRSU]HGX*\FLHPDZ\QLNNRQZHUVMLMHVW]DSaPL WDQ\ 2F]\ZLFLH WDND NRQZHUVMD VSRZDOQLD GRGDWNRZR FDá\ SURFHV QLH PQLHM MHGQDN MHVW WR NRQLHF]Q\ NURN Z QDV]HM LPSOHPHQWDFML :DUWRFL SRZURWQH WUDNWRZDQH V UyZQLH* MDNR stringi. Konwersja zwrotna GRNRQ\ZQDMHVWDXWRPDW\F]QLHSU]H]NRPSLODWRU3/64/QDJUDQLF\Z\ZRáania oryginalnego kodu klienta i kodu wrappera dla kodu Perla. 6. .RU]\FLLSUREOHP\Z\QLNDMFH]LPSOHPHQWDFMLV\VWHPX =DVDGQLF]\PSUREOHPHPSU]\LPSOHPHQWDFMLE\á\SUREOHP\]NRQILJXUDFMLNRPSLODFMSUoMHNWX1LHVWHW\QLHXGDáRVL SU]HQLHüSURMHNWXSR]DURGRZLVNRlinuxa (GHELDQ-HOLFKRG]L o NRU]\FL]X*\ZDQLDV\VWHPXWRPR*QDE\MHRSLVDüSRSU]H]]PRG\ILNRZDQPDQWU 7RPDKyta. • -HOLSUREOHPGDVL UR]ZL]DüZ64/X]UyEWRZ64/X • -HOLSUREOHPQLHGDVL UR]ZL]DüZ64/X]UyEWRZ3/SQL-u • -HOLSUREOHPQLHGDVL UR]ZL]DüZ3/SQL-u, zrób to w Javie • -HOLSUREOHPQLHGDVL UR]ZL]DüZJavie, zrób to C (lub w Perlu) • -HOLSUREOHPQLHGDVL UR]ZL]DüZ&(lub w Perlu)ZUyüGRGHVNLNUHODUVNLHM 2JyOQLHNODV SUREOHPyZGDMF\FKLQDGDMDF\FKVL GRUR]ZL]DQLDSU]\X*\FLXRJyOQHJRPeFKDQL]PXSURFHGXUVNáDGRZDQ\FKGDVL SRG]LHOLüQDNLONDURG]DMyZ 1. 0DáDLORüREOLF]HQDPDáHMLORFLGDQ\FK 2. 0DáDLORüREOLF]HQDGX*HMLORFLGDQ\FK 3. 'X*DLORüREOLF]HQDPDáHMLORFLGDQ\FK 4. 'X*DLORüREOLF]HQDGX*HMLORFLGDQ\FK : SU]\SDGNX SURFHGXU VNáDGRZDQ\FK Z 3HUOX ]H Z]JO GX QD RJUDQLF]HQLD LPSOHPHQWDF\MQH Z\PDJDMFHX*\FLDFRQDMPQLHMSU]HVWU]HQLDGUHVRZ\FKLFRQDMPQLHMSURFHVyZDFR]DW\P LG]LH UHODW\ZQLH Z\VRNL NRV]W SU]HáF]DQLD NRQWHNVWyZ L NRSLRZDQLD GDQ\FK PL G]\ SU]HVWU]eQLDPLDGUHVRZ\PLNRV]WWHQPR*HE\üF] FLRZRVNRPSHQVRZDQ\MHOLSUREOHPQDOH*\GRNODV\ Baza danych 2UDFOHMDNRRWZDUWHUR]V]HU]DOQHLSRW *QHURGRZLVNRREOLF]HQLRZH 243 7]Q LVWQLHMH VWRVXQNRZR GX*D OLF]ED REOLF]H QD QLHZLHONLHM LORFL GDQ\FK VWULFWH bazodanoZ\FK :WHG\ JG\ NRPXQLNDFMD PL G]\ enginem SQL, a 3HUOHP VSURZDG]D VL GR SU]HND]DQLD NLONXSDUDPHWUyZVNDODUQ\FKL]ZURWXNLONXZDUWRFLVNDODUQ\FKDZ\NRQDQLHVDPHJRDOJRU\WPX jest niejako delegowane do 3HUODNWyU\Z\NRQXMHREOLF]HQLDQSQDGDQ\FK]HZQ WU]Q\FKZV\sWHPLHSOLNyZF]\SRSU]H]VLHü7RPDVHQVDOERZLHPSURJUDPRZDQLHGRVW SXI/O i sieci w Perlu jest o wieOH SURVWV]H L EDUG]LHM QDWXUDOQH QL* Z QLHFR DNDGHPLFNLP M ]\NX MDNLP MHVW 3/64/ RF]\ZLFLHFKRG]LRUHGXQGDQWQLJHQHUDOQLHQLHSUDNW\F]QVNáDGQLH3/64/DDQLHRPR*OiZRFLWHJRM ]\ND]ZáDV]F]DMHOLFKRG]LRLQWHJUDFM ]64/HP]DU]G]DQLHWUDQVDNFMDPLitp) 7. Wnioski oraz perspektywy zastosowania 3U]\NáDGRZ\SURMHNWSRND]XMHL*LQWHJUDFMDWDNUy*QRURGQ\FKURGRZLVNMDN2UDFOHL3HUOMHVW PR*OLZD&HOHPSURMHNWXE\áDGHPRQVWUDFMD*HWDNDLQWHJUDFMDMHVWPR*OLZDFKRüQLHáDWZDDQLQLH wydajna. Najnowsza wersja Serwera 2UDFOH¶D J ]DZLHUD MX* ZLHOH SDNLHWyZ ZEXGRZDQ\FK PLQ REVáXJXMF\FK Z\UD*HQLD UHJXODUQH ]JRGQH ] 3HUO 2520DWFKHU D ZL F JáyZQ\ DWXW Perla ]RVWDáQLHMDNRZ\WUFRQ\=GUXJLHMVWURQ\2UDFOHSRGREQLHMDNLQQLZLHOF\JUDF]HQDU\QNXVHrZHUyZED]GDQ\FKLDSOLNDFML]DF]\QDMSRZROLGRVWU]HJDü]DOHW\M ]\NyZVNU\SWRZ\FKWDNLFKMDN 3+3 L 3HUO RUD] LFK QLHZWSOLZ SU]HZDJ QDG -DYD PLDQRZLFLH HIHNW\ZQRü UR]ZRMX RSURJUaPRZDQLD 0R*QD ZL F PLHü QDG]LHMH *H QDVW SQD ZHUVMD VHUZHUD 2UDFOH¶D E G]LH PLDáD MX* wVZ\PMGU]H]LQWHJURZDQ\LQWHUSUHWHULPDV]\Q ZLUWXDOQPerla i/lub PHP, a co za tym idzie Z\GDMQRü Z UXQWLPLH QLH E G]LH MX* WDN GUDVW\F]QLH RGELHJDü RG SURFHGXU VNáDGRZDQ\FK SLVaQ\FKEH]SRUHGQLRZ3/64/LJavie. Bibliografia [TKYTE1] [TKYTE2] [BKUHN] Thomas Kyte, Expert One-on-One Oracle, Apress Thomas Kyte, Effective Oracle by Design, Apress Bradley M. Kuhn, "perljvm: Using B to Facilitate a Perl Port To the Java Virtual Machine"., San Diego CA, 23-27 July, 2001