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

Podobne dokumenty