Untitled Document


\def\sekce#1{\bigskip\begin{center}{\large\bf #1}\end{center}\medskip} \newdimen\pam \newdimen\pom \long\def\super#1#2{\setbox21=\hbox{#1} \pom=\wd21 \pam=\the\linewidth \advance\pam by -\pom \noindent\parbox[t]{\pom}{\box21}\parbox[t]{\pam}{#2}} \documentstyle[czech,a4]{article} \begin{document} \begin{center} \Huge\bf Jazyk PL/SQL \end{center} {\bf \hfill Michal žada, 1. dubna 1998 } \bigskip Refer t o~tomto fam¢zn¡m jazyku bych za‡al asi jeho v˜hodami. Jsou to p©ednˆ: \begin{itemize} \item{\bf podpora pro SQL} -- povoluje dˆlat p©¡kazy k~r–zn˜m transakc¡m stejnˆ jako funkce a oper tory SQL. Lze tedy pru‘nˆ a bezpe‡nˆ manipulovat s~daty ORACLu. \item{\bf vy¨¨¡ produktivita} -- p©id v  spoustu n stroj– jako jsou SQL* Forms, SQL* Menu a SQL* ReportWriter. Lze tedy jednodu¨¨e budovat v¨elijak‚ aplikace. \item{\bf lep¨¡ v˜kon} \item{\bf P©enositelnost} -- aplikace napsan‚ v~PL/SQL jsou p©enositeln‚ na nˆkter‚ OS a platformy, na nich‘ ORACLE bˆ˜¡. \item{\bf integrace s~ORACLEm} -- u‘¡v me konstrukce SQL k~manipulov n¡ s~ORACLov˜mi daty. \end{itemize} \sekce{1. Nˆco o~PL/SQL} PL/SQL je {\bf blokovˆ strukturovan˜} jazyk. Z kladn¡ jednotky (procedury, funkce a anonymn¡ bloky) tvo©¡ PL/SQL program. Jsou to logick‚ bloky, kter‚ se mohou skl dat z~podblok–. (Ostatnˆ jak jsme na to zvykl¡ z~procedur ln¡ho programov n¡). Z kladn¡ blok v~PL/SQL je slo‘en ze t©¡ ‡ st¡: deklarativn¡, spustiteln‚ a \uv{v˜jimkov‚}. Toto po©ad¡ je p©irozen‚ a logick‚. V~deklarativn¡ ‡ sti je objekt deklarov n. S~t¡mto objektem m–‘e b˜t manipulov no ve spustiteln‚ ‡ sti. V˜jimky vznikl‚ p©i spu¨tˆn¡ mohou b˜t obslou‘eny podle toho, jak je to pops no posledn¡ ‡ sti. Podbloky lze vhnizƒovat pouze ve 2. a 3. ‡ sti.[] \bigskip {\bf Sch‚ma programu v~PL/SQL:} \medskip {\leftskip=20pt\parindent=0pt [DECLARE \ldots deklarace]\\ BEGIN \ldots program\\ \relax [EXCEPTION \ldots v˜jimky]\\ END; } \sekce{2. Konstanty a promˆnn‚} PL/SQL povoluje deklarovat promˆnn‚ a konstanty, kter‚ lze u‘¡vat v~SQL-dotazech, i procedur ch a v˜razech. Promˆnn  m–‘e b˜t nˆjak‚ho SQL datatypu jako CHAR, DATE a NUMBER, nebo nˆjak˜ch PL/SQL datatyp– jako BOOLEAN nebo BINARY-INTEGER. Z kladn¡ typy jsou tedy jednak pro ‡¡sla (DEC, DECIMAL, DOUBLE PRECISION, FLOAT, INT, INTEGER, NATURAL, NUMERIC, POSITIVE, REAL, SMALLINT), znaky (CHAR, CHARACTER, LONG, LONG RAW, ROWID, STRING, VARCHAR, VARCHAR2), datum (DATE) a BOOLEAN. PL/SQL m  i strukturovan‚ typy (RECORD, TABLE). Nyn¡ k~jednotliv˜m typ–m tro¨ku podrobnˆji. \begin{description} \item[BINARY\_INTEGER] -- $-2^{31}-1 .. 2^{31}-1$ \item[NATURAL] -- $0 .. 2.147.483.647$ k~zak z n¡ z p. hodnot \item[POSITIVE] -- $1 .. 2.147.483.647$ \item[NUMBER] -- to u‘ zn me. (celkov  velikost, po‡. za des. ‡ rkou). \end{description} apod. \bigskip \super{\bf Syntax deklarace promˆnn˜ch: } {\tt citac NUMBER(4); \\ podm BOOLEAN;} \super{Lze deklarovat i s~inicializa‡n¡ hodnotou: } {\tt citac SMALLINT := 0;\\ jmeno VARCHAR2(5) NOT NULL := 'Johny'; } Tot‚‘ lze ekvivalentnˆ deklarovat u‘it¡m sl–vka DEFAULT.\\ {\tt citac SMALLINT DEFAULT 0;} Syntax p©i©azen¡ je shodn˜ s~pascalem, tedy pomoc¡ znam‚nka ':='. Jin  mo‘nost p©i©azen¡ je pomoc¡ SELECTu.\\ Nap©.: {\tt SELECT plat * 0.10 INTO bonus FROM zam WHERE c\_zam = zam\_id} \super{Konstanta se deklaruje takto: }{\tt pi CONSTANT REAL := 3.14159}\\ V¨echny konstanty mus¡ b˜t inicializov ny na nˆjakou hodnotu. \sekce{3. Atributy} Promˆnn‚ a konstanty mohou m¡t sv‚ atributy, kter‚ mi povoluj¡ odkazovat se na typ nˆjak‚ polo‘ky v~datab zi.\\ Nap©. mˆjme tabulku {\tt knihy} a v~n¡ polo‘ku {\tt titul}. Deklaruji promˆnnou {\tt muj\_titul}, kter  bude t‚ho‘ typu.\\ \ \ \ \ {\tt muj\_titul knihy.titul\%TYPE} \medskip Toto m  dvˆ z va‘n‚ v˜hody. \begin{itemize} \item nemus¡me zn t p©esn˜ typ, kter˜ m  titul knihy \item Zmˆn¡me-li v~datab zi definici titulu, zmˆn¡ se i typ {\tt muj\_titul} za bˆhu. \end{itemize} \medskip PL/SQL m  i z znamy analogick‚ pascalsk˜m record–m. Pomoc¡ atributu {\tt \%ROWTYPE} m–‘eme deklarovat promˆnnou, kter‚ m–‘e b˜t p©i©azena © dka tabulky.\\ Nap©.: {\tt DECLARE ma\_kniha knihy\%ROWTYPE}\\ U‘it¡: {\tt cislo\_me\_knihy := ma\_kniha.c\_knihy;} Pozdˆji si ©ekneme je¨tˆ nˆco o~kursorech. \sekce{4. Podm¡nky} Jazyk PL/SQL nab¡z¡ standardn¡ podm¡nku IF-THEN(-ELSE). Syntax je n sleduj¡c¡:\\ {\tt IF podm¡nka THEN\\ \ \ \ posloupnost\_p©¡kaz–1;\\ ELSE\\ \ \ \ posloupnost\_p©¡kaz–2;\\ END IF;} ELSE vˆtev se prov d¡ pouze v~p©¡padech, kdy v˜sledek podm¡nky je ohodnocen FALSE ‡i NULL.\\ \vfill\eject Nap©. {\tt IF typ\_transakce = 'CR' THEN\\ \ \ \ UPDATE ucty SET balance = balance + credit WHERE \ldots\\ ELSE \ \ \ UPDATE ucty SET balance = balance - debit WHERE \ldots}\\ END IF; Podm¡nky mohou b˜t i vhn¡zdˆn‚. V~takov˜ch p©¡padech b˜v  ‡asto z hodno vyu‘¡t konstrukce (IF-THEN-ELSIF-ELSE-END IF), kter˜ se chov  p©esnˆ tak, jak bychom od n¡ o‡ek vali. \sekce{5. CYKLY, SKOKY} Jazyk PL/SQL nab¡z¡ v~tomto ohledu tyto mo‘nosti. \begin{itemize} \item {\bf LOOP} -- Jedn  se o~nekone‡n˜ cyklus.\\ \super{Syntax:} {\tt LOOP\\ \ \ \ p©¡kazy;\\ END LOOP;} \item {\bf EXIT} -- T¡mto p©¡kazem lze vysko‡it z~LOOP cyklu.\\ \super{P©¡klad pou‘it¡: } {\tt LOOP\\ \ i:=i-1;\\ \ IF (i>10) THEN EXIT;\\ \ ENDIF; END LOOP; }\\ Lze tak‚ pou‘¡t konstrukci {\tt EXIT WHEN i>10} \item {\bf FOR} cyklus \super{Nap©.: } {\tt FOR promˆnn  IN 1..131 LOOP p©¡kazy ENDLOOP;} \item {\bf WHILE} cyklus \super{P©.: } {\tt WHILE plat<4000 LOOP hledej\_praci\ldots ENDLOOP;} \item {\bf GOTO} neboli nepodm¡nˆn˜ skok Syntax je klasick : {\tt GOTO n vˆ¨t¡;}\\ N vˆ¨t¡ se ozna‡uje takto: {\tt <<label>>}\\ Pamatujme si, ‘e nelze sk kat: \begin{itemize} \item z~handleru v˜jimky do bloku \item do obsluhy v˜jimky \item sko‡it mezi sekvenci p©¡kaz–, nap©. z~vnˆj¨ku doprost©ed cyklu, ‡i hned p©ed ELSE... \end{itemize} \end{itemize} \sekce{9. KURZORY} Dotaz SELECT m–‘e vr tit 0,1 i v¡ce © dk– tabulky, pomoc¡ promˆnn˜ch typu kurzor lze s~nimi postupnˆ pracovat. Mus¡me se dr‘et n sleduj¡c¡ho postupu:\\ \begin{itemize} \item deklarace promˆnn‚ typu {\tt CURSOR} \item otev©en¡ kurzoru pomoc¡ {\tt OPEN} \item na‡¡tat data z~kurzoru do promˆnn˜ch pomoc¡ {\tt FETCH .. INTO} \item uzav©en¡ kurzoru pomoc¡ {\tt CLOSE} \end{itemize} \super{P©¡klad: } {\tt DECLARE\\ cis1 tab.cislo1\%TYPE\\ cis2 tab.cislo2\%TYPE\\ prumer t.c\%TYPE\\ CURSOR c1 IS SELECT cislo1,cislo2 FROM tab;\\ BEGIN\\ OPEN c1;\\ LOOP\\ FETCH c1 INTO cis1,cis2;\\ EXIT WHEN c1%NOTFOUND;\\ prumer:=(cis1+cis2)/2;\\ INSERT INTO t VALUES(prumer); END LOOP; CLOSE c1; COMMIT; END;} {\bf Atributy kurzor–: }{\tt Promˆnn \_typu\_kurzor\%jm‚no\_atributu} \medskip \begin{itemize} \item {\tt \%NOTFOUND} -- pravdiv‚, pokud posledn¡ FETCH selhal pro nenalezen˜ © dek \item {\tt \%FOUND} -- pravdiv‚, jestli‘e FETCH uspˆl \item {\tt \%ISOPEN} -- je otev©en? \item {\tt \%ROWCOUNT} -- Po‡et nafatchovan˜ch © dk– (Existuje i standardn¡ kursor SQL, kter˜ se otv¡r  p©i prov dˆn¡ p©¡kaz– SELECT, INSERT, \ldots P©edchoz¡ p©¡pad lze p©epsat takto: {\tt DECLARE\\ radek tab\%ROWTYPE;\\ \ldots\\ BEGIN\\ FOR radek IN c1 LOOP\\ prumer:=(radek.cislo1+radek.cislo2)/2;\\ INSERT\ldots\\ END LOOP; END;} FOR cyklus mi automaticky kurzor otev©e, nafetchuje hodnoty a zav©e. \end{itemize} \sekce{10. V˜jimky a jejich obsluha} V˜jimky mohou b˜t dvoj¡ho druhu. Buƒ se jedn  a v˜jimky, kter‚ vyvol  s m syst‚m, nebo mohou b˜t u‘ivatelsk˜ definovan‚. Za norm ln¡ch okolnost¡, dojde-li k~v˜jimce, program skon‡¡ s~chybou. Pomoc¡ handler– m–‘eme u‘ivatelsky definovan‚ v˜jimky o¨et©it. \super{Vyvolat v˜jimku je velmi jednoduch‚: } {\tt DECLARE vyj EXCEPTION;\\ldots\\ BEGIN\\ IF a='AHOJ' THEN RAISE vyj;\\ldots\\ EXCEPTION\\ WHEN vyj THEN \ldots\\ END; } Tedy v˜jimku vyvol m p©¡kazem RAISE. Pokud se p©¡slu¨n  v˜jimka najde v~sekci EXCEPTION, obslou‘¡ se tak, jak je tam popsan  a ©¡zen¡ se vr t¡ do hlavn¡ho programu. P©¡kaz {\tt WHEN} m  syntax {\tt WHEN v˜jimka [OR jin \_v˜j \ldots] THEN \ldots} ‡i {\tt WHEN OTHERS THEN}, co‘ zachyt¡ v¨echny chyby. Nˆkter‚ syst‚mov‚ v˜jimky maj¡ p©eddefinovan‚ identifik tory: NO\_DATA\_FOUND, ZERO\_DIVIDE, STORAGE\_ERROR. Ostatn¡ chyby lze obslou‘it pomoc¡ PRAGMA EXCEPTION\_INIT \super{Nap©.: }{\tt DECLARE cizi\_element EXCEPTION;\\ PRAGMA EXCEPTION\_INIT(cizi\_element,-1031);} Z~obsluhy v˜jimky lze volat jinou i stejnou v˜jimku. Bude obslou‘ena v~nad©azen‚m bloku. Mnoho zdaru v~programov n¡ v~tomto interesantn¡m jazyce p©eje autor refer tu: Michal žada. \end{document} 


This document was generated on 1 April 1998 using the texi2html translator version 1.51.