Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
$129(59,(:2)64/-(0%(''('64/,1-$9$
-XOLH%DVX2UDFOH&RUSRUDWLRQ
,1752'8&7,21
2YHUWKHSDVWWZR\HDUV-DYDKDVEHFRPHWKHODQJXDJHRIFKRLFHIRUGHYHORSLQJ,QWHUQHWDQGLQWUDQHWDSSOLFDWLRQV,WV
SURPLVHRIDVWDQGDUGL]HGSRUWDEOHDQGQHWZRUNFHQWULFDSSOLFDWLRQGHYHORSPHQWVROXWLRQLVEHLQJUHDOL]HGVWHDGLO\DQG-DYD
DSSOHWVDQGVHUYOHWVDUHDSSHDULQJDOORYHUWKH:RUOG:LGH:HEEULQJLQJULFKDQGYDULHGIXQFWLRQDOLW\WRWKHSUHYLRXVO\VWDWLF
PHGLXP7KHLQGXVWU\OHDGLQJ2UDFOHLGDWDVHUYHUSURYLGHVFRPSUHKHQVLYH-DYDVXSSRUWDWERWKWKHFOLHQWDQGWKHVHUYHULQD
YDULHW\RIZD\V>@,QWKLVSDSHUZHSUHVHQWDQRYHUYLHZRIWKHIHDWXUHVRI64/-DWRROWKDWDOORZVHPEHGGLQJRIVWDWLF64/
VWDWHPHQWVWH[WXDOO\LQ-DYDSURJUDPV7KH64/-WUDQVODWRUFRQYHUWVVXFKSURJUDPVWRSXUH-DYDFRGHRSWLRQDOO\FKHFNLQJ
WKHVWDWLF64/VWDWHPHQWVDJDLQVWDGDWDEDVHVFKHPD7KHJHQHUDWHG-DYDFRGHFDQEHFRPSLOHGDQGWKHQH[HFXWHGWKURXJKD
-'%&GULYHUDJDLQVWWKHGDWDEDVH2UDFOHLDOVRVXSSRUWV64/-VWRUHGSURFHGXUHVIXQFWLRQVDQGWULJJHUVZKLFKH[HFXWHRQD
-DYD9LUWXDO0DFKLQHLQWHJUDWHGZLWKWKHGDWDVHUYHU>@WKXVHQDEOLQJIOH[LEOHGHSOR\PHQWFRQILJXUDWLRQVDQGFRGHSDUWLWLRQ
DQGPLJUDWLRQDFURVVGLIIHUHQWWLHUV6RPHPDMRUEHQHILWVRI64/-DUHLQFUHDVHGXVHUSURGXFWLYLW\WKURXJKFRPSDFWV\QWD[
UREXVWSURJUDPPLQJGXHWR64/FKHFNLQJDWGHYHORSPHQWWLPHVWDQGDUGL]DWLRQE\PDMRUGDWDEDVHYHQGRUVDQGSRUWDELOLW\RI
ELQDU\FRGHDFURVVGLIIHUHQWYHQGRUV·GDWDEDVHV
7KHSDSHULVRUJDQL]HGDVIROORZV,QVHFWLRQZHUHYLHZWKH64/-IUDPHZRUNIRUSURJUDPGHYHORSPHQWDQGLWVEHQHILWV
6HFWLRQSURYLGHVDWHFKQLFDORYHUYLHZRIWKH64/-ODQJXDJHLQFOXGLQJWKHXVHRIFRPSOH[-DYDKRVWH[SUHVVLRQVDVELQG
SDUDPHWHUV64/-LWHUDWRUVIRUTXHU\LQJGDWDDQGFDOOVWRVWRUHGSURFHGXUHV:HLOOXVWUDWHWKURXJKDGHWDLOHGH[DPSOHWKH
VWHSVLQYROYHGLQGHYHORSLQJD64/-SURJUDPVKRZLQJKRZWRKDYHWKH64/-WUDQVODWRUFKHFNDOOWKHVWDWLF64/VWDWHPHQWV
DJDLQVWDGDWDEDVHVFKHPD1H[WZHGHPRQVWUDWHWKHXVHRIG\QDPLF64/DQGVKRZKRZ64/-LQWHURSHUDWHVVHDPOHVVO\
ZLWK-'%&FRGHDOORZLQJG\QDPLF64/VWDWHPHQWVZULWWHQLQ-'%&WRFRH[LVWZLWKWKHVWDWLFRQHVLQ64/-)LQDOO\ZH
GHVFULEHWKHSURFHVVRIGHILQLQJDQGUXQQLQJD64/-VWRUHGSURFHGXUHLQWKH2UDFOHLGDWDVHUYHU:HFRQFOXGHZLWKD
FRPSDULVRQRIWKH64/-$3,ZLWKWKH-'%&LQWHUIDFHDQGVXPPDUL]HWKHEHQHILWVRI64/-DQG2UDFOH·V64/-VWUDWHJ\
7+(64/-)5$0(:25.$1',76%(1(),76
7KLVVHFWLRQGHVFULEHVWKHDSSOLFDWLRQGHYHORSPHQWIUDPHZRUNIRU64/-LQWHUPVRIWKHVWHSVUHTXLUHGWRWUDQVODWHFRPSLOH
DQGUXQD64/-SURJUDP:HDOVRGLVFXVVWKHEHQHILWVRIWKH64/-VWDQGDUGDQGRILWVLPSOHPHQWDWLRQE\2UDFOH
'(9(/23,1*$33/,&$7,21686,1*64/-
7KH64/-WUDQVODWRUFRQYHUWV-DYDSURJUDPVFRQWDLQLQJHPEHGGHGVWDWLF64/VWDWHPHQWVLQWR-DYDSURJUDPVZLWKFDOOVWRWKH
64/-UXQWLPH7KLVSURFHVVLVVLPLODUWRWKH3UR
&SUHFRPSLOHUWUDQVODWLQJ64/VWDWHPHQWVHPEHGGHGLQ&DPDLQGLIIHUHQFH
EHLQJWKDWJHQHUDWHGFRGHLQ64/-FRQIRUPVWRDYHQGRUQHXWUDOVWDQGDUG9HQGRUVSHFLILFIHDWXUHVDQGH[WHQVLRQVDUHZHOO
VXSSRUWHGLQ64/-WKURXJKVXEVHTXHQWFXVWRPL]DWLRQRI-DYDE\WHFRGH'HYHORSLQJDQGUXQQLQJD64/-DSSOLFDWLRQZLWK
2UDFOHFRQVLVWVRIIRXUVWHSVZKLFKDUHVKRZQLQ)LJXUHDQGOLVWHGEHORZ
7UDQVODWLRQRI64/-VRXUFHILOHVZLWKWKH64/-WUDQVODWRU7KLVJHQHUDWHV-DYDILOHVZLWKFDOOVWRWKH64/-UXQWLPHDVZHOO
DVELQDU\64/-SURILOHILOHVWKDWFRQWDLQLQIRUPDWLRQDERXWWKHVWDWLF64/VWDWHPHQWVSUHVHQWLQWKH64/-VRXUFH
&RPSLODWLRQRI-DYDFRGHZLWKD-DYDFRPSLOHU
&XVWRPL]DWLRQRIWKHJHQHUDWHG64/-SURILOHVIRUXVLQJ2UDFOHVSHFLILFGDWDW\SHVDQGH[WHQVLRQV
5XQQLQJWKHDSSOLFDWLRQXVLQJWKH64/-UXQWLPHOLEUDU\DQGD-'%&GULYHUIRU2UDFOH
64/-FDQSHUIRUP6WHSVWRE\WUDQVSDUHQWO\LQYRNLQJWKH64/-WUDQVODWRUD-DYDFRPSLOHUDQGWKHQDSURILOHFXVWRPL]HU
$WWUDQVODWLRQWLPHWKHWUDQVODWRUFDQRSWLRQDOO\FKHFNWKH64/V\QWD[DQGVHPDQWLFVDJDLQVWDXVHUVFKHPDDQGYHULI\WKH
W\SHFRPSDWLELOLW\RIKRVWYDULDEOHVZLWK64/W\SHVIRUDOOVWDWLF64/VWDWHPHQWVLQWKHSURJUDP,QJHQHUDOWKH64/-UXQWLPH
LVDEOHWRXVHDQ\-'%&GULYHUIRUH[HFXWLRQDQGZLOOZRUNHYHQZLWKDQRQ-'%&LPSOHPHQWDWLRQ7KH2UDFOH64/-
Paper 607
Exploiting Java, Objects, & Components
UXQWLPHFDQXVHHLWKHU2UDFOH·V-'%&2&,RU-'%&WKLQGULYHUVDVVSHFLILHGE\WKHXVHU'HWDLOVRIWKH-'%&2&,DQG
-'%&WKLQGULYHUVIURP2UDFOHFDQEHIRXQGLQ>@
2 UDFOH 2 UDFOH
)LJXUH7KH64/-$SSOLFDWLRQ'HYHORSPHQW3URFHVV
$5HIHUHQFH,PSOHPHQWDWLRQRI64/-KDVEHHQGHYHORSHGDW2UDFOHLQFROODERUDWLRQZLWKPDMRUYHQGRUVVXFKDV,%0,QIRUPL[
-DYD6RIW6\EDVH7DQGHPDQGRWKHUV7KLV5HIHUHQFH,PSOHPHQWDWLRQLVZULWWHQHQWLUHO\LQ-DYDDQGKDVDSOXJLQ
DUFKLWHFWXUHIRUHDV\LQWHJUDWLRQLQWRGHYHORSPHQWWRROV7KH64/-WUDQVODWRUDUFKLWHFWXUHLVDOVRRSHQDQGH[WHQVLEOHZKLFK
SHUPLWV64/FKHFNLQJDQGUXQWLPHFXVWRPL]DWLRQIRUDUELWUDU\GDWDEDVHVWKURXJK-DYDSOXJLQV6RXUFHFRGHIRUWKH64/-
5HIHUHQFH,PSOHPHQWDWLRQKDVEHHQPDGHDYDLODEOHIUHHO\WRWKHSXEOLFDQGWRRWKHUGDWDEDVHYHQGRUV
%(1(),762)7+(64/-67$1'$5'
64/-ZDVGHYHORSHGFRRSHUDWLYHO\E\WKHPDMRUGDWDEDVHYHQGRUVSULPDULO\WRSURYLGH-DYDDSSOLFDWLRQGHYHORSHUVZLWKD
VLPSOHDQGKLJKO\SURGXFWLYHGDWDEDVHSURJUDPPLQJWRRO7KHPDMRUEHQHILWVRIWKH64/-VWDQGDUGDUHHQXPHUDWHGEHORZ
$PXFKPRUHFRQFLVHV\QWD[IRUGDWDEDVHDFFHVVDQGLPSURYHGGHYHORSHUSURGXFWLYLW\
7UDQVODWHWLPHFKHFNLQJRIWKHV\QWD[DQGVHPDQWLFVRIDOOVWDWLF64/VWDWHPHQWV
6WURQJW\SLQJRITXHULHVWKURXJKLWHUDWRUW\SHVDQGRIGDWDEDVHFRQQHFWLRQVWKURXJKFRQQHFWLRQFRQWH[WW\SHV
'\QDPLF64/VXSSRUWWKURXJKWKHHVWDEOLVKHG-'%&LQWHUIDFHIRUGDWDEDVHDFFHVV64/-DQG-'%&FRQVWLWXWH
FRPSOHPHQWDU\WHFKQRORJLHVDQGLWLVSRVVLEOHWRPL[DQGPDWFK64/-DQG-'%&FRGHLQWKHVDPHDSSOLFDWLRQ
6RXUFHOHYHOSRUWDELOLW\WKURXJKYHQGRUQHXWUDOODQJXDJHV\QWD[DQGELQDU\SRUWDELOLW\WKURXJK$16,VWDQGDUGL]DWLRQRI
64/-SURILOHVDQGUXQWLPH$GGLWLRQDOXQLIRUPLW\LVREWDLQHGIURPWKHVKDUHG5HIHUHQFH,PSOHPHQWDWLRQDQG
VWDQGDUGL]HG-'%&GULYHUV
'DWDEDVHLQGHSHQGHQFHWKURXJKFXVWRPL]DWLRQRIWKHELQDU\64/-SURILOHVWKDWGHVFULEHWKHVWDWLF64/VWDWHPHQWV
&XVWRPL]DWLRQFDQEHXWLOL]HGIRUYHQGRUVSHFLILFIHDWXUHVIRUPLJUDWLRQWRGLIIHUHQWGDWDEDVHVIRUGHEXJJLQJDQGORJJLQJ
SXUSRVHVDQGIRUSHUIRUPDQFHHQKDQFHPHQWVWKURXJKFDFKLQJRUSUHFRPSLODWLRQRI64/RSHUDWLRQV
)OH[LEOHGHSOR\PHQWFRQILJXUDWLRQV7KH64/-UXQWLPHLVZULWWHQLQSXUH-DYDZKLFKPHDQVWKDW64/-DSSOLFDWLRQVFDQ
EHGHSOR\HGZKHUHYHU-'%&LVGHSOR\HGVXFKDVRQDWKLQFOLHQWDWKLFNFOLHQWLQWKHPLGGOHWLHURULQWKHVHUYHU
$VSDUWRIWKHPXOWLYHQGRUVWDQGDUGVHIIRUWWKH64/-3DUWVSHFLILFDWLRQIRUWKHHPEHGGLQJRIVWDWLF64/VWDWHPHQWVLQWKH
-DYDODQJXDJHKDVEHHQVXEPLWWHGWR$16,DV'UDIW;+64/-3DUWDQG3DUWSURSRVDOVGHDOZLWK64/-VWRUHG
SURFHGXUHVDQGVWRUHG-DYDFODVVHVDQGDUHDWSUHVHQWEHLQJGHYHORSHGE\WKH64/-SDUWQHUVLQFOXGLQJ2UDFOH
675(1*7+62)25$&/(·664/-,03/(0(17$7,21
$VWKHLQGXVWU\OHDGHU2UDFOHKDVQRWRQO\KHOSHGWRGHYHORSWKH64/-VWDQGDUGEXWKDVDOVRDGRSWHGLWIXOO\$GGLWLRQDOO\
2UDFOHKDVLQWHJUDWHG64/-LQLWVGDWDEDVHDQGWRROV:HQRWHEHORZWKHPDMRUVWUHQJWKVRI2UDFOH·V64/-LPSOHPHQWDWLRQ
7LJKWLQWHJUDWLRQZLWKWKH-DYD90HPEHGGHGLQWKH2UDFOHLGDWDVHUYHU Integrating SQLJ with the server allows stored
procedures, functions, and triggers to be written in SQLJ, and supports a uniform programming style at the client and the server.
,QWHJUDWLRQRIWKH64/-WUDQVODWRUZLWK2UDFOH·V-'HYHORSHUWRRO-'HYHORSHULVDJUDSKLFDO,'(WKDWDOORZV SQLJ
translation, Java compilation, and profile customization to be performed in one step, also provides debugging support at the SQLJ
source code level. A production version of JDeveloper is currently available.
2UDFOH·VRZQ64/&KHFNHUPRGXOHIRUWUDQVODWHWLPHYHULILFDWLRQRIWKHV\QWD[DQGVHPDQWLFVRIVWDWLF64/VWDWHPHQWV
Paper 607
Exploiting Java, Objects, & Components
Support for Oracle-specific datatypes such as REFCURSORs, LOBs, and Oracle8 object types through Oracle’s own profile
customizer. The SQLJ customization process allows Oracle-specific extensions without jeopardizing standards compliance.
,PSURYHGSHUIRUPDQFHIRUWKH2UDFOHGDWDEDVHWKURXJKFXVWRPL]HGSURILOHV
)XUWKHUH[WHQVLRQVDQGLPSURYHPHQWVDUHSODQQHGLQ2UDFOH·V64/-VXSSRUWVXFKDVLQWHJUDWLRQZLWKWKH3HUVRQDO2UDFOH/LWH
GDWDEDVHFRPSOHWH1/6PHVVDJHVIRUJOREDOL]DWLRQDQGEHWWHUSHUIRUPDQFHDQGVFDODELOLW\WKURXJKIXUWKHULQWHJUDWLRQZLWK
2UDFOH·V-'%&GULYHUV
64/-/$1*8$*()($785(6
,QWKLVVHFWLRQZHLOOXVWUDWHWKHPDLQFRQFHSWVDQGFRQVWUXFWVLQWKH64/-ODQJXDJHZLWKWKHKHOSRIDQH[DPSOH7RSLFV
FRYHUHGLQFOXGHXVLQJKRVWH[SUHVVLRQVLQ64/VWDWHPHQWVSHUIRUPLQJXSGDWHVTXHU\LQJGDWDWKURXJK64/-LWHUDWRUVFDOOLQJ
3/64/VWRUHGSURFHGXUHVDQGIXQFWLRQVDQGXVLQJ-'%&IRUG\QDPLF64/RSHUDWLRQV
(;$03/(
:HFRQVLGHUDPLQLSURMHFWWUDFNLQJV\VWHPFRQVLVWLQJRIDWDEOHPROJECTSZLWKDQHVWHGWDEOHFROXPQOWNERSRIW\SH
OWNER_SET WKDWFRQWDLQVWKHQDPHVRIWKHRZQHUVRIDSURMHFW
CREATE TYPE OWNER_SET AS TABLE OF VARCHAR(20)
/
CREATE TABLE PROJECTS (
ID NUMBER(4),
NAME VARCHAR(30) PRIMARY KEY,
START_DATE DATE,
DURATION NUMBER(3),
OWNERS OWNER_SET ) NESTED TABLE OWNERS STORE AS OWNERS_TAB
/
/HWXVGHVLJQDQDSSOLFDWLRQWKDWFDQXSGDWHWKHGXUDWLRQRIDSURMHFWOLVWWKHRSHQSURMHFWVWKDWDUH\HWWREH
FRPSOHWHGVKRZWKHWLPHWRFRPSOHWHDOORSHQSURMHFWVFDOFXODWHZKLFKSURMHFWVDUHGXHWKLVPRQWKHWF:HZLOO
LPSOHPHQWHDFKRIWKHVHIXQFWLRQVXVLQJDGLIIHUHQWIHDWXUHRI64/-%HORZLVWKHVNHOHWRQRIWKH-DYDFODVVProjDemoIRU
WKLVDSSOLFDWLRQ)ROORZLQJ-DYD·VILOHQDPLQJUXOHVWKHILOHFRQWDLQLQJWKLVSXEOLFFODVVPXVWEHQDPHGProjDemo.sqlj
import sqlj.runtime.*;
import sqlj.runtime.ref.*;
import java.sql.*;
Paper 607
Exploiting Java, Objects, & Components
64/-67$7(0(176
$OO64/-VWDWHPHQWVVWDUWZLWKWKH#sqlSUHIL[DQGHQGZLWKDVHPLFRORQ64/-VWDWHPHQWVDUHFODVVLILHGLQWRWZR
FDWHJRULHVGHFODUDWLYHDQGH[HFXWDEOH'HFODUDWLYHVWDWHPHQWVLQWURGXFH-DYDW\SHVLQWKHSURJUDPZKHUHDVH[HFXWDEOHVWDWHPHQWV
VSHFLI\GDWDEDVHRSHUDWLRQV-DYDW\SHVIRU64/-LWHUDWRUVDQGFRQQHFWLRQFRQWH[WVDUHGHILQHGWKURXJKWKHGHFODUDWLYHVWDWHPHQWV
DQGVXFKW\SHGHFODUDWLRQVPD\DSSHDUZKHUHD-DYDFODVVGHILQLWLRQFDQOHJDOO\DSSHDU,QFRQWUDVWH[HFXWDEOH64/-
VWDWHPHQWVFRQWDLQDVWDWLF64/RSHUDWLRQZLWKLQFXUO\EUDFHVDQGFDQEHSODFHGZKHUHYHUD-DYDVWDWHPHQWPD\DSSHDU
([DPSOHVRIGHFODUDWLYHDQGH[HFXWDEOH64/-VWDWHPHQWVDUHJLYHQEHORZ
#sql iterator ProjIter (String name, int id, Date deadline); // declares Java type
+267(;35(66,216
,QH[HFXWDEOH64/-VWDWHPHQWVWKHLQSXWVDQGRXWSXWVWR64/RFFXUWKURXJK-DYDKRVWH[SUHVVLRQVWKDWDUHHPEHGGHGLQWRWKH
64/VWDWHPHQWVZLWKDFRORQSUHIL[,QLWVEDVLFIRUPDKRVWH[SUHVVLRQLVWKHVLPSOHQDPHRIDQ\YDOLG-DYDYDULDEOHILHOGRU
SDUDPHWHU,QRXUH[DPSOHWKHPHWKRGupdateDuration() FDQEHLPSOHPHQWHGZLWKKRVWYDULDEOHVprojNameDQG
numDaysDVIROORZV
public static void updateDuration(String projName, int numDays) throws SQLException {
#sql { UPDATE projects SET duration = duration + : numDays
WHERE name = :projName };
#sql { COMMIT };
}
64/-DOVRVXSSRUWVWKHXVHRITXDOLILHGQDPHVDQGFRPSOH[-DYDKRVWH[SUHVVLRQVZKLFKPXVWDSSHDULQSDUHQWKHVHVDIWHUWKH
FRORQSUHIL[DVVKRZQLQWKHH[DPSOHEHORZ
#sql { UPDATE PROJECTS SET duration = :(getNewDuration(id)) WHERE ID = :id };
+HUHgetNewDuration(id) LVD-DYDPHWKRGFDOOWKDWUHWXUQVDQXPHULFYDOXHGHQRWLQJWKHXSGDWHGGXUDWLRQRIWKH
SURMHFW$WUXQWLPHWKLVH[SUHVVLRQLVHYDOXDWHGLQ-DYDDQGWKHQSDVVHGWRWKH64/VWDWHPHQWDVDQLQSXWELQGSDUDPHWHU
$OOVWDQGDUG-'%&W\SHVVXFKDVERROHDQE\WHVKRUWLQW6WULQJE\WH>@,QWHJHU'RXEOHMDYDVTO'DWHHWFDUHYDOLGKRVW
H[SUHVVLRQW\SHVLQ64/-$GGLWLRQDOO\2UDFOH·V64/-WUDQVODWRUVXSSRUWVWKHXVHRI2UDFOHDQG2UDFOHW\SHVVXFKDV
52:,'&/2%%/2%DVZHOODV2EMHFWDQG5()W\SHV'HWDLOVRQXVHRIWKH2UDFOHW\SHVPD\EHIRXQGLQ>@DQG>@
,7(5$7256
,QD64/-SURJUDPDUHVXOWVHWUHWXUQHGE\D64/TXHU\FDQEHUHSUHVHQWHGDVDQLWHUDWRUREMHFWWKDWLVXVHGWRH[DPLQHWKH
GDWD$QLWHUDWRUREMHFWLVDQLQVWDQFHRIDQLWHUDWRUFODVVZKLFKPD\EHGHILQHGXVLQJWKH#sql iterator QDPH! ...
GHFODUDWLRQ$QLWHUDWRUW\SHGHFODUDWLRQLVH[SDQGHGE\WKH64/-WUDQVODWRUWRD-DYDFODVVGHFODUDWLRQRIWKHVDPHQDPH$
64/-LWHUDWRUFODVVFRUUHVSRQGVWRWKH-'%&UHVXOWVHWZLWKWKHDGGLWLRQDOLPSRUWDQWSURSHUW\WKDWLWLVVWURQJO\W\SHGLQ
WHUPVRIWKHVKDSHRIWKH64/TXHU\DVGHILQHGE\WKHQXPEHUDQG-DYDW\SHVRIVHOHFWHGDWWULEXWHVDQGRSWLRQDOO\WKHLUQDPHV
WRR7KLVVWURQJW\SLQJRI64/-LWHUDWRUVDOORZVWKHPWREHWUHDWHGDVW\SHVDIHILUVWFODVV-DYDREMHFWVZLWKNQRZQURZ
VKDSHVVRWKDWERWKWKH64/-WUDQVODWRUDQGWKH-DYDFRPSLOHUFDQVWDWLFDOO\FKHFNWKHYDOLGLW\RIFROXPQGDWDDFFHVVZKHUHYHU
WKHLWHUDWRULVXVHG64/-VXSSRUWVWZRGLIIHUHQWW\SHVRILWHUDWRUVQDPHGDQGSRVLWLRQDOERWKRIZKLFKDUHLOOXVWUDWHGEHORZ
1$0(',7(5$7256
$QDPHGLWHUDWRUGHFODUDWLRQVSHFLILHVERWKFROXPQDFFHVVRUQDPHVDQGWKHLU-DYDW\SHV7KHDFFHVVRUQDPHVPXVWPDWFKWKH
QDPHVRUDOLDVHVRIWKHVHOHFWHGFROXPQVLQD64/TXHU\ERXQGWRWKHLWHUDWRUDQGWKHDFFHVVRUW\SHVPXVWEHYDOLG-'%&
RU2UDFOHW\SHVFRPSDWLEOHZLWKWKHFRUUHVSRQGLQJ64/GDWDW\SHV)RURXUH[DPSOHWKHIROORZLQJGHFODUDWLYHVWDWHPHQW
LQWURGXFHVDQDPHGLWHUDWRUW\SHProjIterZLWKWKUHHFROXPQVnameidDQGdeadline
#sql iterator ProjIter (String name, int id, Date deadline);
7KLVW\SHGHFODUDWLRQFDQEHSODFHGZKHUHD-DYDFODVVGHILQLWLRQFDQDSSHDUIRUH[DPSOHDIWHUWKHLPSRUWVLQWKHILOH
ProjDemo.sqlj 'XULQJWUDQVODWLRQRIWKLV64/-SURJUDPWKHDERYHGHFODUDWLRQJHQHUDWHVD-DYDFODVVQDPHGProjIter
ZLWKWKUHHVSHFLDOFROXPQDFFHVVRUPHWKRGVname()id()DQGdeadline()WKDWUHWXUQStringintDQGMDYDVTODate
YDOXHVUHVSHFWLYHO\DQGDUHXVHGWRDFFHVVWKHIHWFKHGFROXPQYDOXHV2WKHUPHWKRGVRIWKHProjIterFODVVDUHVLPLODUWR
WKRVHIRXQGRQ-'%&UHVXOWVHWVVXFKDVnext()WRLWHUDWHRYHUIHWFKHGURZVDQGclose()WRUHOHDVHWKHUHVRXUFHVKHOGE\
WKHLWHUDWRU
Paper 607
Exploiting Java, Objects, & Components
$IWHUDQLWHUDWRUW\SHLVGHILQHGD64/-SURJUDPFDQGHFODUHLQVWDQFHVRIWKLVLWHUDWRUW\SHDQGSRSXODWHLWXVLQJD64/TXHU\
'XULQJH[HFXWLRQWKH64/-UXQWLPHPDWFKHVWKHQDPHVRIWKHFROXPQDFFHVVRUVLQWKHLWHUDWRUZLWKWKH64/FROXPQQDPHV
LQDFDVHLQVHQVLWLYHZD\1RWHWKDWFROXPQDOLDVHVPXVWEHXVHGIRUWKRVH64/FROXPQVZKRVHQDPHVDUHQRWYDOLG-DYD
LGHQWLILHUV:HQRZLOOXVWUDWHWKHVHFRQFHSWVLQWKHPHWKRGlistOpenProjects() IRURXUH[DPSOH
public static void listOpenProjects() throws SQLException {
ProjIter projs = null; // Declare the iterator instance
// Populate the iterator with a SQL query
#sql projs = { SELECT start_date + duration as deadline, name, id
FROM projects WHERE start_date + duration >= sysdate
&$//,1*3/64/6725('352&('85(6)81&7,216$1'$121<0286%/2&.6
64/-SURYLGHVFRQYHQLHQWVKRUWKDQGV\QWD[WRFDOOVWRUHGSURFHGXUHVDQGIXQFWLRQVVWRUHGLQWKHGDWDEDVHDVZHOODV
DQRQ\PRXVSURFHGXUDOEORFNV$VVXPHIRURXUH[DPSOHWKDWZHZLVKWRSULQWWKHFRPSOHWLRQGDWHRIDOORSHQSURMHFWV
:HFDQGHILQHDVWRUHGSURFHGXUHQDPHGMAX_DEADLINEXVLQJ3/64/LQWKH2UDFOHGDWDEDVHDVIROORZV
CREATE OR REPLACE PROCEDURE MAX_DEADLINE (deadline OUT DATE) IS
BEGIN SELECT MAX(start_date + duration) INTO deadline FROM projects;
END;
Paper 607
Exploiting Java, Objects, & Components
/
7KHQZHFDQFDOOWKLVVWRUHGSURFHGXUHIURP64/-DVLQWKHPHWKRGgetMaxDeadline() EHORZ
public static void getMaxDeadline() throws SQLException {
Date maxDeadline;
#sql { CALL MAX_DEADLINE(:OUT maxDeadline) }; // CALL syntax for stored procedures
System.out.println("Last project completes on " + maxDeadline);
}
287DQG,1287SDUDPHWHUPRGHVPXVWEHGHFODUHGH[SOLFLWO\IRUVWRUHGSURFHGXUHVIXQFWLRQVDQGDQRQ\PRXVEORFNV
7KHV\QWD[IRUDIXQFWLRQFDOOLVGLIIHUHQWIURPWKDWRIDSURFHGXUHFDOOLQWKDWLWXVHVWKHVALUESFRQVWUXFWLQVWHDGRICALL
)RUH[DPSOHLIZHGHILQHGD3/64/IXQFWLRQGET_MAX_DEADLINE UHWXUQLQJDDATELQVWHDGRIWKHVWRUHGSURFHGXUH
MAX_DEADLINEZLWKDQRXWSDUDPHWHUWKHFDOOWRWKLVIXQFWLRQZRXOGDSSHDULQ64/-DV
#sql maxDeadline = { VALUES(GET_MAX_DEADLINE()) }; // VALUES syntax for stored functions
$QRQ\PRXVEORFNVLQ64/-VWDWHPHQWVDUHSODFHGZLWKLQWKHFXUO\EUDFHVXVLQJBEGIN..ENDV\QWD[
&211(&7,1*727+('$7$%$6(
'DWDEDVHFRQQHFWLRQVFRPHLQWRWKHSLFWXUHDWDSSOLFDWLRQUXQWLPHDQGDWWUDQVODWLRQWLPHDVZHOO5XQWLPH64/RSHUDWLRQV
XVLQJWKHGHIDXOWFRQWH[WUHTXLUHWKH64/-DefaultContext WREHLQLWLDOL]HGZLWKDFRQQHFWLRQIURPWKH-'%&GULYHU
(VWDEOLVKLQJDUXQWLPHFRQQHFWLRQWRWKH2UDFOHGDWDEDVHFRQVLVWVRIWKHVWHSVVKRZQEHORZ
public static void dbConnect() throws Exception
{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());// register driver
String url = "jdbc:oracle:oci8:@"; // Using JDBC/OCI driver to connect
String user = "scott"; String pwd = "tiger"; // Logon user id and password
DefaultContext.setDefaultContext( // Initialize SQLJ default context
new DefaultContext(url, user, pwd, false)); // with autoCommit off
}
7KLVFRQQHFWLRQLVXVHGWRH[HFXWHDOO#sqlVWDWHPHQWVWKDWGRQRWKDYHDFRQWH[WWDJDVLQWKHProjDemoH[DPSOHVDERYH
7RHQDEOH64/FKHFNLQJDWWUDQVODWLRQWLPHGDWDEDVHFRQQHFWLRQLQIRUPDWLRQFDQDOVREHVSHFLILHGRQWKH64/-FRPPDQG
OLQHRUPRUHFRQYHQLHQWO\LQD64/-SURSHUWLHVILOH%HORZZHVKRZDQH[DPSOHRI64/-FRPPDQGOLQHLQYRFDWLRQWKDWXVHV
WKH-'%&2&,GULYHUDQGWKHVFRWWWLJHUVFKHPDGXULQJWUDQVODWLRQWRFKHFNVWDWLF64/RSHUDWLRQVRQWKHGHIDXOWFRQWH[W
sqlj -user=scott/tiger -url=jdbc:oracle:oci8:@ ProjDemo.sqlj
)RUIOH[LELOLW\64/-VXSSRUWVPDQ\RWKHURSWLRQVVXFKDVIRUVSHFLILFDWLRQRIWKH-'%&GULYHUFODVVXVHGDWWUDQVODWLRQWLPH
0RVWRSWLRQVKDYHFRPPRQGHIDXOWYDOXHVHJWKHGULYHULVSUHVHWWRoracle.jdbc.driver.OracleDriver
&211(&7,1*7208/7,3/('$7$%$6(6
,QWKHH[DPSOHVJLYHQDERYHZHKDYHXVHGDVLQJOHGHIDXOWFRQQHFWLRQFRQWH[WIRUDOORXU64/RSHUDWLRQV64/-VXSSRUWV
FRQQHFWLQJWRPXOWLSOHVFKHPDVLQWKHVDPHSURJUDP'LIIHUHQWVFKHPDVXVHGDWUXQWLPHDUHPRGHOHGDVGLVWLQFWFRQQHFWLRQ
FRQWH[WFODVVHVLQ64/-SURJUDPV)RUH[DPSOHDQRQGHIDXOWFRQQHFWLRQFRQWH[WFODVVProjDbLVGHILQHGDV
#sql context ProjDb;
7KLVGHFODUDWLRQLVH[SDQGHGE\WKH64/-WUDQVODWRUWRD-DYDFODVVQDPHGProjDbRIZKLFKDQLQVWDQFHFDQEHGHFODUHGDQG
LQLWLDOL]HGZLWKDGDWDEDVHFRQQHFWLRQDVIROORZV
ProjDb myProjDb; // Declare instance of ProjDb connection context class
myProjDb = new ProjDb(url, user, pwd, true); // Initialize with autoCommit on
6XEVHTXHQWO\WKLVFRQQHFWLRQFRQWH[WLQVWDQFHPD\EHXVHGLQDQHPEHGGHG64/RSHUDWLRQDVIROORZV
#sql [myProjDb] { UPDATE … }; // Execute SQL on myProjDb connection context
7KH64/-WUDQVODWRUDOVRVXSSRUWV64/FKHFNLQJRQPXOWLSOHFRQQHFWLRQFRQWH[WVDWWUDQVODWHWLPHWKURXJKFRPPDQGOLQH
RSWLRQVWKDWDUHRSWLRQDOO\WDJJHGZLWKWKHFRQQHFWLRQFRQWH[WFODVVQDPH$QH[DPSOHRIVXFKXVHLV
sqlj -user=scott/tiger -user@ProjDb=roger/lion -url=jdbc:oracle:oci8:@ ProjDemo.sqlj
6XFKDQLQYRFDWLRQPDNHVWKH64/-WUDQVODWRUXVHWZRGLIIHUHQWVFKHPDVIRUFKHFNLQJ64/RSHUDWLRQVVFRWWWLJHUIRUWKRVH
WKDWXVHWKHGHIDXOWFRQWH[WDQGURJHUOLRQIRUWKH64/H[HFXWHGRQLQVWDQFHVRIWKHProjDbFRQQHFWLRQFRQWH[WFODVV
Paper 607
Exploiting Java, Objects, & Components
86,1*'<1$0,&64/7+528*+-'%&
,QVRPHFDVHVIRUH[DPSOHZKHQDWHEREFODXVHFRQGLWLRQRUWKHVHWRIVHOHFWHGDWWULEXWHVLVXQNQRZQWKH64/VWDWHPHQWLV
QRWNQRZQLQDGYDQFHDQGWKHUHIRUHG\QDPLF64/PXVWEHXVHG7KHG\QDPLF64/$3,IRU64/-LV-'%&DQGD64/-
SURJUDPPD\FRQWDLQERWK64/-FRGHDQG-'%&FDOOV$FFHVVWR-'%&FRQQHFWLRQVDQGUHVXOWVHWVIURPD64/-SURJUDP
PLJKWDOVREHQHFHVVDU\IRUILQHUJUDQXODULW\RIFRQWURO7KHWZRSDUDGLJPVLQWHURSHUDWHVHDPOHVVO\ZLWKHDFKRWKHUWKURXJK
FRQYHUVLRQVEHWZHHQ-'%&FRQQHFWLRQVDQG64/-FRQQHFWLRQFRQWH[WVDQGEHWZHHQ-'%&UHVXOWVHWVDQG64/-LWHUDWRUV
)RUH[DPSOHD64/-FRQQHFWLRQFRQWH[WFDQEHLQLWLDOL]HGZLWKDQH[LVWLQJ-'%&FRQQHFWLRQ
java.sql.Connection conn = …; // Create JDBC connection
ProjDb pdb = new ProjDB(conn); // Use to initialize SQLJ connection context
&RQYHUVHO\LWLVDOVRSRVVLEOHWRH[WUDFWD-'%&FRQQHFWLRQREMHFWIURPD64/-FRQQHFWLRQFRQWH[WLQVWDQFH7KLVIHDWXUHLV
LOOXVWUDWHGEHORZZKHUHZHGHILQHWKHPHWKRGprojectsDue()XVLQJG\QDPLF64/YLD-'%&VWDWHPHQWVDQGFRQQHFWLRQV
public static void projectsDue(boolean dueThisMonth) throws SQLException {
// get JDBC connection from previously initialized SQLJ DefaultContext
Connection conn = DefaultContext.getDefaultContext().getConnection();
'(),1,1*64/-6725('352&('85(6217+(6(59(5
)LQDOO\ZHGHPRQVWUDWHWKHXVHRI64/-VWRUHGSURFHGXUHVDQGIXQFWLRQVRQWKH2UDFOHLGDWDVHUYHUZKLFKSURYLGHVDQ
LQWHJUDWHG-DYD90>@DQGVXSSRUWV64/-64/-FRGHGHILQHGDWWKHVHUYHULVDXWRPDWLFDOO\WUDQVODWHGLQWR-DYDE\WHFRGH
DQGWKHQVWRUHGLQWKHGDWDEDVH)RUH[DPSOHXVLQJ64/
3OXVZHFDQGHILQHDVWDWLFIXQFWLRQgetDeadline()LQD-DYD
FODVVQDPHGProjUtilDVIROORZV
CREATE OR REPLACE JAVA SOURCE NAMED "ProjUtil" AS
import java.sql.*;
public class ProjUtil {
public static Date getDeadline (String projName) {
// Note: connection is automatic for server-side execution of SQLJ programs
try {
Date completionDate;
#sql { SELECT start_date + duration INTO :completionDate FROM projects
WHERE name = :projName }; // single-row query by key project name
return completionDate;
} catch (SQLException e) { return null; } } }
/
Paper 607
Exploiting Java, Objects, & Components
2QFHWKLV64/-IXQFWLRQKDVEHHQFUHDWHGVXFFHVVIXOO\LWFDQEHLQYRNHGIURP64/VWDWHPHQWV%XWILUVWDZUDSSHUKDVWREH
GHILQHGIRUPDSSLQJWKH-DYDLQYRFDWLRQVLJQDWXUHWR64/7KLVZUDSSHUGHILQLWLRQLVEDVHGRQ3/64/V\QWD[HJ
CREATE OR REPLACE FUNCTION getDeadline(projName VARCHAR2) RETURN DATE
AS LANGUAGE JAVA NAME ’ProjUtil.getDeadline(java.lang.String) return java.sql.Date’;
7KHQWKHVWRUHGIXQFWLRQRUSURFHGXUHFDQEHLQYRNHGIURPERWKFOLHQWVLGHDQGVHUYHUVLGH64/-FRGHMXVWOLNHDQ\RWKHU
VWRUHG3/64/IXQFWLRQRUSURFHGXUH7KXVZHFDQGHILQHWKHPHWKRGprojDeadline() XVLQJWKHDERYH64/ZUDSSHU
public static Date projDeadline(String projName) throws SQLException {
Date deadline = null;
#sql deadline = { VALUES(getDeadline(:IN projName)) };
return deadline;
}
&21&/86,216
7KLVSDSHUKDVSUHVHQWHGDFRPSUHKHQVLYHRYHUYLHZRIWKHJRDOVEHQHILWVDQGFDSDELOLWLHVRI64/-8VLQJDGHWDLOHGH[DPSOH
ZHKDYHH[SODLQHGWKHYDULRXVODQJXDJHIHDWXUHVDQGGHPRQVWUDWHGWKHLUXVDJH)URPWKHH[DPSOHVLQWKLVSDSHUZHVHHWKDW
64/-VWDWHPHQWVDUHXVXDOO\PXFKVKRUWHUWKDQWKHHTXLYDOHQWG\QDPLF64/FDOOVLQ-'%&EHFDXVH64/-XVHVHPEHGGHG-DYD
KRVWYDULDEOHVWRSDVVDUJXPHQWVWR64/,QFRQWUDVWWKH-'%&XVHUPXVWZULWHVHSDUDWHFDOOVWRELQGHDFKDUJXPHQWDQGWR
UHWULHYHHDFKUHVXOW$QRWKHULPSRUWDQWDGYDQWDJHRI64/-LVWKDWLWVXSSRUWVWUDQVODWHWLPHFKHFNLQJRIDOOVWDWLF64/
VWDWHPHQWVDJDLQVWDGDWDEDVHVFKHPDDQGYHULILFDWLRQRIWKHW\SHFRPSDWLELOLW\RIKRVWYDULDEOHVZLWK64/GDWDW\SHV
$GGLWLRQDOO\VWURQJO\W\SHG64/-LWHUDWRUVHQDEOH-DYDW\SHFKHFNLQJDQG64/VFKHPDFKHFNLQJZKHUHGDWDLVIHWFKHGIURP
DQLWHUDWRUHLWKHUXVLQJQDPHGFROXPQDFFHVVRUVRUWKURXJKDFETCH..INTOVWDWHPHQWEHFDXVHWKHLWHUDWRU·VFODVVGHILQHV
WKHQXPEHUDQGW\SHVRIWKHIHWFKHGFROXPQV7KLVW\SHFKHFNLQJJUHDWO\HQKDQFHVSURJUDPUREXVWQHVVE\FDWFKLQJHUURUVDW
GHYHORSPHQWWLPHUDWKHUWKDQDWDSSOLFDWLRQUXQWLPHDQGVXFKEHQHILWVFDQQRWEHREWDLQHGLQDG\QDPLF$3,OLNH-'%&
+RZHYHU64/-DQG-'%&DUHFRPSOHPHQWDU\WRHDFKRWKHUWKHIRUPHUKDQGOHVG\QDPLF64/ZKLOHWKHODWWHUDGGUHVVHV
VWDWLF64/7KHXVHUFDQHDVLO\FRPELQHERWK64/-DQG-'%&FRGHLQWKHVDPHDSSOLFDWLRQSURJUDPDQGKDYHWKHP
LQWHURSHUDWHDWWKHOHYHORIFRQQHFWLRQVFRQWH[WVDQGUHVXOWVHWVLWHUDWRUV
%HVLGHVWKHLQKHUHQWSRZHURI-DYD·VSRUWDEOHGHYHORSPHQWDQGIOH[LEOHGHSOR\PHQWPRGHOWKH64/-DSSOLFDWLRQGHYHORSPHQW
IUDPHZRUNSURYLGHVPDQ\RWKHULPSRUWDQWDGYDQWDJHV7KH64/-ODQJXDJHDQGUXQWLPHDUHEHLQJVWDQGDUGL]HGE\$16,VR
WKDW64/-SURJUDPVZULWWHQIRURQHYHQGRU·VGDWDEDVHFDQEHHDVLO\DGDSWHGWRDQRWKHU·V%\GHVLJQ64/-VXSSRUWVFRGH
SRUWDELOLW\QRWRQO\DWWKHVRXUFHOHYHOWKURXJKVWDQGDUGV\QWD[EXWDOVRDWWKHOHYHORIELQDULHVVLQFHLWDGGVYHQGRUVSHFLILF
FXVWRPL]DWLRQVWRWKHELQDU\SURILOHILOHV$GGLWLRQDOO\D5HIHUHQFH,PSOHPHQWDWLRQRI64/-KDVEHHQGHYHORSHGDW2UDFOH
XVLQJ-DYDDQGLWVVRXUFHFRGHLVDYDLODEOHIUHHO\WRWKHSXEOLFDQGWRRWKHUGDWDEDVHYHQGRUV64/-LVEOD]LQJDQHZSDWKLQ
LWVGRPDLQLQWHUPVRILWVRSHQQHVVUREXVWQHVVIOH[LELOLW\H[WHQVLELOLW\VWDQGDUGL]DWLRQDQGLQWHJUDWLRQZLWKWRROV$VWKH
LQGXVWU\OHDGHU2UDFOHKDVIXUWKHUUHLQIRUFHGWKHSRZHURI64/-WKURXJKWLJKWO\LQWHJUDWHGVXSSRUWIRULWRQWKH2UDFOHLGDWD
VHUYHUDOORZLQJ64/-SURFHGXUHVDQGIXQFWLRQVWREHVWRUHGLQWKHGDWDEDVHDQGLQYRNHGIURP64/3/64/DQG-DYD
2UDFOHVSHFLILFGDWDW\SHVDQG64/H[WHQVLRQVDUHIXOO\DFFHVVLEOHLQ64/-WKURXJKELQDU\SURILOHFXVWRPL]DWLRQZLWKRXW
FRPSURPLVLQJVWDQGDUGVFRPSOLDQFH2UDFOHW\SHVVXFKDV/2%VREMHFWVDQGFROOHFWLRQVDUHDOVRHDVLO\PDQLSXODWHGLQ
64/->@2UDFOH·V-'HYHORSHUWRROSURYLGHVDQLQWHJUDWHGGHYHORSPHQWHQYLURQPHQWZLWKEXLOWLQVXSSRUWIRUHGLWLQJ
WUDQVODWLRQDQGGHEXJJLQJRI64/-FRGH)XUWKHULPSURYHPHQWVLQLQWHJUDWLRQWRROVDQGSHUIRUPDQFHDUHRQWKHZD\
$&.12:/('*0(176
7KLVSDSHULVEDVHGRQWKHZRUNRIWKH64/--'%&DQG-DYD90WHDPVDW2UDFOH,ZRXOGOLNHWRWKDQN%ULDQ%HFNHU5DJDPD\L
%K\UDYDEKRWOD&KHXN&KDX5DNHVK'KRRSDU3LHUUH'XIRXU7KRPDV.XULDQ(NNHKDUG5RKZHGGHUDQG%ULDQ:ULJKWIRUWKHLU
FRQWULEXWLRQVDQGKHOSIXOFRPPHQWV
5()(5(1&(6
>@ 2UDFOHDQG-DYD7HFKQLFDO:KLWH3DSHU2UDFOH&RUSRUDWLRQ
>@ ,QGXVWULDO6WUHQJWK-DYD2YHUYLHZRI2UDFOH·V6HUYHU6LGH-DYD'DYH5RVHQEHUJ2UDFOH2SHQ:RUOG1RY
>@ 8VLQJ2UDFOH2EMHFWVLQ64/-3URJUDPV(NNHKDUG5RKZHGGHU2UDFOH2SHQ:RUOG1RY
>@ 2UDFOHL64/-DQG-'%&8VHU'RFXPHQWDWLRQ2UDFOH&RUSRUDWLRQ
Paper 607