Baza danych Oracle jako otwarte, rozszerzalne i potężne
Transkrypt
Baza danych Oracle jako otwarte, rozszerzalne i potężne
XII Konferencja PLOUG Zakopane 3D(G]LHUQLN Baza danych Oracle jako otwarte, UR]V]HU]DOQHLSRW *QHURGRZLVNR obliczeniowe. Integracja Maszyny Wirtualnej Perla zMGUHPOracle 3LRWU-DUPX* ITTI sp. z o.o. e–mail: [email protected] Abstrakt 3URMHNWLDUW\NXáPDMQDFHOXSRND]DQLH*H2UDFOHWRFR]QDF]QLHZL FHMQL*W\ONRF]DUQDVNU]\QNDSU]HWZDU]DMFD]DSytania SQL. W bazie danych 2UDFOHLVWQLHMHV]HUHJRWZDUW\FKLXGRNXPHQWRZDQ\FK$3,XPR*OLZLDMF\FKGRZROQHUR]V]eU]DQLHMGUD2UDFOH3DU ODWWHPX]DMáHPVL SURMHNWHPKREE\VW\F]Q\PPDMF\PQDFHOX]LQWHJURZDQLHURGRZLVNDM ]yka Perl i bazy danych 2UDFOHXPR*OLZLHQLHSLVDQLDSURFHGXUVNáDGRZDQ\FKZ3HUOX:\NRU]\VWDQLHGRVNRQDá\FK]GROQoFL 3HUOD GR SU]HWZDU]DQLD WHNVWyZ ]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 realizacji proMHNWXLQWHJUDF\MQHJR$UW\NXáGRW\F]\ED]\GDQ\FKOracle 9i r2 i wersji maszyny Perla 5.8.0. Audytorium 'RNXPHQWWHQSU]H]QDF]RQ\MHVWGODUHGQLRLZ\VRNR]DDZDQVRZDQ\FKX*\WNRZQLNyZOracle’a. Wymagana jest elementarna wiedza na temat systemu UNIX//LQX[EDUG]RGREUD]QDMRPRüDUFKLWHNWXU\VHUZHUDED]GDQ\FKOracle w rozdziaáDFK GRW\F]F\FK VWUXNWXU\ SURFHVyZ L VWUXNWXU JOREDOQHM G]LHORQHM SDPL FL :\PDJDQD MHVW ]DDZDQVRZDQD ]QDMRPRü PL/SQL i 3HUODZV]F]HJyOQRFLZNRQWHNFLHLQWHJUDFMLREXM ]\NyZ]URGRZLNVLHPruntimowym „C”, API OCI i perOHPEHG 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. Baza danych Oracle jako otwarte, UR]V]HU]DOQHLSRW *QHURGRZLVNRREOLF]HQLRZH 95 1. Rozszerzalna architektura Oracle Serwer bazy danych 2UDFOHWRQLHW\ONR]Z\Ná\VHUZHU64/F]DUQDVNU]\QNDGRNWyUHMZU]XFD VL ]DS\WDQLDSQL-owe i oczekuje na tabularyczne rezultaty. Serwer 2UDFOHWRSRW *QHURGRZLVNR REOLF]HQLRZH XPR*OLZLDMFH UR]ZL]\ZDQLH QDZHW QDMEDUG]LHM VNRPSOLNRZDQ\FK SURMHNWyZ wGX*HM mierze w samym serwerze [TKYTE1]. Serwer bazy danych Oracle oferuje wiele dobrze RSLVDQ\FK L RWZDUW\FK $3, XPR*OLZLDMF\FK áDWZ LQWHJUDFM ] LVWQLHMF\P RSURJUDPRZDQLHP zZ\NRU]\VWDQLHPVWDQGDUGRZ\FKSURWRNRáyZ6HUZHUOracle posiada oprócz standardowego enJLQD64/]JRGQHJR]HVWDQGDUGHP$16,V]HUHJZEXGRZDQ\FKM ]\NyZSURJUDPRZDQLD iJHQHUDFML:MGU]HOracle ]LQWHJURZDQQ\]64/MHVWM ]\NJHQHUDFML3/64/RGZHUVML[ Z VNáDG VHUZHUD 2UDFOH ZFKRG]L ZáDVQD LPSOHPHQWDFMD PDV]\Q\ ZLUWXDOQHM Java „Aurora” oraz VWDQGDUGRZH URGRZLVNR UXQWLPRZH -5( JHQHUDFML RUD] GR SURJUDPRZDQLD QD QDMQL*V]\P SR]LRPLH M ]\N Ä&´ GR UR]ZL]\ZDQLD QDMEDUG]LHM QLHW\SRZ\FK ]DGD GOD NWyU\FK Z\PDJDQLD F]DVRZH V NU\W\F]QH RUD] GOD W\FK ]DGD JG]LH Z\PDJDQD MHVW LQWHJUDFMD ] LVWQLHMF\P V\VWePDPLGODNWyU\FKLVWQLHMW\ONRLQWHUIHMV\ELQDUQHZM ]\NXÄ&´ 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. 2. Java Od wersji 8.x 2UDFOHRIHUXMHQRZ\M ]\N±JHQHUDFMLJava. 2UDFOH]DLPSOHPHQWRZDáZáDVQ ZHUVM -90$XURUDNWyUDMHVW]GHF\GRZDQLHV]\EV]DLOHSLHMQDGDMHVL GRUR]ZRMXRSURJUDPowania w -DYLHQL*MDNDNROZLHNLQQDLPSOHPHQWDFMD-90'ODRVyE]DMPXMF\FKVL SURIHVMRQDlnym rozwojem oprogramowania w -DYLH QDMZD*QLHMV]\ MHVW IDNW L* QLH Z\PDJDQ\ MHVW UHVWDUW serwera, 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]\dbms_java z poziomu 64/DDOER]DSRPRFQDU] G]LDload_java z linii komendy 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. 96 3LRWU-DUPX* 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 ]\NLHP F]\VWR LQWHUSUHWRZDQ\P 0R*QD ZyUy*QLüW\SRZHID]\FKDUDNWHU\VWV\F]QHGODM ]\NyZNRPSLORZDQ\FKWDNLFKMDNÄ&´OXEJava. Interpreter 3HUODVNáDGDVL ]parsera i wykonawcy. 3DUVHUGRNRQXMHDQDOL]\V\QWDNW\F]QHMPRGXáX aZ\QLNLHP 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áDGVWDQGDUGRZHMLQVWDODFML3HUODQDND*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 wyNRU]\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 =HZ]JO GXQDRJUDQLF]HQLDF]DVRZHSURMHNWXMDNLSRWHQFMDOQHSUREOHP\]Z\GDMQRFL]DGeF\GRZDQRL*LQWHJUDFMDZLUWXDOQHMPDV]\Q\Perla z serwerem 2UDFOHRJUDQLF]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Ä&´Oracle ofeUXMH VSRVyE QD SU]HFKRZ\ZDQLH JOREDOQ\FK GDQ\FK Ä&´ VNRMDU]RQ\FK ] VHVM X*\WNRZQLND Baza danych Oracle jako otwarte, UR]V]HU]DOQHLSRW *QHURGRZLVNRREOLF]HQLRZH 97 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 Z\NRQywania dodatkowych kroków. Kod procedury ZUDSSHUDNRQZHUWXMF\SDUDPHWU\ZHMFLRZHGRWDEOLF\W\SXYDUFKDULRGGaMF\VWHURZDQLHGRJHQHU\F]QHJRSXQNWXZHMFLDGRPDV]\Q\ZLUWXDOQHMPerla. Ewentualne paraPHWU\ Z\MFLRZH OXE ZDUWRü ]ZUDFDQD SU]H] IXQNFM V SDNRZDQH Z WDEOLF 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. 7U]\NROHMQHLQVWUXNFM Z\NRQ\ZDQHVMHGQRNURWQLHSRGF]DVLQVWDODFMLV\VWHPX 2WRGHNODUDFMDSXQNWXZHMFLDGRPDV]\Q\ZLUWXDOQHMPerla. 98 3LRWU-DUPX* 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 Oracle i Perl, wykorzystuje API 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\FKWDEOLFDFKZGHGykowanym schemacie w samej bazie 2UDFOH,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); Baza danych Oracle jako otwarte, UR]V]HU]DOQHLSRW *QHURGRZLVNRREOLF]HQLRZH 99 procedure dropProcedure(p_name varchar2); function listSearchPaths() return t_perl_array; function listPerlFunctions() return t_perl_array; function listPerlProcedures() return t_perl_array; end; 5. Architektura systemu 1DU\VXQNXSU]HGVWDZLRQD]RVWDáDRJyOQDDUFKLWHNWXUDLPSOHPHQWRZDQHJRV\VWHPX dedicated server process extproc IPC oraper- libperl.so SGA buffer cache and library cache I/O Data Base Blocks I/O File System Perl packages Net 8 Perl packages 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 100 3LRWU-DUPX* 2UDFOH¶D ]ZUDFDQ\ MHVW Z\MWHN SRSU]H] PHFKDQL]P OCIExtProcRaiseExcp 5HDVXPXMF SR otwarciu sesji przez klienta 2UDFOHZNRQILJXUDFMLVHUZHUDGHG\NRZDQHJRWZRU]RQ\MHVWGRNáDGQLH MHGHQ SURFHVZWHN X*\WNRZQLND *G\ DSOLNDFMD NOLHQFND SR UD] SLHUZV]\ RGZRáXMH VL GR NRGX Perla (czyli z punktu widzenia 2UDFOHMHVWWRNRGÄ&´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 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 komSLODFML:\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. 3HUO MHVW M ]\NLHP WUDNWXMF\P GDQH SROLPRUILF]QLH W]Q ]DOH*QLH RG NRQWHNVWX GDQD PR*H E\ü ZLG]LDQD MDNR WHNVW OLF]ED VWDáR OXE ]PLHQQRSU]HFLQNRZD GDWD SRMHG\QF]\ ]QDN (ZHQWXDOQD NRQZHUVMD GRNRQ\ZDQD MHVW ÄOHQLZLH´ W]Q EH]SRUHGQLR SU]HG X*\FLHP D Z\QLN NRQZHUVML MHVW ]DSDPL WDQ\2F]\ZLFLHWDNDNRQZHUVMDVSRZDOQLDGRGDWNRZRFDá\SURFHVQLHPQLHMMHGQDNMHVW WRNRQLHF]Q\NURNZQDV]HMLPSOHPHQWDFML:DUWRFLSRZURWQHWUDNWRZDQHVUyZQLH*MDNRstringi. 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]LR NRU]\FL]X*\ZDQLDV\VWHPXWRPR*QDE\MHRSLVDüSRSU]H]]PRG\ILNRZDQPDQWU 7RPDKyta. • -HOLSUREOHPGDVL UR]ZL]DüZSQL-u, zrób to w SQL-u • -HOLSUREOHPQLHGDVL UR]ZL]DüZSQL-u, zrób to w PL/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 Baza danych Oracle jako otwarte, UR]V]HU]DOQHLSRW *QHURGRZLVNRREOLF]HQLRZH 101 2JyOQLHNODV SUREOHPyZGDMF\FKLQDGDMDF\FKVL GRUR]ZL]DQLDSU]\X*\FLXRJyOQHJRPeFKDQL]PXSURFHGXUVNáDGRZDQ\FKGDVL SRG]LHOLüQDNLONDURG]DMyZ 1. 2. 3. 4. 0DáDLORüREOLF]HQDPDáHMLORFLGDQ\FK 0DáDLORüREOLF]HQDGX*HMLORFLGDQ\FK 'X*DLORüREOLF]HQDPDáHMLORFLGDQ\FK '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\ 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 MHVW R ZLHOH SURVWV]H L EDUG]LHM QDWXUDOQH QL* Z QLHFR DNDGHPLFNLP M ]\NX MDNLP MHVW 3/64/ RF]\ZLFLHFKRG]LRUHGXQGDQWQLJHQHUDOQLHQLHSUDNW\F]QVNáDGQLH3/64/DDQLH R PR*OiZRFLWHJRM ]\ND]ZáDV]F]DMHOLFKRG]LRLQWHJUDFM ]64/HP]DU]G]DQLHWUDQVDNFMDPLitp) 7. Wnioski oraz perspektywy zastosowania 3U]\NáDGRZ\SURMHNWSRND]XMHL*LQWHJUDFMDWDNUy*QRURGQ\FKURGRZLVNMDNOracle i Perl jest 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\Oracle podobnie jak inni wielcy gracze na rynku serZHUyZED]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] Thomas Kyte, Expert One-on-One Oracle, Apress [TKYTE2] Thomas Kyte, Effective Oracle by Design, Apress [BKUHN] Bradley M. Kuhn, “perljvm: Using B to Facilitate a Perl Port To the Java Virtual Machine”., San Diego CA, 23-27 July, 2001