tag:blogger.com,1999:blog-3419058157900092372024-03-18T01:13:40.217-07:00O Oracle ludzkim głosemZbiór bezpłatnych tutoriali związanych z bazami danych Oracle. Tutoriale po polsku. Autor : Andrzej Klusiewiczandrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.comBlogger204125tag:blogger.com,1999:blog-341905815790009237.post-53782447256969255712021-02-12T08:44:00.003-08:002021-02-12T08:44:39.379-08:00Bezpłatny kurs T-SQL w języku polskim<p> Cześć,</p><p>dziś zapraszam Was do kolejnego kursu który udostępniamy. <a href="http://blog.jsystems.pl/show_post/Bezp%C5%82atny_kurs_T-SQL_w_SQL_Server/">Tutaj</a> znajdziesz bezpłatny kurs T-SQL w języku polskim.</p><p>Pozdrawiam,</p><p>Andrzej</p>andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-46471882001301657072020-07-13T07:23:00.001-07:002020-07-13T07:23:23.951-07:00Sprawdź mój kurs na Udemy!Cześć,<br />
zachęcam do zapoznania się ze stworzonym przeze mnie wideo kursie Oracle PL/SQL na Udemy.<br />
Link: <a href="https://www.udemy.com/course/programowanie-w-jezyku-oracle-plsql-andrzej-klusiewicz/learn/lecture/20963664#overview">https://www.udemy.com/course/programowanie-w-jezyku-oracle-plsql-andrzej-klusiewicz/learn/lecture/20963664#overview</a><br />
Pozdrawiam,<br />
Andrzej Klusiewiczandrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com3tag:blogger.com,1999:blog-341905815790009237.post-56607655084476510512019-08-30T05:42:00.002-07:002019-08-30T05:42:17.197-07:00Szkolenie Big Data w JSystemsBardzo popularne ostatnio hasło "Big Data" coraz bardziej zyskuje na znaczeniu. Co to jednak jest Big Data? Jak stworzyć systemy przetwarzające tak ogromne ilości danych? Jak je zoptymalizować? Tego wszystkiego dowiesz się nie tylko w teorii, ale też przećwiczysz w praktyce na <a href="http://jsystems.pl/szkolenia-big-data.pokaz" target="_blank">szkoleniu big data</a>:<br />
<a href="http://jsystems.pl/szkolenia-big-data;kompleksowe_wprowadzenie_do_big_data__szkolenie_w_formie_warsztatowej.szczegoly" target="_blank"><br /></a>
<a href="http://jsystems.pl/szkolenia-big-data;kompleksowe_wprowadzenie_do_big_data__szkolenie_w_formie_warsztatowej.szczegoly" target="_blank">Szkolenie Big Data: Kompleksowe wprowadzenie do Big Data - szkolenie w formie warsztatowej</a>andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-6050284072473308822019-08-30T05:38:00.000-07:002019-08-30T05:38:12.224-07:00Szkolenie Docker i Kubernetes w JSystemsJeśli chcesz wejść w świat konteneryzacji, lub po prostu szukasz porządnego <a href="http://jsystems.pl/szkolenia-devops.pokaz" target="_blank">szkolenia docker</a>, to zapraszam Cię na poniższe:<br />
<br />
<a href="http://jsystems.pl/szkolenia-devops;docker_%E2%80%93_konteneryzacja_i_zarzadzanie_aplikacjami_oraz_microservisami.szczegoly" target="_blank">Szkolenie Docker: Docker - konteneryzacja i zarządzanie aplikacjami i micro-servisami.</a><br />
oraz<br />
<a href="http://jsystems.pl/szkolenia-devops;od_zera_do_orkiestracji_kontenera.szczegoly" target="_blank">Szkolenie Docker: Docker i Kubernetes: od zera do orkiestracji kontenera</a>andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-40383372765496559272019-08-30T05:32:00.001-07:002019-08-30T05:34:25.498-07:00Szkolenie C# w JSystemsHej,<br />
podrzucam propozycję dobrych <a href="http://jsystems.pl/szkolenia-dotnet.pokaz" target="_blank">szkoleń C#</a>. Jeśli chcesz dobrze poznać ten język na warsztatowych <a href="http://jsystems.pl/szkolenia-dotnet.pokaz" target="_blank">szkoleniach C#</a> prowadzonych przez praktyków, zapoznaj się z programami szkoleń:<br />
<br />
<a href="http://jsystems.pl/szkolenia-dotnet;programowanie_w_jezyku_c.szczegoly" target="_blank">Szkolenie C#: Programowanie w języku C#</a> - 5cio dniowe szkolenie od podstaw<br />
<a href="http://jsystems.pl/szkolenia-dotnet;zaawansowane_programowanie_w_c.szczegoly" target="_blank">Szkolenie C#: Zaawansowane programowanie w języku C#</a>- 3 dniowa kontynuacja powyższego.<br />
<br />
Oba szkolenia mają terminy gwarantowane. Śpieszmy się zatem rezerwować miejsca, tak szybko się kończą ;)andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com1tag:blogger.com,1999:blog-341905815790009237.post-13922520885320242222019-08-30T05:26:00.000-07:002019-08-30T05:26:38.962-07:00Szkolenie PostgreSQL w JSystemsWitajcie,<br />
jak pewnie wiecie od jakiegoś czasu poruszam się i publikuję w tematyce baz PostgreSQL. Zaprojektowałem z tego zakresu kilka szkoleń, ale na trzy z nich mamy ustawione terminy gwarantowane. Oznacza to że terminy te nie zostaną odwołane, a szkolenia na pewno się odbędą. Do rzeczy:<br />
<br />
<a href="http://jsystems.pl/szkolenia-postgresql;administracja_bazami_danych_postgresql_z_elementami_ha__optymalizacji_i_replikacji.szczegoly" target="_blank">Szkolenie PostgreSQL: Administracja bazami danych PostgreSQL z elementami HA, optymalizacji i replikacji</a><br />
<br />
Bardzo kompleksowe szkolenie. Od wdrożenia (system CENTOS), przez zabezpieczenie, konfigurację parametrów zapewniającą wyższą stabilność i wydajność, backupy i odtwarzanie baz w przypadku różnorakich awarii (wiele tego typu symulacji w ramach ćwiczeń), a kończąc na tuningu i ustawieniu replikacji. Szkolenie zdecydowanie obszerniejsze niż alternatywy dostępne na rynku. Trwa 4 dni, zakres tematyczny w porównaniu z innymi tego typu szkoleniami możesz porównać sam/a ;) Szkolenie to jest zbiorem moich doświadczeń z kilku lat pracy z bazami PostgreSQL. Wybrałem zagadnienia które uważam za naprawdę użyteczne w codziennej pracy administratora PostgreSQL.<br />
Serdecznie zapraszam - oszczędzisz ogrom czasu który musiałbyś poświęcić na samodzielne przyswojenie tej wiedzy.<br />
<br />
<a href="http://jsystems.pl/szkolenia-postgresql;tuning_baz_danych_i_sql_w_postgresql.szczegoly" target="_blank">Szkolenie PostgreSQL: Tuning baz danych i SQL w PostgreSQL</a><br />
<br />
To co tygryski lubią najbardziej. 3 dni mocnych warsztatów z zakresu tuningu baz PostgreSQL. Szkolenie bardzo "soczyste" na tle innych dostępnych na polskim rynku. Na tym szkoleniu zdecydowanie stawiam na zrozumienie sposobu działania PostgreSQL. W końcu jeśli chcesz coś poprawić (wydajność na przykład), to przede wszystkim musisz doskonale rozumieć jak to działa. Ponadto szkolenie ma format warsztatów ( szkoleń wykładowych nigdy nie prowadzę ), pozwalających potestować różne możliwości i przekonać się na własne oczy które techniki na ile się sprawdzają. Ponieważ zanim zabrałem się za PostgreSQL, wiele lat spędziłem z bazami Oracle szczególnie gorąco zapraszam dotychczasowych użytkowników takich baz. Będę mógł Wam pokazać pewne rzeczy przez analogię. Omawiam tuning zarówno baz typowo transakcyjnych, jak i hurtowni danych - z podziałem technik na dostosowane do tych dwóch różnych rodzajów baz. Coś co może pomóc w hurtowniach, może bardzo zaszkodzić w bazach transakcyjnych i odwrotnie. Warto więc wiedzieć co stosować, kiedy i dlaczego, a tego się właśnie dowiesz na tym szkoleniu. Zawsze staram się też rozwiązywać bolączki uczestników szkolenia - też pracowałem w korpo i wiem co to znaczy prosić się przez miesiąc (albo lepiej) i przebijać przez milion-pięćset-dwa-dziewięćset poziomów akceptacji, tłumaczyć się bezpiecznikom etc żeby np. zmienić jakiś jeden głupi parametr. Wiem też jak to obejść, lub jakie alternatywne rozwiązania można zastosować.<br />
<br />
<a href="http://jsystems.pl/szkolenia-postgresql;zaawansowany_sql_i_programowanie_baz_danych_postgresql_w_jezyku_plpgsql.szczegoly" target="_blank">Szkolenie PostgreSQL: Zaawansowany SQL i programowanie baz danych PostgreSQL w języku PL/pgSQL</a><br />
<br />
<br />
Szkolenie dla osób które znają już SQL i chcą poznać jego adaptację w bazach PostgreSQL, oraz rozszerzyć wiedzę o język PL/pgSQL bedący postgresową wersją języka PL/SQL.<br />
<br />
<br />
Jeśli szukasz innych szkoleń z zakresu postgreSQL <a href="http://jsystems.pl/szkolenia-postgresql.pokaz" target="_blank">sprawdź szkolenia PostgreSQL w JSystems</a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com1tag:blogger.com,1999:blog-341905815790009237.post-54520594337839463832019-08-30T05:24:00.001-07:002019-08-30T05:45:06.748-07:00Szkolenie Oracle w JSystemsJeśli szukasz sprawdzonej firmy w której możesz zapisać się na porządnie zrobione, warsztatowe <a href="http://jsystems.pl/szkolenia-oracle;kompleksowe_szkolenie_programowanie_w_plsql_w_oracle.szczegoly" target="_blank">szkolenie Oracle</a> - to moim zdaniem powinieneś zainteresować się ofertą naszej firmy. Wszystkie <a href="https://www.blogger.com/"><span id="goog_1074622454"></span>szkolenia Oracle<span id="goog_1074622455"></span></a> jakie oferujemy są wystarane i robimy je z sercem, ale dwa cieszą się szczególną popularnością:<br />
<br />
<a href="http://jsystems.pl/szkolenia-oracle;zaawansowany_sql_i_programowanie_w_plsql.szczegoly" target="_blank">Szkolenie Oracle: Zaawansowany SQL i programowanie w PL/SQL</a><br />
<br />
Dla tych którzy znają już SQL, ale chcieliby poszerzyć swoją wiedzę o dodatkowe funkcje języka SQL jakie dostarcza Oracle, oraz poznać proceduralny język programowania PL/SQL.<br />
<br />
<a href="http://jsystems.pl/szkolenia-oracle;kompleksowe_szkolenie_programowanie_w_plsql_w_oracle.szczegoly" target="_blank">Szkolenie Oracle: Kompleksowe szkolenie programowanie w PL/SQL w Oracle</a><br />
<br />
5 dni tylko na temat PL/SQL! Tak kompletnego i długiego szkolenia na temat PL/SQL na ten moment po prostu nie ma na rynku. Szkolenie zaczyna się od podstaw, a kończy się naprawdę zaawansowanymi zagadnieniami - w tym elementami tuningu. Bardzo polecam.<br />
<br />
Jeśli wśród powyższych nie znalazłeś tego co Cię interesuje, sprawdź <a href="http://jsystems.pl/szkolenia-oracle.pokaz" target="_blank">szkolenia Oracle</a> w JSystems<br />
<br />andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-1825209096305204882019-08-30T05:06:00.003-07:002019-08-30T05:06:48.316-07:00Szkolenie Java w JSystemsChciałbym Was zaprosić na porządne szkolenia Java w JSystems. Wybrałem 3 które uważam za wyjątkowo dobre, a jednocześnie mające terminy gwarantowane.<br />
<br />
<a href="http://jsystems.pl/szkolenia-java;programowanie_w_jezyku_java.szczegoly" target="_blank">Szkolenie Java: Programowanie w języku Java</a><br />
<br />
Szkolenie od podstaw. Obejmuje swoim programem najbardziej użyteczne narzędzia i techniki w codziennym programowaniu. W trakcie tego szkolenia uczestnicy tworzą od A do Z samodzielnie projekt obejmujący wszystkie zagadnienia ze szkolenia.<br />
<br />
<a href="http://jsystems.pl/szkolenia-java;java_dla_zaawansowanych.szczegoly" target="_blank">Szkolenie Java: Java dla zaawansowanych</a><br />
<br />
Wszystko to co okazuje się niezbędne gdy już programujesz "na poważnie". W tym między innymi:<br />
<br />
<ul>
<li>strumienie</li>
<li>wyrażenia Lambda</li>
<li>klasy generyczne</li>
<li>wielowątkowość (omawiana naprawdę szeroko)</li>
<li>wyrażenia regularne</li>
</ul>
<div>
<br /></div>
<div>
<a href="http://jsystems.pl/szkolenia-java;spring_mvc_i_hibernate__tworzenie_aplikacji.szczegoly" target="_blank">Szkolenie Java: Spring MVC i Hibernate </a></div>
<div>
<br /></div>
<div>
Najważniejszy stos technologiczny do tworzenia aplikacji WEBowych w Javie. Poznaj najpopularniejszy framework i ORM!</div>
<div>
<br /></div>
<div>
Jeśli żadne z powyższych Cię nie interesuje, sprawdź <a href="http://jsystems.pl/szkolenia-java.pokaz" target="_blank">inne szkolenia Java w JSystems!</a></div>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com1tag:blogger.com,1999:blog-341905815790009237.post-59824738106851690512019-08-30T04:16:00.005-07:002019-08-30T05:24:42.713-07:00Szkolenie Python w JSystemsCześć,<br />
chciałbym Was zaprosić na szkolenie z zakresu programowania w języku Python, które zaprojektowałem. Program tego szkolenia znajdziecie tutaj: <a href="http://jsystems.pl/szkolenia-python;programowanie_w_jezyku_python.szczegoly" target="_blank">Szkolenie Python - Programowanie w języku Python.</a><br />
<br />
Szkolenie trwa 5 dni. Obejmuje swoim zakresem nie tylko totalne podstawy - jak zmienne, pętle, instrukcje warunkowe, ale też zagadnienia bardzo użytkowe np:<br />
<br />
<ul>
<li>przetwarzanie plików tekstowych (w tym CSV)</li>
<li>przetwarzanie danych JSON</li>
<li>przetwarzanie danych XML</li>
<li>łączenie się i przetwarzanie danych z baz Oracle, PostgreSQL</li>
<li>wykorzystanie zdalnych usług sieciowych</li>
<li>wiele innych drobnych a istotnych z punktu widzenia programisty zagadnień</li>
</ul>
<div>
<br /></div>
<div>
Format szkolenia to typowy warsztat, wszak nic tak dobrze nie uczy jak praktyka. Jeśli programowałeś już wcześniej w innym języku programowania (coś więcej niż hello world ;) ), to zajrzyj raczej do szkolenia <a href="http://jsystems.pl/szkolenia-python;programowanie_w_jezyku_python_dla_programistow.szczegoly" target="_blank">Szkolenie Python - Programowanie w języku Python dla programistów</a></div>
<div>
Zakres tego szkolenia jest identyczny, jednak sposób prowadzenia i stopień trudności przykładów i ćwiczeń jest dostosowany do osób bardziej doświadczonych w programowaniu. Z tego też powodu to szkolenie jest krótsze - trwa 3 dni dla tego samego zakresu tematycznego. Miejsca dosyć szybko się zapełniają, warto więc zapisywać się jak najszybciej. Jeśli żadne z tych szkoleń nie obejmuje swoim zakresem tego co Cię interesuje -<a href="http://jsystems.pl/szkolenia-python;programowanie_w_jezyku_python.szczegoly" target="_blank"> sprawdź inne szkolenia Python w JSystems</a></div>
<div>
<br /></div>
<div>
Zapraszam i do zobaczenia na sali!</div>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-28850706436172446672018-10-26T06:09:00.004-07:002018-10-26T06:10:34.271-07:00Cześć,<br />
jak pewnie wiecie prowadzę firmę szkoleniową JSystems Sp. z o.o.<br />
Jeśli chciałbyś przyjść na szkolenia na naprawdę wysokim poziomie, w formie warsztatowej i z gwarantowanymi terminami szkoleń, to zachęcam do odwiedzenia poniższych linków:<br />
<br />
<br />
<ul>
<li><a href="http://jsystems.pl/szkolenia-big-data.pokaz" target="_blank">Szkolenia Big Data</a></li>
<li><a href="http://jsystems.pl/szkolenia-datascience.pokaz" target="_blank">Szkolenia Data Science</a></li>
<li><a href="http://jsystems.pl/szkolenia-oracle.pokaz" target="_blank">Szkolenia Oracle</a></li>
<li><a href="http://jsystems.pl/szkolenia-mssql.pokaz" target="_blank">Szkolenia SQL Server</a></li>
<li><a href="http://jsystems.pl/szkolenia-postgresql.pokaz" target="_blank">Szkolenia PostgreSQL</a></li>
<li><a href="http://jsystems.pl/szkolenia-java.pokaz" target="_blank">Szkolenia Java</a></li>
<li><a href="http://jsystems.pl/szkolenia-javascript.pokaz" target="_blank">Szkolenia JavaScript, React, Angular</a></li>
<li><a href="http://jsystems.pl/szkolenia-dotnet.pokaz" target="_blank">Szkolenia C#</a></li>
<li><a href="http://jsystems.pl/szkolenia-python.pokaz" target="_blank">Szkolenia Python</a></li>
<li><a href="http://jsystems.pl/szkolenia-linux.pokaz" target="_blank">Szkolenia Linux</a></li>
<li><a href="http://jsystems.pl/szkolenia-uml.pokaz" target="_blank">Szkolenia UML i BPMN</a></li>
<li><a href="http://jsystems.pl/szkolenia-devops.pokaz" target="_blank">Szkolenia Docker</a></li>
</ul>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.comtag:blogger.com,1999:blog-341905815790009237.post-40010009778358033562016-02-25T06:12:00.001-08:002016-04-22T07:43:25.649-07:00Kolejne artykuły na nowym bloguWitajcie,<br />
jeśli macie ochotę zapoznać się z nowymi artykułami z zakresu Oracle, Javy, PostgreSQL zapraszam na<a href="http://www.jsystems.pl/blog/startowa.do" target="_blank"> nowego bloga (http://www.jsystems.pl/blog/startowa.do)</a> którego współtworzę wraz z kolegami z pracy :)<br />
<br />
Czuwaj! ;)andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com3tag:blogger.com,1999:blog-341905815790009237.post-7552037171328258002015-04-10T04:38:00.000-07:002018-05-14T01:21:04.091-07:00Trener Oracle<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggsFN0IH8hOOuRH_z9YCnCgqMzQOS2Ana-oeaKq7DwSI3K5FVJh3wW2Wxoqt5MkfFbSKrCyVJv-oufBXXzOvcOVgRTPIRtmcRhxJcDRM6GFV2L-koddOXiHiSUB-B-qv6Dbm1E-HIv_Le7/s1600/mapeta.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggsFN0IH8hOOuRH_z9YCnCgqMzQOS2Ana-oeaKq7DwSI3K5FVJh3wW2Wxoqt5MkfFbSKrCyVJv-oufBXXzOvcOVgRTPIRtmcRhxJcDRM6GFV2L-koddOXiHiSUB-B-qv6Dbm1E-HIv_Le7/s1600/mapeta.jpg" width="163" /></a>Witaj,<br />
zawodowo zajmuję się prowadzeniem szkoleń związanych z bazami danych Oracle, oraz tworzeniem oprogramowania z wykorzystaniem Oracle oraz Javy. Obie rzeczy robię z niekłamaną przyjemnością.<br />
W wyżej wymienionych dziedzinach poszukuję dalszych zleceń - jeśli więc potrzebujesz człowieka z pasją - zapraszam do kontaktu:<br />
<br />
tel: 533 871 812<br />
@: klusiewicz@jsystems.pl<br />
<br />
<br />
<br />
<br />
Istnieje też możliwość przygotowania przeze mnie materiałów, oraz komputerów na potrzeby szkolenia. Dysponuję też własnymi salami szkoleniowymi.<br />
<br />
<br />
<br />
<b>Czemu ja?</b><br />
<br />
<br />
<ul>
<li>Bo pracuję z pasją. Niewiele rzeczy daje mi tyle satysfakcji co uśmiechnięte twarze na koniec szkolenia</li>
<li>Prowadzę szkolenia tak, by były jak najbardziej praktyczne. Nie jest to wykład akademicki, w zasadzie większość przykładów i zastosowań zagadnień prezentuję "na żywo". Staram się uczyć, a nie nauczać. Wskazywać drogę a nie popychać. Dbam o to, by uczestnicy moich szkoleń wyszli ze szkolenia i potrafili prezentowane zagadnienia wykorzystać w praktyce a nie tylko z głowami pełnymi teorii.</li>
<li>Jestem trenerem z wieloletnim doświadczeniem i sukcesami zawodowymi. </li>
<li>Przykłady opinii o prowadzonych przeze mnie szkoleniach mówią same za siebie: <a href="http://www.jsystems.pl/opinie.jsp">http://www.jsystems.pl/opinie.jsp</a></li>
<li>Prowadzę również szkolenia autoryzowane. Aby takie szkolenia prowadzić, nie można mieć wiedzy ogólnej, ani tylko teoretycznej. Trzeba też mieć potwierdzające kompetencje certyfikaty</li>
<li>Mogę dostarczyć własne materiały, a nawet komputery i udostępnić salę szkoleniową w Warszawie.</li>
<li>Bo klienci zazwyczaj wracają do mnie po więcej :)</li>
<li>Bo można sprawdzić sposób przekazywania przeze mnie wiedzy choćby na tym blogu</li>
<li>Mam przyzwoite stawki :) I wystawiam fakturę.</li>
<li>Jestem mobilny. Mogę poprowadzić szkolenie gdziekolwiek.</li>
<li>Nie strugam księcia :D Nie mam jakichś kosmicznych wymagań co do zakwaterowania, nie dąsam się :), można się ze mną dogadać jak z człowiekiem (Organizatorzy szkoleń na pewno wiedzą o co chodzi) </li>
</ul>
<br />
<br />
Jeśli chcesz wziąć udział w szkoleniach Oracle które są prowadzone przeze mnie, możesz zapisać się na nie w firmie <a href="http://www.jsystems.pl/" target="_blank">JSystems</a><br />
<br />
<br />
<br />andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-68584600710314477822015-04-10T04:09:00.001-07:002018-10-26T06:02:35.701-07:00Trener Oracleandrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-63298560703703809022014-12-16T02:00:00.001-08:002014-12-16T02:00:10.653-08:00Odtwarzanie pliku kontrolnego bez kopii w autobackupieJeśli zdarzy się tak, że padnie nam baza a nie mieliśmy włączonego autobackupu pliku kontrolnego, możemy posłużyć się poniższą metodą. W moim przypadku padł system, nie miałem wcześniej włączonego autobackupu i zostałem z zawartością FRA. Ponieważ po padzie systemu i instalacji bazy od nowa, musiałem odtworzyć starą bazę na nowej, pojawił się problem z różnymi DBID. DBID (czyli taki unikalny identyfikator bazy) przechowywany jest w pliku kontrolnym, więc ten musiałem odzyskać w pierwszej kolejności. Podczas zwykłych backupów również jest robiony backup pliku kontrolnego, trzeba go będzie tylko wskazać przy odtwarzaniu. Ja znalazłem właściwy po nazwach katalogów (w FRA jest katalog backuppiece a w nim podkatalogi z datami i w nim są malutkie pliki tak po ok 1 MB zawierające właśnie backup pliku kontrolnego). Uruchamiamy RMANa, kładziemy bazkę do NOMOUNTa i wydajemy polecenie:<br />
<br />
<b>restore controlfile from 'ścieżka do backupu pliku kontrolnego w FRA';</b><br />
<b><br /></b>
Plik kontrolny mamy odzyskany. Przechodzimy więc do mounta:<br />
<br />
<b>alter database mount;</b><br />
<b><br /></b>
Musimy teraz zrobić porządek z położeniem plików backupów z których chcemy odzyskiwać bazę. Repo backupów znajduje się w pliku kontrolnym, tak więc mamy tam informacje o starych położeniach backupów. Dajemy więc:<br />
<br />
<b>CROSSCHECK BACKUP;</b><br />
<b>DELETE EXPIRED BACKUP;</b><br />
<b>CATALOG START WITH 'ŚCIEŻKA DO katalogu z backupami i archivelogami (nadrzędny katalog)';</b><br />
<br />
Pierwsze dwie komendy służą wywaleniu informacji o backupach których fizycznie już nie ma wg. repo. Trzecia powoduje zarejestrowanie nowego położenia backupów i archivelogów. Dalej odtwarzanie przebiega jak zawsze:<br />
<br />
<b>RESTORE DATABASE;</b><br />
<b>RECOVER DATABASE;</b><br />
<b>ALTER DATABASE OPEN RESETLOGS;</b><br />
<b><br /></b>
Ostatnia komenda do otwarcie bazy, ale w związku z odtwarzaniem pliku kontrolnego musimy otworzyc bazę z użyciem resetlogsa. Warto pamiętać też o zrobieniu jakiegoś backupu, byśmy w razie czego mieli z czego otwarzać w ramach nowej inkarnacji która powstaje przy resetlogsie ;) Proponowałbym też zadbać o właściwe ustawienie parametru db_recovery_file_dest, bo nowe położenie FRA nie musi pokrywać się ze starym. Tą metodę możemy wykorzystać również przy duplikacji opisanej tutaj: http://andrzejklusiewicz.blogspot.com/2013/01/gotuj-z-oraclem-odtworzenie-bazy-w.html<br />
<br />
<br />
<br />
<br />
<br />
<br />andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-55086436014027935732014-12-15T08:02:00.000-08:002015-12-15T08:06:52.793-08:00Kurs Oracle PL/SQL. Funkcje strumieniowe<div style="text-align: justify;">
Istnieje możliwość tworzenia w PL/SQL na których wyniku możemy
operować tak jak na tabeli – mam na myśli stosowanie SELECT,
warunków WHERE i sortowania. Jest możliwość zastosowania funkcji
zwracającej tablicę typu obiektowego, jednak stosowanie takich
typów nie należy do wygodnych. Ponadto trzeba będzie poczekać na
wynik do czasu aż wygeneruje się cały. Przypuśćmy, że chcemy
dostać pierwsze X wierszy jak najszybciej. Reszta może zostać
pobrana nieco później. Interesuje nas działanie podobne do
wykonania zapytania SELECT na bardzo dużej tabeli w narzędziu takim
jak SQL Developer. Stosunkowo szybko (o ile nie zastosowaliśmy np.
sortowania) dostaniemy pierwsze 50 wierszy (tylko one zostały
pobrane z bazy). Kolejne zostaną zfetchowane dopiero gdy przesuniemy
suwak przy wyniku. Aby uzyskać taki efekt, możemy zastosować
funkcję strumieniową – pipelined. Wiersze będą zwracane z
funkcji jeden po drugim w takim tempie w jakim będą pobierane /
generowane. Nie będziemy musieli czekać na wygenerowanie całego
wyniku. Moim zdaniem ciekawa funkcjonalność w optymalizacji PL/SQL.
Nic nie stoi też na przeszkodzie by użyć funkcji strumieniowych w
połączeniu z typem obiektowym.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Zaczniemy od najprostszego przykładu. Stworzyłem funkcję
zwracającą kolejne potęgi liczby 2. Funkcja będzie zwracać
tablicę elementów typu number element po elemencie. Na wyniku tej
funkcji wykorzystamy SELECT.
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
W pierwszej kolejności tworzę typ tablicowy elementów typu
number, widoczny w całym schemacie. Dalej tworzę funkcję która
zwróci tyle kolejnych potęg liczby 2 ile podamy przez parametr.
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Różnicę w stosunku do zwykłych funkcji zauważyć można w
liniach 3, 7 i 9. W linii 3 zauważymy deklarację "PIPELINED",
jest ona wymagana jeśli chcemy wykorzystywać funkcje w sposób
opisanywcześniej. W linii 7 znajdziemy "pipe row". Oznacza
on po prostu zwrot kolejnego elementu z funkcji. W linii 9 znajdziemy
klauzulę return która jednak nic nie zwraca... Musi ona być z
powodów formalnych. Sam zwrot danych zrealizowaliśmy już wcześniej
z użyciem PIPE ROW :)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
W liniach 12 i 13 zobaczymy sposób wykorzystania naszej nowej
funkcji. Klauzula TABLE umożliwia nam stosowanie SELECT na wyniku
funkcji. Oczywiście moglibyśmy tutaj użyć również WHERE czy
ORDER BY.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNAod3mXopjBvXXGcFYvoDueKjwfemAvlICGdwS4AXcXgSRvLsIV9j7d2G7TQzRqKcOLh57XmmheV-wqSvlN2H1M_hEhhALxSVerdtyOaUK_wFjhoBPa83y8xm65iOBR4HCwQvtTuMhpyQ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNAod3mXopjBvXXGcFYvoDueKjwfemAvlICGdwS4AXcXgSRvLsIV9j7d2G7TQzRqKcOLh57XmmheV-wqSvlN2H1M_hEhhALxSVerdtyOaUK_wFjhoBPa83y8xm65iOBR4HCwQvtTuMhpyQ/s400/1.png" width="371" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Teraz nieco skomplikujemy sytuację. Funkcja nie będzie zwracała
tablicy elementów typu prostego, a tablicę elementów typu
rekordowego.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
W pierwsze kolejności muszę zdeklarować sam zwracany typu
rekordowy. Ponieważ nie mogę go zdeklarować w schemacie, deklaruję
go w pakiecie. Przy okazji w tym samym pakiecie deklaruję również
typ tablicowy złożony z elementów właśnie utworzonego typu
rekordowego. Tutaj wymagane jest pewne wyjaśnienie z moje strony.
Czemu w typie rekordowym mam same pola typu varchar2? Nie jest to w
żaden sposób wymagane. Po prostu wszystkie typy proste inne niż
grupa LOB czy typ LONG są konwertowalne do varchar2, a ja jeszcze
nie wymyśliłem zapytania któego użyję :) To sprawia też że ten
typ rekordowy będzie wielorazowego użytku na potrzeby ewentualnych
innych zapytań. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLHRgTBccqTp3FO9etsMewzM46fqmoqwd6S1JtrsVclnrieaEqcFaW9b7Qn9NpMiHzpO9TmMa52eGA6Fs2ZMCtqxHvXPNP1eqwvKxJbExkD__O3oSy_scxvN-RFjH0iBQhn_zPXO_wIggN/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLHRgTBccqTp3FO9etsMewzM46fqmoqwd6S1JtrsVclnrieaEqcFaW9b7Qn9NpMiHzpO9TmMa52eGA6Fs2ZMCtqxHvXPNP1eqwvKxJbExkD__O3oSy_scxvN-RFjH0iBQhn_zPXO_wIggN/s400/2.png" width="377" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: justify;">
Dalej tworzę funkcję wykorzystującą ten typ tablicowy.
Konstrukcyjnie niewiele tutaj zmian w stosunku do poprzedniej
funkcji. Tyma razem jednak przetwarzam wynik zapytania. Może rzucić
się w oczy linia 29 z deklaracją pojedynczego elementu do którego
wrzucam zaczytany z kursora wiersz. Po co mi on potrzebny jeśli
funkcja ma zwracać tablicę? Zwracać będzie tablicę, ale wierszo
po wierszu. W linii 35 wywołuję PIPE ROW która nie może przecież
zwrócić nam tablicy. Dlatego potrzebuję takiego elementu jako
kontenera na kolejne zwracane wiersze.</div>
<br />
<div style="text-align: justify;">
<br /></div>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-49869398687532962812014-12-15T07:42:00.000-08:002015-12-15T07:52:16.743-08:00Kurs administracji Oracle. Tryb Flashback<div style="text-align: justify;">
Tryb flashback umożliwia oglądanie danych w bazie, w takim
stanie w jakim były w określonym punkcie w czasie. Stan danych
będzie pochodził z przestrzeni UNDO, a to oznacza że dostęp do
stanu z przeszłości będzie możliwy tylko wtedy,gdy oryginalne
postaci danych nie zostaną nadpisane.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aby wykorzystać tę funkcjonalność użytkownik musi mieć
nadane przez administratora uprawnienia do pakietu dbms_flashback:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>grant execute on dbms_flashback to hr;</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Z poziomu użytkownika HR odpytuję
tabelkę EMPLOYEES wybierając kilka wierszy.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXD9MlbQaaasAl3N9w_0iujMAtQYeO5prfkSf_VpfRV5WusWjPQye4MqKf5D0TW5p8JO1cf5GHiHR4C8cUMwqUWxGboF3eFz9ej06x8EHqAU0ILOOjykFQXIAkwBKfSZPenY3bwCnC6V3M/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXD9MlbQaaasAl3N9w_0iujMAtQYeO5prfkSf_VpfRV5WusWjPQye4MqKf5D0TW5p8JO1cf5GHiHR4C8cUMwqUWxGboF3eFz9ej06x8EHqAU0ILOOjykFQXIAkwBKfSZPenY3bwCnC6V3M/s400/1.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Następnie dokonuję zmiany na tych wierszach i zatwierdzam ją.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCnG-K50so-T_Er6UXwnzYAM8haov5C_j_uegGqe4cIpaYrQ0xq2s0iZYIDU9iQaEEHYR0ZQYkh8rzL-qrmPBIwFkfTLcoLgCRELdf6Xx1rrzbz6FoeEgxSBZO9f5y7MbZlwGuJR1H906d/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCnG-K50so-T_Er6UXwnzYAM8haov5C_j_uegGqe4cIpaYrQ0xq2s0iZYIDU9iQaEEHYR0ZQYkh8rzL-qrmPBIwFkfTLcoLgCRELdf6Xx1rrzbz6FoeEgxSBZO9f5y7MbZlwGuJR1H906d/s400/2.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Zarówno moja, jak i każda inna sesja będą widziały dane po
zmianie:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvE_yugeO1JJnWY_x1sgNPw-00dZpAM64UY3w0M4NjFcu8lWhSy5DoAb3LOv6WMpzWHXDFEQFsdF_Cls2t6ebyU_pclpQLw6911YyiJnj9gHrRVcqcfhPRbTR0pU97bVndMuBBkcEMfapq/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvE_yugeO1JJnWY_x1sgNPw-00dZpAM64UY3w0M4NjFcu8lWhSy5DoAb3LOv6WMpzWHXDFEQFsdF_Cls2t6ebyU_pclpQLw6911YyiJnj9gHrRVcqcfhPRbTR0pU97bVndMuBBkcEMfapq/s400/3.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Następnie komendą
<br />
<br />
<div style="text-align: justify;">
<b>execute dbms_flashback.enable_at_time(to_date('29-11-2015
12:00:00','dd-mm-yyyy</b></div>
<div style="text-align: justify;">
<b>hh24:mi:ss'));</b></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
sprawiam, że widzę dane w stanie w
jakim były dwie godziny przed zmianami. <br />
<br />
I przeglądam dane:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5iQPlGIRZ7pcwpKdzbUQI0wBWliC8ylHyM4UyYgHhXHGcM609cd2zBbZtkK_oq0-oU5iM2Y8yIrOesPmB7tg3hFAY1VOE38Ok9mfdO5NW2Egvat5F0i1QFEX2Kj53DuNOt6A2LBOy9m-E/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5iQPlGIRZ7pcwpKdzbUQI0wBWliC8ylHyM4UyYgHhXHGcM609cd2zBbZtkK_oq0-oU5iM2Y8yIrOesPmB7tg3hFAY1VOE38Ok9mfdO5NW2Egvat5F0i1QFEX2Kj53DuNOt6A2LBOy9m-E/s400/4.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Baza danych dla mojej sesji jest
jednak tylko do odczytu. Pozostając w trybie flashback nie mam
możliwości dokonywania jakichkolwiek zmian na niej. Aby wyłączyć
tryb flashback stosuję polecenie:</div>
<br />
<div style="text-align: justify;">
<b><b>execute dbms_flashback.disable;</b></b></div>
<b>
</b>
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-17647026226761578062014-12-15T06:58:00.000-08:002015-12-15T07:13:27.035-08:00Kurs Oracle PL/SQL. Ukrywanie implementacji <div style="margin-bottom: 0cm; text-align: justify;">
<span style="font-family: "arial" , sans-serif;">Oracle
udostępnia nam możliwość ukrycia implementacji kodu PLSQL. Czasem
chcemy wdrożyć system, ale w taki sposób by nikt niepowołany nie
mógł przeglądać jego źródeł. </span>
</div>
<div style="margin-bottom: 0cm; text-align: justify;">
<span style="font-family: "arial" , sans-serif;">Możemy
tego dokonać w kilku prostych krokach. Najpierw zapisujemy do pliku
tekstowego kod programu:</span></div>
<div style="margin-bottom: 0cm; text-align: justify;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio2Kazj3SV4XInp3TZL8oE3Rm6J55VVv1bqiPGdsCefPQeVA8__97oDYnj7Qi5nV05H2lDUaInjiQpP7G2LlFsvcfFC7JkawqYYIG8tcrf0GV_l0wly4oEfqf-Un7_Ut6-u0AfnGKOShuk/s1600/kod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="109" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio2Kazj3SV4XInp3TZL8oE3Rm6J55VVv1bqiPGdsCefPQeVA8__97oDYnj7Qi5nV05H2lDUaInjiQpP7G2LlFsvcfFC7JkawqYYIG8tcrf0GV_l0wly4oEfqf-Un7_Ut6-u0AfnGKOShuk/s400/kod.png" width="400" /></a></div>
<div style="margin-bottom: 0cm; text-align: justify;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
<div style="margin-bottom: 0cm; text-align: justify;">
<span style="font-family: "arial" , sans-serif;">Następnie
używamy programu WRAP który służy do zamiany tego kodu na postać
zaszyfrowaną:</span></div>
<div style="margin-bottom: 0cm; text-align: justify;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3JefSZXlpH6QdsgD3qCmxppEm-jpNqXgDMz7Emc9d2TJ7YkO6gem-MlGeVfEezAQUBPHgmOhz7lBHWNt0Xqwad1cUosWVzAhrAhIIQTgGLwt1xidbwUiwWoDynk_RXfXyy5408mA3ajzR/s1600/kod2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="79" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3JefSZXlpH6QdsgD3qCmxppEm-jpNqXgDMz7Emc9d2TJ7YkO6gem-MlGeVfEezAQUBPHgmOhz7lBHWNt0Xqwad1cUosWVzAhrAhIIQTgGLwt1xidbwUiwWoDynk_RXfXyy5408mA3ajzR/s400/kod2.png" width="400" /></a></div>
<div style="margin-bottom: 0cm; text-align: justify;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: "arial" , sans-serif;">Dalej
logujemy się sqlplusem lub innym klientem i wywołujemy ten
zaszyfrowany kod tak jak normalny:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM94ilhYKwEtPJmXel7JOHKxqn5petLKFUOLMzVoqlXgqu8ktvfBZtsXymQ5CosaLcgRri5NbdQUXXsnCrxgNjhs0DZXt_wkqhfI7S-V0h_M149rqts0eWIdIN_xZLSnuovIAxeO87-VTb/s1600/kod3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM94ilhYKwEtPJmXel7JOHKxqn5petLKFUOLMzVoqlXgqu8ktvfBZtsXymQ5CosaLcgRri5NbdQUXXsnCrxgNjhs0DZXt_wkqhfI7S-V0h_M149rqts0eWIdIN_xZLSnuovIAxeO87-VTb/s400/kod3.png" width="400" /></a></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: "arial" , sans-serif;">Kodu
takiej procedury nie da się przejrzeć:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOHq5jdYoI6dSSAervZCviLxXACCwCre107nz7VKN8XOVXWOqoHy9S-1Gjbf8aHrXByOMZVts4fOgdXONpjRIY1ZFsyFQZQYZQFAJ_GKCpMkDRip9YJjmCtYbYXn5VFDIYSLV5VkyJMn0y/s1600/kod4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="268" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOHq5jdYoI6dSSAervZCviLxXACCwCre107nz7VKN8XOVXWOqoHy9S-1Gjbf8aHrXByOMZVts4fOgdXONpjRIY1ZFsyFQZQYZQFAJ_GKCpMkDRip9YJjmCtYbYXn5VFDIYSLV5VkyJMn0y/s400/kod4.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: "arial" , sans-serif;">Natomiast bez problemu można ją wywołać i wszystko będzie działać jak
zawsze:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPiFJO7fupafahtQta_lKTVVHi9zOTPhsEmU4aogKTBvGBFP788GWEvulLXciWBdTOx3bTyqfCjGApn4DxHdxR2QzXtpmeX3XSZFya_BVYuUqQmtGkg-fXzce0QdIdan8f7lMHqUXiGIlA/s1600/kod5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPiFJO7fupafahtQta_lKTVVHi9zOTPhsEmU4aogKTBvGBFP788GWEvulLXciWBdTOx3bTyqfCjGApn4DxHdxR2QzXtpmeX3XSZFya_BVYuUqQmtGkg-fXzce0QdIdan8f7lMHqUXiGIlA/s400/kod5.png" width="400" /></a></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: "arial" , sans-serif;"><br /></span></div>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-55198723614842413492014-02-17T13:13:00.003-08:002014-02-17T13:13:28.426-08:00Mój bezpłatny kurs programowania na platformę AndroidStworzyłem bezpłatny kurs programowania na platformę Android :) Znajdziecie go pod tym linkiem: <a href="http://andrzejklusiewicz-android.blogspot.com/p/bezpatny-kurs-programowania-android-java.html">http://andrzejklusiewicz-android.blogspot.com/p/bezpatny-kurs-programowania-android-java.html</a><br />
<br />
Jak zawsze zapraszam do oceny i komentowania ;)<br />
<br />
<br />andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-44980578802946505342014-01-09T04:24:00.000-08:002014-01-09T04:24:00.137-08:00Klauzula NOCOPY w PL/SQLKlauzulę NOCOPY możemy stosować przy parametrach OUT oraz IN
OUT . Sprawia ona że wartość przekazana przez parametr nie jest
kopiowana (jak to się dzieje domyślnie) a przekazywana jest
referencja. To oznacza, że przekazywany jest wskaźnik do obszaru
pamięci, a nie wartość jako taka. Efekt jest taki, że zarówno
procedura z parametrem jak i blok (lub inna procedura czy funkcja) ją
wywołujący działają na TYCH SAMYCH danych, bo chodzi o tą samą
przestrzeń w pamięci operacyjnej.<br />
<div style="margin-bottom: 0in;">
<br />
</div>
<div style="margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFipuPQ_D243RsWyI13pRMfBTTk-ZFB0SS_8NY2HWYpxDsmyhk6-LbH3jsFkZK1dsba9jJrTbgg2Pzoym05EBWA7lC1OQ-i2vaPufpZaSOZaYANuEF4Z9xRDq37N2lWGBUvfxkhX0CKmBa/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFipuPQ_D243RsWyI13pRMfBTTk-ZFB0SS_8NY2HWYpxDsmyhk6-LbH3jsFkZK1dsba9jJrTbgg2Pzoym05EBWA7lC1OQ-i2vaPufpZaSOZaYANuEF4Z9xRDq37N2lWGBUvfxkhX0CKmBa/s1600/1.png" /></a></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<br />
</div>
<div style="margin-bottom: 0in;">
Z jednej strony stosowanie klauzuli
NOCOPY może nam pomóc – zwłaszcza przy przekazywaniu przez
parametr typu OUT dużych wartości np. długich tablic albo dużych
obiektów. Z drugiej strony, jeśli np. w procedurze nastąpi jakiś
wyjątek, to w naszej przekazanej zmiennej może znaleźć się coś
innego niż byśmy się spodziewali. Poniżej przedstawiam przykład
takiej sytuacji:</div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxv07V8-3xMbNTWv7CT8GAMymllcqnvCqPlywJPnFHEgj-yVuJ3stgH1QPY0Tp3DrTKr5DpNg89f7DcAidItZKeAUlAlg7lLO825jilTpkKE5GSv9CXNCsIVnn-eAbWbqJGhk3NUkGR5SS/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxv07V8-3xMbNTWv7CT8GAMymllcqnvCqPlywJPnFHEgj-yVuJ3stgH1QPY0Tp3DrTKr5DpNg89f7DcAidItZKeAUlAlg7lLO825jilTpkKE5GSv9CXNCsIVnn-eAbWbqJGhk3NUkGR5SS/s1600/2.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="margin-bottom: 0in;">
Jak widzimy, w wyniku wywołanego
wyjątku, przetwarzanie w procedurze nie dobiegło do końca. W
efekcie w zmiennej y bloku wywołującego znalazł się tekst „W
trakcie przetwarzania” zamiast „Oryginalny oryginał”</div>
<div style="margin-bottom: 0in;">
<br />
</div>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com1tag:blogger.com,1999:blog-341905815790009237.post-22237763349095659402014-01-03T04:26:00.000-08:002014-01-03T04:26:00.087-08:00Parametry typu IN, OUT, IN OUT w procedurach i funkcjach PL/SQL<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">Dla
procedur oraz funkcji możemy definiować opcjonalne parametry. Mogą
występować w trzech typach:</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>IN
– </b>parametr tylko do odczytu, poprzez który dane zostają
przekazane do podprogramu.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>OUT</b> –
Służy do zwracania wartości z podprogramu. Ma wartość NULL do
momentu kiedy zostanie zainicjalizowana.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<br />
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>IN
OUT</b> – Połączenie dwóch powyższych typów. Podczas
wywoływania programu tym parametrem przekazywane są do niego
wartości, a po zakończeniu wykonywania zwracane. Stosuje się go
gdy dane wejściowe mają zostać zmienione podczas działania
programu.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLVstVkbBIGW_TMOLUD_SlBY-f78-BjZpCDdLoLQQAFmb1b5CZjX9aT8UITL1sf6I6LyKhBavnJ0FJ3yaqArkJjfVsDuAXawcVdhcqmKmkaAl01N6K-EJR3xhzL2ptoUO2NtrjuDaHLZZy/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLVstVkbBIGW_TMOLUD_SlBY-f78-BjZpCDdLoLQQAFmb1b5CZjX9aT8UITL1sf6I6LyKhBavnJ0FJ3yaqArkJjfVsDuAXawcVdhcqmKmkaAl01N6K-EJR3xhzL2ptoUO2NtrjuDaHLZZy/s1600/1.png" /></a></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQZ_JHcMYAdEAY-ytqtwV5Ok0aWXrbkQIUPgp3_0YEs4wDLPc0LONr-SU7QOVb2a0BZ4tMmLfn9Ogvf2kwCRBrvovur1Sibv6wmPBFqo6ThtFK2QzB1-i-CysWy55iGl3Cop0mIo-JUlEd/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQZ_JHcMYAdEAY-ytqtwV5Ok0aWXrbkQIUPgp3_0YEs4wDLPc0LONr-SU7QOVb2a0BZ4tMmLfn9Ogvf2kwCRBrvovur1Sibv6wmPBFqo6ThtFK2QzB1-i-CysWy55iGl3Cop0mIo-JUlEd/s1600/2.png" /></a></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">Podczas
deklarowania parametrów dla procedury lub funkcji nie ma sztywnych
ograniczeń co do ich ilości oraz kolejności. Parametry mogę
zadeklarować na kilka różnych sposobów i poniżej omawiam to na
przykładach:</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>wejsciowy1
–</b> parametr wejścia typu varchar2, nie posiada wartości
domyślnej i dlatego przy wywoływaniu podprogramu będę zmuszony ją
podać.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>wejsciowy2</b> <b>oraz
wejsciowy3 </b>- dwa sposoby zadeklarowania wartości domyślnej
dla parametru. Jeśli nie przypiszę żadnej wartości, przypisana
zostanie automatycznie wartość występująca po DEFAULT lub znaku
przypisania. Podczas wywoływania podprogramu nie muszę podawać
wartości do tego parametru.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>wejsciowy4</b> –
ponieważ nie określiłem jaki ma to być typ parametru, Oracle
domyślnie przyjmuje że jest ot parametr typu IN.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>wejsciowy5
– </b>parametr typu wejściowego numerycznego który będę
musiał uzupełnić przy wywoływaniu procedury.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>wyjsciowy
– </b>parametr wyjściowy typu number. Nie mogę określić
dla niego wartości domyślnej, ani wartości wejściowej przy
wywołaniu programu. Mogę to zrobić <u>jedynie</u> wewnątrz
podprogramu.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje106BohNVv7Lesfoxw6V90Ub86cjBV9e1qMwDRl8dFsbqEYZaEQ2JZQU_UDeZ1iZ6t9h1z2M5dGCADNSDMjt6ip4h0HqF5cJfbX-b9anta7Z9uwax5HAffFeGgCo_TPPZDpAqD9NxzqWv/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje106BohNVv7Lesfoxw6V90Ub86cjBV9e1qMwDRl8dFsbqEYZaEQ2JZQU_UDeZ1iZ6t9h1z2M5dGCADNSDMjt6ip4h0HqF5cJfbX-b9anta7Z9uwax5HAffFeGgCo_TPPZDpAqD9NxzqWv/s1600/3.png" /></a></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><b>dwustronny</b> –
parametr do którego nie mogę przypisać wartości domyślnej przy
wywoływaniu podprogramu. Mogę podać do niego wartość podczas
wywoływania podprogramu.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">Mogę
określać typ parametru, nie mogę natomiast długości. Zamiast
więc stosować varchar2(243) muszę zastosować samo varchar2. </span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">Przykład
wzajemnego wywoływania procedur oraz praktycznego przekazywania
parametrów.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0.2in;">
<br /><br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0.2in;">
<br /><br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
</div>
<ol>
<li><div style="border: none; line-height: 0.19in; padding: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">Tworzę
procedurę o nazwie „wypisywacz”, która po otrzymaniu danych w
parametrach wejściowych (imię i nazwisko są domyślnie IN) ma
wypisać na ekranie powitanie. Ponadto do parametru wyjściowego
wzrost ma przypisać wartość 178.</span></span></span></div>
<div style="border: none; line-height: 0.19in; padding: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="border: none; line-height: 0.19in; padding: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKp3UeARaPsUi3d9vgn78KATrsJY1zKUejFcv6sUz-y0sfa5uUJpCflXkuTuqlEaLUkjQjwa6ZpwMWSwXPz5TJjNfIB66qQrlS1FFJLe_QS3xAtouMIcrDeEx08opanWt8IL9GyZqjqML7/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKp3UeARaPsUi3d9vgn78KATrsJY1zKUejFcv6sUz-y0sfa5uUJpCflXkuTuqlEaLUkjQjwa6ZpwMWSwXPz5TJjNfIB66qQrlS1FFJLe_QS3xAtouMIcrDeEx08opanWt8IL9GyZqjqML7/s1600/4.png" /></a></div>
<div style="border: none; line-height: 0.19in; padding: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="border: none; line-height: 0.19in; padding: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">2.
Z bloku anonimowego wywołuję przed momentem stworzoną procedurę
podając wartości dla parametrów wejściowych, oraz nazwę zmiennej
do której ma zostać przypisana wartość wyjściowa.</span></span></span></div>
<div style="border: none; line-height: 0.19in; padding: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">
</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDkTAegt7wLwt8fiI1IZV3mEbrl8JaLbdOTmqJRmluGY8DshsUr-F63ob74U2w_O7a0nmyLYV4enUlEkZC5E5-s7hy6xYZWME0hqX8lcMEiLqaEwU5eAXocM2SaNK3WOz0Xss6d25NuEJJ/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDkTAegt7wLwt8fiI1IZV3mEbrl8JaLbdOTmqJRmluGY8DshsUr-F63ob74U2w_O7a0nmyLYV4enUlEkZC5E5-s7hy6xYZWME0hqX8lcMEiLqaEwU5eAXocM2SaNK3WOz0Xss6d25NuEJJ/s1600/5.png" /></a></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br /></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">Jak
widać, po wywołaniu procedury „wypisywacz” wartość zmiennej
do której została przypisana wartość wewnątrz procedury
„wypisywacz” uległa zmianie.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<br />
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
</div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;">Parametrów
wcale nie muszę wypisywać w dokładnie takiej kolejności w jakiej
są zdeklarowane w definicji funkcji/procedury. Jedynym warunkiem
jest określenie podczas wywoływania podprogramu do jakiej zmiennej
przypisuję jaką wartość.</span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH6RmFf36s5t1RuUFg1HE5BiSFa0W9BAK2oDcXS6nsOTO9ADHgTOSQ5EWsO0JxRgT9d537YHhZ3ex4Ke2oMZsr0TZI5ugNsPI3u49NbTT-RSuOaPc7XvtRj0fTuNDQs6UUyb_mQQxPHoPC/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH6RmFf36s5t1RuUFg1HE5BiSFa0W9BAK2oDcXS6nsOTO9ADHgTOSQ5EWsO0JxRgT9d537YHhZ3ex4Ke2oMZsr0TZI5ugNsPI3u49NbTT-RSuOaPc7XvtRj0fTuNDQs6UUyb_mQQxPHoPC/s1600/6.png" /></a></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="color: black;"><span style="font-family: Arial, sans-serif;"><span style="font-size: medium;"><br /></span></span></span></div>
</li>
</ol>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com2tag:blogger.com,1999:blog-341905815790009237.post-67337759759757282472013-12-27T04:22:00.000-08:002014-01-02T02:35:12.343-08:00Klauzula RETURNING w PL/SQL<div style="margin-bottom: 0in;">
<span style="font-family: Arial, sans-serif;"><span style="color: #cccccc; font-size: medium;">W
PL/SQL istnieje opcjonalna klauzula RETURNING INTO pozwalająca na
zapisanie do zmiennej wartości pochodzących z rekordu wstawianego
przez polecenie INSERT lub modyfikowanego przez UPDATE. Taka
możliwość staje się bardzo użyteczna, gdy zechcemy uzyskać ID
pochodzącego z sekwencji właśnie wstawionego rekordu, lub
generowanej dynamicznie innej wartości (np. jeśli wstawiamy
sysdate).</span></span></div>
<div style="margin-bottom: 0in;">
<span style="font-family: Arial, sans-serif;"><span style="color: #cccccc; font-size: medium;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6jM9-eCY20NM2EfMwDZMt0D5zPW_MAfQLh-1eakJgV8izw1FtPYOxTcTeskfWVtgeLLw4Jfjmt20ByHLdm4CKxWpqqK15FgQ-rq0Ea7fF7nwUo5JHmOSjf7m1F5GNmMYtsQ_JQoFy5NTs/s1600/1678.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="color: #cccccc;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6jM9-eCY20NM2EfMwDZMt0D5zPW_MAfQLh-1eakJgV8izw1FtPYOxTcTeskfWVtgeLLw4Jfjmt20ByHLdm4CKxWpqqK15FgQ-rq0Ea7fF7nwUo5JHmOSjf7m1F5GNmMYtsQ_JQoFy5NTs/s1600/1678.png" /></span></a></div>
<div style="margin-bottom: 0in;">
<span style="font-family: Arial, sans-serif;"><span style="color: #cccccc; font-size: medium;"><br /></span></span></div>
<div style="line-height: 0.19in; margin-bottom: 0in;">
<span style="font-family: Arial, sans-serif;"><span style="color: #cccccc; font-size: medium;">W
powyższym przykładzie wstawiłem nowy wiersz do tabeli jobs, a przy
pomocy klauzuli RETURNING INTO uzyskałem ID wstawionego wiersza.
Wartość ID została przypisana do zmiennej ID której typ został
zdeklarowany na podstawie typu kolumny job_id z tabeli jobs. Taka
możliwość nabiera ogromnego znaczenia, jeśli wartość wstawiana
do kolumny klucza głównego pochodzi z sekwencji, a mamy zamiar
operować na właśnie wstawionych danych. Oczywiście w takim
przypadku można by również zastosować odwołanie do currval
wykorzystywanej sekwencji, jednak nie mamy żadnej gwarancji, że w
międzyczasie ktoś inny nie skorzystał z tej samej sekwencji i nie
zmienił jej wartości.</span></span></div>
andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com1tag:blogger.com,1999:blog-341905815790009237.post-66374876525812938352013-12-21T04:16:00.000-08:002013-12-21T04:16:00.600-08:00Klauzula FOR UPDATEPrzy użyciu klauzuli FOR UPDATE możemy zablokować wiersze do
edycji przez inne sesje. Działa to na zasadzie transakcyjnej blokady
zasobów. Jeśli my wykonamy jakiś UPDATE lub DELETE, wiersze
których te polecenia zostaną zablokowane do czasu zatwierdzenia lub
wycofania transakcji. W tym czasie inne sesje usiłujące dokonać
jakiejkolwiek zmiany będą musiały oczekiwać na zwolnienie zasobów
przez nas. Najniższy poziom blokady to wiersz, tak więc nawet jeśli
zmienimy zawartość jednej kolumny, nikt nie będzie mógł zmienić
również pozostałych kolumn w tych wierszach.<br />
Klauzulę tę możemy wykorzystywać zarówno w SQL, jak i w
kursorach w PL/SQL. Przykład użycia w SQL:<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0NQjIv6vtbLm9r4Fgb_2Coz8vMNKa4bzkkaZFR0nIvrQFfchA9GF9MVcbl-ZR9o0qMLYCnSorIck4wAcqx5YtiZmTtGw5v2K72ViyS1SgZQsvBEK5dR0ACYmtmaTVN1qKEYZbqtX5zLx6/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0NQjIv6vtbLm9r4Fgb_2Coz8vMNKa4bzkkaZFR0nIvrQFfchA9GF9MVcbl-ZR9o0qMLYCnSorIck4wAcqx5YtiZmTtGw5v2K72ViyS1SgZQsvBEK5dR0ACYmtmaTVN1qKEYZbqtX5zLx6/s1600/1.png" /></a></div>
<br />
<br />
<br />
Wyświetlam 3 osoby z departamentu nr 90 , jednocześnie blokując
te wiersze do edycji przez inne sesje. Teraz z innej sesji usiłuję
te wiersze zmodyfikować:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNI82vCmidYQdUL2jMNnYWRSJ9o9Es_LAIpPo_n47dmSO2L5LAg6KM6nugEwzIbW4ynAJSk4XdbZ_kuTD2Be-Zaa9HAC1X0ePBPhhL3fFHrs0JwyMrWJ66sYrIrGBOcUwFwMyj8G11KD7N/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNI82vCmidYQdUL2jMNnYWRSJ9o9Es_LAIpPo_n47dmSO2L5LAg6KM6nugEwzIbW4ynAJSk4XdbZ_kuTD2Be-Zaa9HAC1X0ePBPhhL3fFHrs0JwyMrWJ66sYrIrGBOcUwFwMyj8G11KD7N/s1600/2.png" /></a></div>
<br />
<br />
Zauważ że modyfikuję inną kolumnę, niż te które
wyświetlałem z pierwszej sesji. Sesja czeka na zwolnienie zasobów.
Możemy teraz swobodnie dokonać zmian, bez obawy że ktoś inny w
międzyczasie dokona jakichś zmian na „naszych” wierszach.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPK6iXDSgKe6l-k2rlTUeUu1dD5mlvjQDoNgTyIbQIUtcTF8LGN8L1PeHEWTmf1BXf8pR6dYbOojkTSvs90_w0Tyv_qCTtEsN7w-pP9QTnZz8bn2cdbFkhVsPNC_r9Ku7Tmy8GVjoAGLcb/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPK6iXDSgKe6l-k2rlTUeUu1dD5mlvjQDoNgTyIbQIUtcTF8LGN8L1PeHEWTmf1BXf8pR6dYbOojkTSvs90_w0Tyv_qCTtEsN7w-pP9QTnZz8bn2cdbFkhVsPNC_r9Ku7Tmy8GVjoAGLcb/s1600/3.png" /></a></div>
<br />
Dopiero po wydaniu polecenia „COMMIT”, wiersze zostają
odblokowane i sesja która oczekiwała na odblokowanie zasobów może
dokonać zmian:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUfNDS4TdbSeVVXOYNE_XEIrKg7wgcBO_yBvA2HBjCENsheLrcxGDqz9w1zT8rm5au6Rqu_4iniZNcfvnibEtg_2GOj5qrqnlDifVO1ngAcPMEd_ZKSLxIlLD2aXE9ygQu3mIOktlho_ay/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUfNDS4TdbSeVVXOYNE_XEIrKg7wgcBO_yBvA2HBjCENsheLrcxGDqz9w1zT8rm5au6Rqu_4iniZNcfvnibEtg_2GOj5qrqnlDifVO1ngAcPMEd_ZKSLxIlLD2aXE9ygQu3mIOktlho_ay/s1600/4.png" /></a></div>
<br /><br />
<br />
Klauzulę FOR UPDATE możemy wykorzystywać również w PL/SQL w
kursorach. Samo zadeklarowanie kursora nie spowoduje jednak blokady
wierszy, jak się za chwilę przekonamy.
<br />
Uruchomiłem blok anonimowy z samą deklaracją kursora:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzHydUX1t-fiI8yz7G9w9sa1bg3XxLTT8-i-8XrRHvXb_NSJxsW50c8gAj8NBqqSg8x9YTldamOnqAGTrF38KaY0CXcJ6xymLdMcwHB1O0FdhU3j41TcBMQEQONcKDNpkbiJZAbVQmK2N3/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzHydUX1t-fiI8yz7G9w9sa1bg3XxLTT8-i-8XrRHvXb_NSJxsW50c8gAj8NBqqSg8x9YTldamOnqAGTrF38KaY0CXcJ6xymLdMcwHB1O0FdhU3j41TcBMQEQONcKDNpkbiJZAbVQmK2N3/s1600/5.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Aktualizacja z innej sesji przebiegła bez żadnych problemów:<br />
<br />
<br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmwV1ndIZbKSpRgoBIRVvEsxiuR0lhOyhVXlctVI63KCdz7EWm1KdW_1-DC2Uze50t8fuouZOGxZhhKIi9Jb08PM49NalFptVQy0mSxLO6ppsQYcWOkxLnJndwrMps80yzPMDWAhMYKKxD/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmwV1ndIZbKSpRgoBIRVvEsxiuR0lhOyhVXlctVI63KCdz7EWm1KdW_1-DC2Uze50t8fuouZOGxZhhKIi9Jb08PM49NalFptVQy0mSxLO6ppsQYcWOkxLnJndwrMps80yzPMDWAhMYKKxD/s1600/6.png" /></a></div>
<br /><br />
<br />
Aby wiersze zostały zablokowane , kursor trzeba przynajmniej
otworzyć:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZAkeRFUmoJIAvNP8BB9utJKEDLApx1ZxBmifENXLpmS2olr7dnx0DYzequHM83_a9aUdq9rfJCjmwhhyphenhyphen_9OZGLWahvI1at0uESTdCjwOQSUiLM241Q0nx5t7_ciQIO8f5YAvcgYTkx3Nh/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZAkeRFUmoJIAvNP8BB9utJKEDLApx1ZxBmifENXLpmS2olr7dnx0DYzequHM83_a9aUdq9rfJCjmwhhyphenhyphen_9OZGLWahvI1at0uESTdCjwOQSUiLM241Q0nx5t7_ciQIO8f5YAvcgYTkx3Nh/s1600/7.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Nie koniecznie musi to być otwarcie jawne, może być to również
automatyczne otwarcie kursora które
<br />
następuje w pętli kursorowej, tak jak to widać poniżej:<br />
<br />
<br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju2P1WznvfbxHHa5q14XNvu6OTaRjcyhOYGwhhqMtCRCck60XjKexPsw_LUiN273mTSS3nwF1ZvjvzvZcWxRFD3eYM3u6Udv3DOzZscro_3ks8KJqbWHaCU6bLbWXEPvscw0pullfgBJXC/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju2P1WznvfbxHHa5q14XNvu6OTaRjcyhOYGwhhqMtCRCck60XjKexPsw_LUiN273mTSS3nwF1ZvjvzvZcWxRFD3eYM3u6Udv3DOzZscro_3ks8KJqbWHaCU6bLbWXEPvscw0pullfgBJXC/s1600/8.png" /></a></div>
<br />
<br />
Z wykorzystaniem klauzuli for update wiąże się również
klauzula „WHERE CURRENT OF” która pozwala aktualizować lub
kasować wiersze zablokowane przez kursor.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4FiLmdIx4vJdht5GLnMkkgcOzEemShLOuPDl6IuO2CiQvpdFMO870A5H6MFqUutGEvUkaMs3s58r2zNCgWNbwDYOfLhAAI7bhgQdGIFc8RhhrQa4jC6vTay5QYI7qKjfqdHDhCgD_l1oD/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4FiLmdIx4vJdht5GLnMkkgcOzEemShLOuPDl6IuO2CiQvpdFMO870A5H6MFqUutGEvUkaMs3s58r2zNCgWNbwDYOfLhAAI7bhgQdGIFc8RhhrQa4jC6vTay5QYI7qKjfqdHDhCgD_l1oD/s1600/9.png" /></a></div>
<br />
<br />
Istotna uwaga: klauzula WHERE CURRENT OF odnosi się do wiersza
który właśnie został zfetchowany z kursora.
<br />
<br />
Niezależnie od ilości wierszy w kursorze, klauzula WHERE CURRENT
OF odnosi się do ostatnio pobranego z kursora wiersza. Poniżej
zastosowałem pętle kursorową, i jak widzimy zawsze ilość
zaktualizowanych wierszy wynosi 1.
<br />
<br />
<br /><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8q_xuiUOJa-fOLyb42AAE9HMpmH-r5kOsMVRMhcK4aeCvhRhA5vn1fnttJ7hGFlR3Fni21puvlLqtJS7ZJPJE1WDKaXul81aRm7g9hyphenhyphensZfusv8mwMnyd4A1MaIwtx3Hu23EswMWKs9ipi/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8q_xuiUOJa-fOLyb42AAE9HMpmH-r5kOsMVRMhcK4aeCvhRhA5vn1fnttJ7hGFlR3Fni21puvlLqtJS7ZJPJE1WDKaXul81aRm7g9hyphenhyphensZfusv8mwMnyd4A1MaIwtx3Hu23EswMWKs9ipi/s1600/10.png" /></a></div>
<br />
<br />
W przypadku próby wykorzystania klauzuli WHERE CURRENT OF bez
uprzedniego fetcha, dostajemy błąd :<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSLQASyDNc2p4J0xUSZs7rY_Ev-CaDIDmemQrbUAoe5hZ27VuXax0qKO4cXPCx1KKF25_Pke5f5X4p4Lth_esZgKVT5bz-zHYmLUU7v1yxMajTMAQze_4wVJCj7jp753WSnbE4ekeEcMMK/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSLQASyDNc2p4J0xUSZs7rY_Ev-CaDIDmemQrbUAoe5hZ27VuXax0qKO4cXPCx1KKF25_Pke5f5X4p4Lth_esZgKVT5bz-zHYmLUU7v1yxMajTMAQze_4wVJCj7jp753WSnbE4ekeEcMMK/s1600/11.png" /></a></div>
<br />
<br />
<br />andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com2tag:blogger.com,1999:blog-341905815790009237.post-43244309603667368512013-12-14T04:12:00.000-08:002013-12-14T04:12:00.119-08:00Funkcje deterministyczneNajpierw wyjaśnijmy, co to znaczy że funkcja jest lub nie jest
deterministyczna. Funkcja jest deterministyczna wtedy, kiedy dla
takich samych parametrów zwróci zawsze ten sam wynik. To oznacza,
że taka funkcja musi działać zawsze w ten sam sposób, a na wynik
nie powinny wpływać żadne czynniki zewnętrzne tj. funkcja nie
powinna korzystać z żadnych zmiennych pakietowych ani innych źródeł
zewnętrznych. Taka funkcja nie może też zmieniać żadnych danych
w bazie (w tabelach ani pakietach). W niektórych sytuacjach wymagane
jest by funkcja była deterministyczna. Przykładowo jeśli zechcemy
użyć własnej funkcji w indeksie funkcyjnym, to funkcja ta musi być
deterministyczna. Nie tylko spełniać warunek jako taki, ale też
musi to być jasno określone w treści funkcji.<br />
Poniżej przykład. Tworzę zwykłą funkcję, której już
konstrukcja jasno wskazuje że funkcja jest deterministyczna (wartość
parametru zawsze zostanie podzielona przez 12 i zaokrąglona do 2
miejsca po przecinku). Nie jest to jednak określone specjalną
klauzulą DETERMINISTIC.
<br />
Przy próbie wykorzystania takiej funkcji w indeksie funkcyjnym
dostajemy błąd
<br />
„ ORA-30553 The function is not deterministic”<br />
<br />
<br /><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSce3fRSb8gz6QRbF-Hf2WU5xS9smVDtJezt8pMLIS4jjS3QuPvhetpldYQYd_jLpAxFpqKh7qeg0U_Mezb5ixXMr_bovaiecMBmJJ5IndLlqC7A3lxeirVV5d3ZticuOuchRKdorvmWgJ/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSce3fRSb8gz6QRbF-Hf2WU5xS9smVDtJezt8pMLIS4jjS3QuPvhetpldYQYd_jLpAxFpqKh7qeg0U_Mezb5ixXMr_bovaiecMBmJJ5IndLlqC7A3lxeirVV5d3ZticuOuchRKdorvmWgJ/s1600/1.png" /></a></div>
<br />
<br />
Teraz dodaję klauzulę DETERMINISTIC (ponadto nic się nie
zmienia), i przebudowuję funkcję, a następnie ponownie próbuję
stworzyć indeks funkcyjny w oparciu o tę funkcję:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbmqagQixKINBELjXVeMzHN7zBIPruE_SIJpI8M9-VJniS6wDt-IQXvwR6rw8PYa0evaHSbZEOCLYMUj1V5bvuAUScF2C42R5kqKCYH9oTvAN2PV_PJsX5y3l20ebVCkeXaN1RGo9LCbYJ/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbmqagQixKINBELjXVeMzHN7zBIPruE_SIJpI8M9-VJniS6wDt-IQXvwR6rw8PYa0evaHSbZEOCLYMUj1V5bvuAUScF2C42R5kqKCYH9oTvAN2PV_PJsX5y3l20ebVCkeXaN1RGo9LCbYJ/s1600/2.png" /></a></div>
<br />
Tym razem obyło się bez problemów.andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com1tag:blogger.com,1999:blog-341905815790009237.post-38825484759477324682013-12-07T04:06:00.000-08:002013-12-07T04:06:00.136-08:00Pakiet DBMS_SQLPakiet DBMS_SQL możemy wykorzystywać alternatywnie do klauzuli
EXECUTE IMMEDIATE. Każdą z czynności : otwarcie kursora,
parsowanie zapytania, wykonanie zapytania i zamknięcie kursora
wykonujemy tutaj ręcznie i osobno. To ma swoje zady i walety. Z
jednej strony jest więcej pisania i ilość kodu gwałtownie
wzrasta. Z drugiej strony mamy większą kontrolę nad wszystkim co
się dzieje, kod jest nieco bardziej przejrzysty. Przeanalizujmy
teraz porównianie obu tych technik.
<br />
Użycie EXECUTE IMMEDIATE :<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYg5ByRbsCklGe_uMhxoRveS1o_svLW12qp8KAndRcfWPYO6JyFAMNaCOvqzhsnqhy_qFYSJycrn_HjlZ-4o1sROU-_a4Q9a1AoESkKFiqFLfAUMluizbFmeAD9jJugSN8m8M4M6Y4MeRb/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYg5ByRbsCklGe_uMhxoRveS1o_svLW12qp8KAndRcfWPYO6JyFAMNaCOvqzhsnqhy_qFYSJycrn_HjlZ-4o1sROU-_a4Q9a1AoESkKFiqFLfAUMluizbFmeAD9jJugSN8m8M4M6Y4MeRb/s1600/1.png" /></a></div>
<br /><br />
<br />
To samo z użyciem pakietu DBMS_SQL:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT1Iq1Hub40dcdYCK5Xj-L_DOLD1HVT5kkdU9X6__M_nu6lCsL3RHpLFqn6t0wNyESvhoXcgLj_kcZCnpt5Ubp4ox1GSq6FC7zXXi1-PWgM-mibgsLfDilvpnzDE81wyEPtwD1ODs1APH-/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT1Iq1Hub40dcdYCK5Xj-L_DOLD1HVT5kkdU9X6__M_nu6lCsL3RHpLFqn6t0wNyESvhoXcgLj_kcZCnpt5Ubp4ox1GSq6FC7zXXi1-PWgM-mibgsLfDilvpnzDE81wyEPtwD1ODs1APH-/s1600/2.png" /></a></div>
<br /><br />
<br />
W obu przypadkach musiałem konkatenować zapytanie, z tym że w
pierwszym wykonanie całości sprowadza się do polecenia EXECUTE
IMMEDIATE. W drugim mamy kilka innych poleceń, wywołań procedur i
funkcji z pakietu DBMS_SQL. Przeanalizujmy je po kolei.
<br />
<br /><br />
<br />
<b>dbms_sql.open_cursor</b><br />
To funkcja alokująca przestrzeń na
przetwarzanie kursora. Zwraca numeryczą referencję do kursora (taki
identyfikator, dzięki któremu wiadomo o który kursor chodzi).<br />
<br /><br />
<br />
<b>Dbms_sql.parse</b><br />
Procedura ta sprawdza poprawność
semantyczną zapytania (sprawdza czy wpisałeś zapytanie czy np.
„Suchą szosą szedł sobie Sasza” ). <u>W przypadku operacji DDL
procedura ta wykonuje polecenie</u>! W takim przypadku dzieje się to
już tutaj i polecenie execute nie jest obowiązkowe.<br />
Pierwszy parametr to identyfikator
kursora (uzyskany przy wywołaniu funkcji open_cursor), drugi to
zapytanie które będzie wykonywane, trzeci to wersja SQL. Można w
trzecim parametrze ustawić zgodność SQL z wersją np. 6.<br />
<br /><br />
<br />
<br /><br />
<br />
<br /><br />
<br />
<br /><br />
<br />
<b>dbms_sql.execute</b><br />
Funkcja wykonuje zapytanie. Jest
zbędna w przypadku operacji DDL. W przypadku operacji DML zwraca
ilość wierszy które uległy zmianie. W przypadku klauzuli EXECUTE
IMMEDIATE również moglibyśmy się dowiedzieć ilu wierszy
dotyczyła zmiana, ale musielibysmy dodatkowo użyć klauzuli
SQL%ROWCOUNT.<br />
<br /><br />
<br />
<b>dbms_sql.close</b><br />
Dealokuje przestrzeń w pamięci
operacyjnej wykorzystywaną na potrzeby przetwarzania kursora.<br />
<br /><br />
<br />
Możemy też wykorzystać zmienne
bindowane w obu przypadkach. Wersja z EXECUTE IMMEDIATE:<br />
<br /><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyCf1O4yJhQGx1v1DXNj4BLk2iDPM_IaBRdw3AKviTfA8If_LDNmlOtP3IZ0kZ-1hsny5_z_DzUSuDir4_v6S5k28Vjf9An8tpqWssx1V9lQe5I8ewyAGGA3tZEW81vCI9sdzypMVOk10p/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyCf1O4yJhQGx1v1DXNj4BLk2iDPM_IaBRdw3AKviTfA8If_LDNmlOtP3IZ0kZ-1hsny5_z_DzUSuDir4_v6S5k28Vjf9An8tpqWssx1V9lQe5I8ewyAGGA3tZEW81vCI9sdzypMVOk10p/s1600/3.png" /></a></div>
<br /><br />
<br />
Wersja z DBMS_SQL:
<br />
<br /><br />
<br />
declare<br />
dep integer:=90;<br />
mana integer:=100;<br />
podwyzka number:=400;<br />
cu_id integer;<br />
ile integer;<br />
begin<br />
cu_id:=dbms_sql.open_cursor;<br />
dbms_sql.parse(cu_id, 'update
employees set salary=salary+:p where department_id=:d and
manager_id=:m',dbms_sql.native);<br />
dbms_sql.bind_variable(cu_id,':p',podwyzka);<br />
dbms_sql.bind_variable(cu_id,':d',dep);<br />
dbms_sql.bind_variable(cu_id,':m',mana);<br />
ile:=dbms_sql.execute(cu_id);<br />
dbms_sql.close_cursor(cu_id);<br />
<br />
end;<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI6-A2FSLiASDmCIGwoBGWIfuu4ArsYeyIRq9lsaI45dymwUVYBr721iLl6hQ52gPvgCX-ZKhDkM2XWXpZkor1QWr-ElGnF1YOkDelVeUudaDE8vZmrd0pzlMj5JaXjTcvZmPgvnrs4Ryx/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI6-A2FSLiASDmCIGwoBGWIfuu4ArsYeyIRq9lsaI45dymwUVYBr721iLl6hQ52gPvgCX-ZKhDkM2XWXpZkor1QWr-ElGnF1YOkDelVeUudaDE8vZmrd0pzlMj5JaXjTcvZmPgvnrs4Ryx/s1600/4.png" /></a></div>
<br />
<br />
<br /><br />
<br />
To co się tutaj pojawiło nowego, to
wywołanie procedury bind_variable. Służy ona do podawania wartości
jakie mają trafić do zmiennych bindowanych. Pierwszy parametr to
identyfikator kursora, drugi zmienna bindowana użyta w zapytaniu,
trzeci wartość do wstawienia do tej zmiennej. W zasadzie w obu
przypadkach zamiast zmiennych dep,mana i podwyżka mógłbym użyć
równie dobrze wartości bezpośrednio.andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0tag:blogger.com,1999:blog-341905815790009237.post-42000418873336082952013-12-01T02:40:00.000-08:002013-12-01T02:40:00.529-08:00Wyrażenia regularne w Oracle (REGEXP)<h1 class="western">
Wyrażenia regularne</h1>
<h3 class="western">
Funkcje</h3>
<h3 class="western">
</h3>
Wyrażenia regularne pozwalają nam wynajdywać w tekście
fragmenty wg wzorców. Związane z regexp jest 5 funkcji:<br />
<br />
<br />
<h4 class="western">
REGEXP_COUNT
</h4>
funkcja dostępna od wersji 11g. Zwraca ilość wystąpień
elementów pasujących do wzorca. Poniższy przykład zwraca ilość
liczb występujących w tekście:<br />
<br /><br />
<br />
<span style="color: navy;"><b>select
regexp_count('fff4ff563fffff','[[:digit:]]')</b></span><br />
<span style="color: navy;"><b>from dual;</b></span><br />
<span style="color: navy;"><b><br /></b></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQX4vflY2lRl-Tia2NTCF_bolukqAg2EPEJk7RiP24d26yrvXhZeUucS42csKtR6Yc-VmoiglAUEEldOHNpFr-RnHcrej2f2-Mt6RtXTZ3OBJ_C5a5F7tzTguychAHWZikJ-NHuiEnW0r6/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQX4vflY2lRl-Tia2NTCF_bolukqAg2EPEJk7RiP24d26yrvXhZeUucS42csKtR6Yc-VmoiglAUEEldOHNpFr-RnHcrej2f2-Mt6RtXTZ3OBJ_C5a5F7tzTguychAHWZikJ-NHuiEnW0r6/s1600/1.png" /></a></div>
<br /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<h4 class="western">
REGEXP_REPLACE</h4>
<br /><br />
<br />
Funkcja zamienia elementy pasujące do wzorca na podany zamiennik.
Na poniższym przykładzie widzimy zamianę wszystkich cyfr na ciąg
XXX.<br />
<br /><br />
<br />
<span style="color: navy;"><b>select
regexp_replace('fff4ff563fffff','[[:digit:]]','XXX')</b></span><br />
<br />
<span style="color: navy;"><b>from dual;</b></span><br />
<span style="color: navy;"><b><br /></b></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF14kMg-xAfMzwPwfVAVNQz7oFg-zU4zbTlv1Umva0xFC69gFFHu_mrwqR1zRFGjVSDueEkyWE6Ss6CGYDvrcOMSpnHff_eRUTGbaIdFxY558Y-i7VR0BMVMNpDOfGIr4DpnvJpAc2vfPt/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF14kMg-xAfMzwPwfVAVNQz7oFg-zU4zbTlv1Umva0xFC69gFFHu_mrwqR1zRFGjVSDueEkyWE6Ss6CGYDvrcOMSpnHff_eRUTGbaIdFxY558Y-i7VR0BMVMNpDOfGIr4DpnvJpAc2vfPt/s1600/2.png" /></a></div>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<h4 class="western">
REGEXP_SUBSTR</h4>
Funkcja zwraca z podanego tekstu pierwszy element pasujący do
wzorca. Poniżej widzimy wycięcie pierwszego przynajmniej 3
elementowego zbioru cyfr z tekstu:<br />
<br /><br />
<span style="color: navy;"><b>select
regexp_substr('eeeeee23ee44445eee444445','[[:digit:]]{3,}')</b></span><br />
<br />
<span style="color: navy;"><b>from dual;</b></span><br />
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_AZ1ur9F7gumHFS6x8GnKOcr7EaHe5-s683XTwMoScuAr_iavx79OdY1QGNJ4nL53i7ALuuIQ_npijqdN1RGFBHOozQaRwbVgK1KoP8Fv6M2zRmM9yipW8a_0YMlf8srvE-z8fE-4T4Pz/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_AZ1ur9F7gumHFS6x8GnKOcr7EaHe5-s683XTwMoScuAr_iavx79OdY1QGNJ4nL53i7ALuuIQ_npijqdN1RGFBHOozQaRwbVgK1KoP8Fv6M2zRmM9yipW8a_0YMlf8srvE-z8fE-4T4Pz/s1600/3.png" /></a></div>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<h4 class="western">
REGEXP_INSTR</h4>
Funkcja zwraca pozycję ciągu tekstowego pasującego do wzorca.
Poniżej określenie pozycji elementu składającego się z
przynajmniej 4 cyfr:<br />
<br /><br />
<br />
<span style="color: navy;"><b>select
regexp_instr('eeeeee23ee44445eee444445','[[:digit:]]{4,}')</b></span><br />
<br />
<span style="color: navy;"><b>from dual;</b></span><br />
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfwtChE-n3Fsq7U964QyTsD9kKyEQgBf5wHwQ-5K9lgtskzKKdzJEhllsIZCVtBaS_uIr96Zp1ffA2n6mKwl0rmendP8v1TtE18yxfpGmA2_UArCeYW5CjOXItqNfNNEmryniKbtjUDs2j/s1600/4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfwtChE-n3Fsq7U964QyTsD9kKyEQgBf5wHwQ-5K9lgtskzKKdzJEhllsIZCVtBaS_uIr96Zp1ffA2n6mKwl0rmendP8v1TtE18yxfpGmA2_UArCeYW5CjOXItqNfNNEmryniKbtjUDs2j/s1600/4.png" /></a></div>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<h4 class="western">
<span style="color: black;">REGEXP_LIKE</span></h4>
Służy sprawdzaniu czy podany tekst pasuje do wzorca:<br />
<br /><br />
<br />
<span style="color: navy;"><b>select * from employees where </b></span>
<br />
<span style="color: navy;">
<b>regexp_like(phone_number,'[[:digit:]]{3}\.[[:digit:]]{2}\.[[:digit:]]{4}\.[[:digit:]]{6}');
</b></span>
<br />
<span style="color: navy;"><b><br /></b></span>
<span style="color: navy;"><b><br /></b></span>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgefztR9La5KgwZOViYkpGL8xVWC3owrJXnnD8HP05_J8jNU29sAUEnVkSWUpfWEDqZDtRMTG11WnrylqLXiOtgJPrVSzzpP0IPqFCrgWkU6-3NOLLh6JmRx72RWsrBSlJRSmuwM9MYM2dz/s1600/5.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgefztR9La5KgwZOViYkpGL8xVWC3owrJXnnD8HP05_J8jNU29sAUEnVkSWUpfWEDqZDtRMTG11WnrylqLXiOtgJPrVSzzpP0IPqFCrgWkU6-3NOLLh6JmRx72RWsrBSlJRSmuwM9MYM2dz/s1600/5.png" /></a><br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgefztR9La5KgwZOViYkpGL8xVWC3owrJXnnD8HP05_J8jNU29sAUEnVkSWUpfWEDqZDtRMTG11WnrylqLXiOtgJPrVSzzpP0IPqFCrgWkU6-3NOLLh6JmRx72RWsrBSlJRSmuwM9MYM2dz/s1600/5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgefztR9La5KgwZOViYkpGL8xVWC3owrJXnnD8HP05_J8jNU29sAUEnVkSWUpfWEDqZDtRMTG11WnrylqLXiOtgJPrVSzzpP0IPqFCrgWkU6-3NOLLh6JmRx72RWsrBSlJRSmuwM9MYM2dz/s1600/5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgefztR9La5KgwZOViYkpGL8xVWC3owrJXnnD8HP05_J8jNU29sAUEnVkSWUpfWEDqZDtRMTG11WnrylqLXiOtgJPrVSzzpP0IPqFCrgWkU6-3NOLLh6JmRx72RWsrBSlJRSmuwM9MYM2dz/s1600/5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a></div>
<h3 class="western">
Wzorce w wyrażeniach regularnych</h3>
<br /><br />
<br />
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="38*"></col>
<col width="218*"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="15%">
<div align="CENTER">
<b>.</b></div>
</td>
<td style="border: 1px solid #000000; padding: 0.1cm;" width="85%">
Dowolny znak<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>+</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Jeden lub więcej wystąpień<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>?</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Zero lub jedno wystąpienie<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>*</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Dowolna ilość wystąpień (w tym zero)<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>{3}</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Dokładnie trzy wystąpienia<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>{3,}</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Przynajmniej trzy wystąpienia<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>{3,6}</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Od trzech do sześciu wystąpień<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>|</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Lub<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>[[:digit:]]</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Cyfra<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>[[:alpha:]]</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Litera<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>[[:alnum:]]</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Znak alfanumeryczny<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="15%">
<div align="CENTER">
<b>\</b></div>
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="85%">
Wyłączenie znaku jako specjalnego. Np. jeśli zechcemy użyć
kropki jako w kontekście znaku tekstowego, a nie znaku
specjalnego oznaczającego dowolny znak<br />
</td>
</tr>
</tbody></table>
<br /><br />
<br />
<br /><br />
<br />
To oczywiście nie wszystkie możliwe wzorce, jest ich znacznie
więcej. Wzorce dotyczące ilości wystąpień dotyczą zawsze
poprzedzającego elementu. Kilka przykładów:<br />
<br /><br />
<br />
<table cellpadding="4" cellspacing="0" style="width: 100%px;">
<colgroup><col width="128*"></col>
<col width="128*"></col>
</colgroup><tbody>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: 1px solid #000000; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0.1cm;" width="50%">
'[[:digit:]]{4,}'
<br />
</td>
<td style="border: 1px solid #000000; padding: 0.1cm;" width="50%">
Przynajmniej 4 cyfry<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="50%">
([[:alnum:]]| |\.|-){8,14}<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="50%">
Ciąg składający się z od 8 do 14 elementów wśród których
mogą wystąpić dowolne litery i cyfry, spacje, kropki lub
myślniki<br />
</td>
</tr>
<tr valign="TOP">
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm; padding-top: 0cm;" width="50%">
[[:alnum:]]{1,}(\.[[:alnum:]]{1,})?@[[:alnum:]]{1,}\.[[:alpha:]]{2,4}<br />
</td>
<td style="border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; border-top: none; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm; padding-top: 0cm;" width="50%">
Przynajmniej jednoelementowy wyraz składający się z liter
lub cyfr, po którym może nastąpić ciąg rozpoczynający się
od kropki i składający się z przynajmniej jednej litery lub
cyfry, po których nastąpi znak @, po których nastąpi
przynajmniej jednoelementowy ciąg alfanumeryczny, po którym
nastąpi kropka i ciąg składający się z samych tylko liter o
całkowitej długości od 2 do 4 znaków. Czyli znajdziemy element
wyglądający jak adres email :)<br />
</td>
</tr>
</tbody></table>
<br />
<br /><br />
<br />
<br />
<span style="color: navy;"><b><br /></b></span>andrewhttp://www.blogger.com/profile/10069507480509251586noreply@blogger.com0