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