<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2927635047077701915</id><updated>2012-01-07T02:11:06.740+01:00</updated><category term='t-sql'/><category term='migráció'/><category term='politika'/><category term='diploma'/><category term='önálló labor'/><category term='Oracle BI fórum'/><category term='houg'/><category term='omwb'/><category term='bug'/><category term='antlr'/><category term='szekvencia'/><category term='stringtemplate'/><category term='pl/sql'/><category term='oracle szeminárium'/><category term='insert into...exec'/><category term='bitmap indexek'/><category term='visszatérési érték'/><category term='blogger dinner'/><category term='kulcsszavak'/><category term='dimenzionális modellezés'/><category term='sql server'/><category term='csillag séma'/><category term='oracle'/><category term='tranzakciók'/><title type='text'>Oracle Business Intelligence</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-7920835513747693407</id><published>2009-06-18T14:48:00.004+02:00</published><updated>2009-06-18T14:52:22.913+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='diploma'/><category scheme='http://www.blogger.com/atom/ns#' term='stringtemplate'/><category scheme='http://www.blogger.com/atom/ns#' term='antlr'/><title type='text'>Mérnök lettem</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ma megvolt a diploma védése, melynek során mérnökké nyilvánítottak. Juppi!&lt;br /&gt;&lt;br /&gt;Diplomamunkám &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/diploma.pdf"&gt;ezen&lt;/a&gt; a címen érhető el, a bizottság ötösre értékelte az elvégzett munkám, és így végeredményben a diplomám minősítése négyes lett. A védésen tartott prezentációm diái &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/vedes.pdf"&gt;itt&lt;/a&gt; vannak.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-7920835513747693407?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/7920835513747693407/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=7920835513747693407' title='7 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/7920835513747693407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/7920835513747693407'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/06/mernok-lettem.html' title='Mérnök lettem'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2052780964297390958</id><published>2009-05-24T17:57:00.003+02:00</published><updated>2009-05-24T18:02:11.151+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='diploma'/><category scheme='http://www.blogger.com/atom/ns#' term='stringtemplate'/><category scheme='http://www.blogger.com/atom/ns#' term='antlr'/><title type='text'>Fordító</title><content type='html'>&lt;div style="text-align: justify;"&gt;Rövid bejegyzés lesz, mostanában picit kevés a szabadidőm (diplomamunka, záróvizsgák):&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://jutas.eet.bme.hu/%7Ewirving/translator/testcases/"&gt;Fordító programom&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;A fenti linken pár screenshot látható a diplomamunka keretében implementált T-SQL - PL/SQL fordítóról. Amolyan proof-of-concept munka, ANTLR+StringTemplate segítségével. Ha leadtam a leadni valókat és befejeztem a befejezni valókat, majd írok egy összefoglalást, hogy mennyire &lt;span style="font-style: italic;"&gt;fényjézus&lt;/span&gt; ez az ANTLR.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2052780964297390958?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2052780964297390958/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2052780964297390958' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2052780964297390958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2052780964297390958'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/05/fordito.html' title='Fordító'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-7303561308656894099</id><published>2009-04-23T15:07:00.003+02:00</published><updated>2009-04-23T15:13:23.566+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='tranzakciók'/><title type='text'>Tranzakciókezelés és zárolás SQL Server és Oracle alatt</title><content type='html'>&lt;div style="text-align: justify;"&gt;Az SQL Server és az Oracle adatbáziskezelő tranzakció kezelése különbözik egymástól.&lt;br /&gt;&lt;br /&gt;Arról már írtam egy korábbi &lt;a href="http://orabusiness.blogspot.com/2008/10/migrci-iv.html"&gt;bejegyzésben&lt;/a&gt;, hogy egy tranzakció  SQL Server alatt (alapértelmezetten) explicit, azaz &lt;span style="font-family:courier new;"&gt;begin transaction … commit/rollback&lt;/span&gt; transaction utasítások jelölik az elejét illetve a végét, míg Oracle alatt az első végrehajtható SQL utasításkor kezdődik, és commit/rollback (vagy hiba, disconnect) hatására ér véget. Viszont nem ez az egyedüli különbség, a két rendszer a zárakat is eltérően kezeli.&lt;br /&gt;&lt;br /&gt;Az SQL Server a &lt;span style="font-family:courier new;"&gt;SELECT &lt;/span&gt;utasítás hatására egy shared zárat helyez a táblára, míg az Oracle semmilyet se. Gondoljuk végig, hogy ez mit jelent: egy &lt;span style="font-family:courier new;"&gt;SELECT &lt;/span&gt;tehát csak akkor tud lefutni SQL Server alatt, ha rá tud tenni egy shared zárat, azaz a táblán maximum shared zár van jelenleg (nincs exclusive lock). Ennek következtében a &lt;span style="font-family:courier new;"&gt;SELECT &lt;/span&gt;és az &lt;span style="font-family:courier new;"&gt;UPDATE &lt;/span&gt;utasítások fizikailag szerializáltan hajtódnak végre.&lt;br /&gt;&lt;br /&gt;Ezzel szemben Oracle alatt egy &lt;span style="font-family:courier new;"&gt;SELECT &lt;/span&gt;utasítást nem blokkolja semmi, és egy &lt;span style="font-family:courier new;"&gt;SELECT &lt;/span&gt;utasítás nem blokkol senkit (&lt;span style="font-family:courier new;"&gt;FOR UPDATE&lt;/span&gt; klauzula nélkül).&lt;br /&gt;&lt;br /&gt;Képzeljünk el egy olyan T-SQL tárolt eljárást, ami kiolvassa egy számla egyenlegét egy változóba, elszöszmötöl egy darabig, majd – ha van elég pénz az egyenlegen – csökkenti azt. Ennek az eljárásnak a kódja valahogy így nézhet ki:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;declare @balance money&lt;br /&gt;begin transaction&lt;br /&gt; select @balance = balance from tran_balance where userid=20&lt;br /&gt; -- some very serious calculation..&lt;br /&gt; if @balance &amp;gt; 1500&lt;br /&gt;     update tran_balance set balance=balance-1500 where userid=20&lt;br /&gt;commit transaction&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; Mi itt a hiba? Ez a kód bizonyos időzítés mellett helyesen működik SQL Server alatt, Oracle alatt viszont (alapértelmezett izolációs szinten) szinte sehogy se.&lt;br /&gt; Tegyük fel, hogy az alábbi ábrán látható módon indul el két tranzakció.&lt;br /&gt;&lt;pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_B53I7cvI5sc/SfBowwwlyjI/AAAAAAAAAFc/URhXHIbLZf8/s1600-h/tran1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 316px; height: 228px;" src="http://3.bp.blogspot.com/_B53I7cvI5sc/SfBowwwlyjI/AAAAAAAAAFc/URhXHIbLZf8/s320/tran1.png" alt="" id="BLOGGER_PHOTO_ID_5327873546111011378" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt; SQL Server alatt az alábbi lépések fognak történni:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A &lt;span style="font-family: courier new;"&gt;SELECT &lt;/span&gt;kirak egy shared lock-ot a táblára&lt;/li&gt;&lt;li&gt;Az &lt;span style="font-family: courier new;"&gt;UPDATE &lt;/span&gt;kirak egy exclusive lock-ot a táblára&lt;/li&gt;&lt;li&gt;Indulna a 2. tranzakció, de a &lt;span style="font-family: courier new;"&gt;SELECT &lt;/span&gt;nem tud shared lock-ot kirakni, mert a másik tranzakció exclusive lock-ja még érvényben van&lt;/li&gt;&lt;li&gt;Az első tranzakció lefut, végrehajtódik a &lt;span style="font-family: courier new;"&gt;COMMIT &lt;/span&gt;utasítás&lt;/li&gt;&lt;li&gt;Elindul a 2. tranzakcióban levő &lt;span style="font-family: courier new;"&gt;SELECT &lt;/span&gt;utasítás is, és az első tranzakció által véglegesített értéket olvassa ki.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ha az időzítésen variálunk egy picit, pl: feljebb „toljuk” a 2. tranzakció &lt;span style="font-family: courier new;"&gt;SELECT&lt;/span&gt;-jét az első tranzakció &lt;span style="font-family: courier new;"&gt;SELECT &lt;/span&gt;és &lt;span style="font-family: courier new;"&gt;UPDATE &lt;/span&gt;utasítása közé, akkor SQL Server-en is „nem várt” működést tapasztalhatunk (akkor nem várt, ha nem tudjuk, hogy működik :)):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;lefut az első &lt;span style="font-family: courier new;"&gt;SELECT&lt;/span&gt;&lt;/li&gt;&lt;li&gt;lefut a második tranzakció &lt;span style="font-family: courier new;"&gt;SELECT&lt;/span&gt;-je is, a shared lock miatt (a shared lock-ok egymással kompatibilisek)&lt;/li&gt;&lt;li&gt;lefut az első &lt;span style="font-family: courier new;"&gt;UPDATE&lt;/span&gt;&lt;/li&gt;&lt;li&gt;a második &lt;span style="font-family: courier new;"&gt;UPDATE &lt;/span&gt;blokkolódik, egészen addig, amíg az első tranzakció nem fejeződik be.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Mi a helyzet Oracle alatt? A &lt;span style="font-family: courier new;"&gt;SELECT &lt;/span&gt;utasítás mindkét (bármilyen) esetben le fog futni, kiolvasva az utolsó elcommitált értéket. A fenti példakód esetében tehát a konkurens tranzakciók lehet, hogy úgy terhelik be az egyenleget, hogy már nincs is rajta fedezet. Azaz, ha „ész nélkül” (automatikusan) fordítjuk át T-SQL kódjainkat PL/SQL-re, akkor a fenti „kicsit” rossz kódból &lt;span style="font-weight: bold;"&gt;nagyon rossz kódot kapunk&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ebben a példában két lehetőség van a javításra, Oracle oldalon. Az egyik a &lt;span style="font-family: courier new;"&gt;SERIALIZABLE&lt;/span&gt; izolációs szint használata: ezen a szinten levő tranzakciók ha egy olyan táblát szeretnének módosítani, amit egy másik – még el nem commitált – tranzakció már módosított, akkor hibát kapunk:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family: courier new;"&gt;Hiba a(z) 1. sorban:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ORA-08177: ehhez a tranzakcióhoz nem lehet sorbarendezni a hozzáférést&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ORA-06512: a(z) helyen a(z) 6. sornál&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt; A másik megoldás a &lt;span style="font-family: courier new;"&gt;LOCK TABLE&lt;/span&gt; használata: még mielőtt bármit is olvasnánk a táblából, rárakunk egy zárat. Ezzel elérhetjük az SQL Server-éhez hasonló működést, azzal a különbséggel, hogy nem a &lt;span style="font-family: courier new;"&gt;SELECT &lt;/span&gt;utasítás fog blokkolódni, hanem az előtte lévő &lt;span style="font-family: courier new;"&gt;LOCK TABLE&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-7303561308656894099?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/7303561308656894099/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=7303561308656894099' title='1 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/7303561308656894099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/7303561308656894099'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/04/tranzakciokezeles-es-zarolas-sql-server.html' title='Tranzakciókezelés és zárolás SQL Server és Oracle alatt'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_B53I7cvI5sc/SfBowwwlyjI/AAAAAAAAAFc/URhXHIbLZf8/s72-c/tran1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5594838777113389754</id><published>2009-04-20T08:16:00.003+02:00</published><updated>2009-04-20T08:48:55.647+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='houg'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>HOUG 2009</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_B53I7cvI5sc/SewUVyvWOUI/AAAAAAAAAFU/Hh9clF-87-k/s1600-h/houg_tn.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_B53I7cvI5sc/SewUVyvWOUI/AAAAAAAAAFU/Hh9clF-87-k/s200/houg_tn.JPG" alt="" id="BLOGGER_PHOTO_ID_5326654823902624066" border="0" /&gt;&lt;/a&gt;Idén először vettem részt a Magyarországi Oracle Felhasználók Konferenciáján, melyet április 6-9. között a siófoki Hotel Azúrban tartottak.&lt;br /&gt;&lt;br /&gt;Én szerda reggel érkeztem meg, kiváncsian vártam Kardkovács Zsolt és &lt;a href="http://eptentimes.blogspot.com"&gt;Éberhardt Péter&lt;/a&gt; előadását a &lt;span style="font-style: italic;"&gt;Közel valós idejű, adaptív műsorajánló digitális televíziózáshoz&lt;/span&gt; címmel, amikor is a terem előtt hallottam, hogy sajnos elmarad. Helyettük Sárecz Lajos (akinek a jóvoltából vehettem részt a konferencián) tartott előadást Real Application Testing témában.&lt;br /&gt;&lt;br /&gt;A szerdai nap további részét főleg az Üzleti intelligencia és az Adatbiztonság szekciók előadásain töltöttem, illetve befurakodtam Czinkóczki László - szokásosan - teltház előtt tartott SQL érdekességek, újdonságok előadására.&lt;br /&gt;&lt;br /&gt;Az előadásokat egy számomra rendkívül érdekes panelbeszélgetés zárta szintén adatbiztonság témában, ahol a meghívott vendégek Kirner Attila (PSZÁF), Jakab Péter (MKB Zrt.), Dr. Suba Ferenc (Magyar Kormány Informatikai Biztonsági Incidenskezelő Központ), Antal Lajos (PwC Kft.), Bártfai Attila (kancellár.hu Zrt.), Keleti Arthur (KFKI Zrt.) voltak.&lt;br /&gt;&lt;br /&gt;A beszélgetésről talán mindent elmond az, hogy az első kérdés megválaszolása, kivesézése 50 percig tartott.&lt;br /&gt;&lt;br /&gt;Az esti vacsorát látványos zenés programok, sör, beszélgetések színesítették, majd egy csocsó-"bajnokság" :)&lt;br /&gt;&lt;br /&gt;A csütörtöki nap számomra továbbra is BI + SQL/PLSQL témában telt, az adatbiztonság helyét Tóth Balázs kiváló Change Management a 11g Oracle adatbázisban előadása vette át.&lt;br /&gt;&lt;br /&gt;Én hasznosnak éreztem a konferenciát, csak néha tényleg a bőség zavarával kűzködtem: túl sok jó előadás volt :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5594838777113389754?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5594838777113389754/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5594838777113389754' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5594838777113389754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5594838777113389754'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/04/houg-2009.html' title='HOUG 2009'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_B53I7cvI5sc/SewUVyvWOUI/AAAAAAAAAFU/Hh9clF-87-k/s72-c/houg_tn.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-4824994030319892507</id><published>2009-04-19T14:03:00.003+02:00</published><updated>2009-04-19T14:07:19.510+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politika'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Oracle 4 prezident :)</title><content type='html'>A &lt;a href="http://vgo.hu/index.php?apps=cikk&amp;amp;cikk=269612"&gt;Világgazdaság Online&lt;/a&gt; arról számol be, hogy felmerült Füzes Péter, &lt;span class="lead"&gt; az Oracle Hungary ügyvezető igazgatójának neve lehetséges gazdasági miniszterként.&lt;br /&gt;&lt;br /&gt;Ennek alátámasztására azt írják, hogy a szakember együtt sportol Bajnai Gordon miniszterelnökkel. :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-4824994030319892507?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/4824994030319892507/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=4824994030319892507' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4824994030319892507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4824994030319892507'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/04/oracle-4-prezident.html' title='Oracle 4 prezident :)'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-117732705166157955</id><published>2009-04-02T12:59:00.003+02:00</published><updated>2009-04-02T13:07:02.059+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visszatérési érték'/><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='omwb'/><title type='text'>PLS-00990 és PLS-00989</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ez a két hibaüzenet kissé elkeserített, ugyanakkor megmagyarázza számomra, hogy az SQL Developer Migration Workbench miért több kurzor változó segítségével oldja meg az eredményhalmazok visszaadását a tárolt eljárásokból, és miért nem egy kurzor változókat tartalmazó tömb segítségével.&lt;br /&gt;&lt;br /&gt;A válasz egyszerű: mert nem lehet kurzor változókat tartalmazó tömböt készíteni:&lt;br /&gt;&lt;blockquote&gt;PLS-00990: Index Tables of Cursor Variables are disallowed&lt;br /&gt;PLS-00989: Cursor Variable in record, object, or collection is not supported by this release&lt;br /&gt;&lt;/blockquote&gt;A "this release" pedig az Oracle Database 11g Enterprise Edition Release 11.1.0.6.0. Pedig milyen jó ötletnek tűnt.. :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-117732705166157955?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/117732705166157955/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=117732705166157955' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/117732705166157955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/117732705166157955'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/04/pls-00990-es-pls-00989.html' title='PLS-00990 és PLS-00989'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-4254122483164704094</id><published>2009-03-31T08:13:00.002+02:00</published><updated>2009-03-31T08:21:37.654+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oracle szeminárium'/><title type='text'>Oracle Junior Professional Program</title><content type='html'>Tegnap éjszaka megérkezett a tájékoztató e-mail, miszerint:&lt;br /&gt;&lt;blockquote&gt;Örömmel értesítünk, hogy az előző félévben tett sikeres vizsgád eredményéül feltöltheted adataidat abba az adatbázisba, amelyből partnereink kiválasztják azokat, akiknek munkaszerződést ajánlanak és így részt vehetnek az intenzív nyári képzésen.&lt;/blockquote&gt;Végülis, ahhoz képest, hogy legkésőbb január végére ígérték a tájékoztatást, nem is olyan rossz.. :)&lt;br /&gt;&lt;br /&gt;Kicsit deja vu érzésem van, tavaly is voltam vizsgázni, tavaly is volt ilyen nyári program, tavaly is mehettem volna, de végül nem tettem, maradtam annál a cégnél, ahol már 2007 óta dolgozok, idén márciustól már teljes állásban.&lt;br /&gt;&lt;br /&gt;Hogy idén mi lesz, még nem tudom, viszont mivel június 8. a jelentkezési határidő, ezért még bőven van időm eldönteni. Majd meglátjuk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-4254122483164704094?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/4254122483164704094/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=4254122483164704094' title='2 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4254122483164704094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4254122483164704094'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/03/oracle-junior-professional-program.html' title='Oracle Junior Professional Program'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-1106726922456512722</id><published>2009-03-29T16:53:00.003+02:00</published><updated>2009-03-29T17:00:00.531+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diploma'/><category scheme='http://www.blogger.com/atom/ns#' term='antlr'/><title type='text'>Formális nyelvek és az ANTLR</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;u&gt;&lt;b&gt;A nyelv formális definíciója&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Jelölje ∑ a nyelv karakterkészletének véges halmazát. Ezt a halmazt nevezzük a nyelv alfabetájának.&lt;br /&gt;&lt;br /&gt;Legyen ∑* a ∑ alfabetából alkotott véges, de nem korlátos hosszúságú jelsorozatok halmaza. Nem üres ∑ halmaz esetén ∑* halmaz megszámlálhatóan végtelen számosságú.&lt;br /&gt;&lt;br /&gt;Egy adott alfabetából képezhető összes lehetséges jelsorozatba beletartozik az üres jelsorozat, az ε is.&lt;br /&gt;&lt;br /&gt;Valamely - egy adott ∑ alfabeta felett értelmezett - L nyelv a ∑* halmaz egy tetszőleges részhalmaza.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Fordítók&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Egy fordító általánosságban nem más, mint egy olyan program, ami valamilyen bemeneti jelsorozatra valamilyen kimeneti jelsorozattal válaszol. Bemeneti jelsorozat alatt nem akármilyen karaktereket, hanem a nyelv karakterkészletébe, alfabetájába tartozó karaktereket értünk. A bemeneti jelsorozatokat szokás még mondatoknak nevezni. Tehát a fordító egy L nyelvbe tartozó s mondatot valamilyen t mondatra képez le.&lt;br /&gt;&lt;br /&gt;A nyelveket formálisan nyelvtanok segítségével írhatjuk le. Nyelvtanok segítségével a nyelv mondatai levezethetőek, generálhatóak. A gyakorlatban a nyelvtanokat mégis arra használjuk, hogy eldöntsük, egy mondat eleme-e az adott nyelvnek.&lt;br /&gt;&lt;br /&gt;A nyelvtanokat egy négyes határozza meg:&lt;br /&gt;&lt;br /&gt; G = (N, ∑, P, S)&lt;br /&gt;&lt;br /&gt;ahol N a nyelvtani szimbólumok véges halmaza, ∑ a nyelv alfabetája, P a levezetési, vagy másnéven helyettesítési szabályok összessége, S pedig a mondatszimbólum.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Chomsky-féle nyelvosztályok&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;A nyelvtanokat meghatározó helyettesítési szabályok (vagy másnéven levezetési szabályok) bonyolultsága alapján Chomsky a nyelveket osztályokba sorolta.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;3-as nyelvosztály&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;A 3-as nyelvosztály nyelvtanaiban csak kétféle levezetési szabálytípus engedélyezett:&lt;br /&gt;&lt;br /&gt; A → a illetve A → aB&lt;br /&gt;&lt;br /&gt;ahol a nemterminális szimbólumokat nagy, a terminális szimbólumokat kis betűvel jelöljük.&lt;br /&gt;&lt;br /&gt;Az ilyen alakú nyelvtanokat reguláris (jobbreguláris) nyelvtanoknak nevezzük. Ezek a nyelvtanok generálják a reguláris nyelveket.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;2-es nyelvosztály&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;A 2-es nyelvosztály helyettesítési szabályainak alakja:&lt;br /&gt;&lt;br /&gt; A → α&lt;br /&gt;&lt;br /&gt;ahol α tetszőleges terminális és nemterminális szimbólumokat tartalmazható jelsorozat. Az ilyen alakú szabályokat úgy lehet értelmezni, hogy az A nemterminális szimbólum a környezetétől függetlenül bármikor helyettesíthető az α jelsorozattal. Ezért ezen nyelvosztály nyelveit környezetfüggetlen, Context Free (CF) nyelveknek nevezik.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;1-es nyelvosztály&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Az 1-es nyelvosztály helyettesítési szabályainak alakja:&lt;br /&gt;&lt;br /&gt;βAγ → βαγ&lt;br /&gt;&lt;br /&gt;azaz a A → α szabály csakis a β-γ környezetben alkalmazható. Ezért ezeket a nyelveket környezetfüggő, Context Sensitive (CS) nyelveknek nevezik.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;0-ás nyelvosztály&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;A 0-ás nyelvosztályban alkalmazható szabályokra nézve nincsen korlátozás.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;ANTLR nyelvtanok&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Az ANTLR számára megadhatunk nyelvtanokat, amik nem mások, mint szabályok halmazai. Ezekből a szabályokból az ANTLR egy rekurzív-leszálló (recursive-descent) elemzőt készít, ami az adott nyelv mondatait ismeri fel, azaz eldönti, hogy az adott mondat eleme-e a nyelvnek, a mondat követi-e a nyelvnek a nyelvtanban leírt szabályait.&lt;br /&gt;&lt;br /&gt;Például, az ANTLR jelölésrendszerét használva (ami nem más, mint az EBNF (Extended Backus-Naur Form) jelölésrendszer) egy C-szerű nyelv változódeklarációit leíró nyelvtan egy részlete így nézhet ki:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;variableDef&lt;br /&gt; : declaration SEMICOLON&lt;br /&gt; | declaration EQUALS expr SEMICOLON&lt;br /&gt; ;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ahol a ':' előtt álló rész egy nemterminális szimbólum, az utáni rész pedig nemterminális (kis kezdőbetűvel kezdődő) és terminális (nagy kezdőbetűvel kezdődő) szimbólumok halmaza. Ez a levezetési szabály két alternatívát tartalmaz: egy sima változó deklaráció, vagy deklaráció inicializációval. Az alternatívákat a '|' szimbólum választja el.&lt;br /&gt;&lt;br /&gt;Használva az előzőleg bevezetett formális jelölést, a fenti nyelvtan így néz ki:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; N: variableDef, declaration, expr&lt;/li&gt;&lt;li&gt; ∑: SEMICOLON (';'), EQUALS ('='), illetve egyéb, a fenti szabályban fel nem sorolt karakterek&lt;/li&gt;&lt;li&gt; P: a szabályok halmaza&lt;/li&gt;&lt;li&gt; S: a mondatszimbólum, ahonnan indul a levezetés. ANTLR-ben bármelyik nemterminális szimbólum lehet mondatszimbólum.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Az EBNF jelölésrendszer CF nyelvtanok leírását teszi lehetővé. Sajnos több nyelv nem illeszkedik a CF nyelvosztályba, egy adott kifejezés szintaktikai értelmezéséhez szükséges a kontextus ismerete. Például, C++ nyelvben a T(i) kifejezés kétféleképpen is értelmezhető: lehet függvényhívás, vagy típuskonverzió is, attól függően, hogy T függvény-e, vagy egy típus.&lt;br /&gt;&lt;br /&gt;Az ANTLR az ehhez hasonló problémákat úgynevezett predikátumok használatával oldja meg: szemantikus és szintaktikus predikátumokkal.&lt;br /&gt;&lt;br /&gt;A szemantikus predikátumok szemantikus megszorításokat fejeznek ki. Három esetet különböztethetünk meg. Az első az ellenőrző (validating) szemantikus predikátumok esete, melyek logikai kifejezések, amik kiértékelése futásidőben történik. Ha a kifejezés hamis, akkor az adott szabály használata meghiúsul (az elemző kivételt dob). A szintaxis a következő: &lt;span style="font-family: courier new;"&gt;{*kifejezés*}?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Például, ha maximum 4 számból álló sorozatot akarunk értelmezni, használhatjuk az alábbi szabályt:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;data: ( b+=BYTE )+ {$b.size()&lt;=4}? &lt;br /&gt; ; &lt;/pre&gt;&lt;br /&gt;ahol egy $b nevű listát építünk a BYTE terminális szimbólumokból, egészen addig, amíg a lista mérete kisebb vagy egyenlő mint 4.&lt;br /&gt;&lt;br /&gt;A második eset a "kapcsoló" (&lt;i&gt;gated&lt;/i&gt;) szemantikus predikátumok használata, amik egy szabályon belül egy alternatíva használatát kapcsolják ki-be. Ezek szintén logikai kifejezések, melyek kiértékelése futásidőben történik. Ha a kifejezés hamis, akkor az adott alternatíva az elemző számára láthatatlan. Ennek használatára remek példa lehet az SQL nyelv, ahol különböző utasításokkal lehet ki vagy bekapcsolni a nyelv egy adott kiegészítését. Ennek szintaxisa &lt;span style="font-family: courier new;"&gt;{*kifejezés*}?=&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A "maximum 4 elem illesztése" megszorítást kapcsoló predikátumokkal is megoldhatjuk:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;data&lt;br /&gt;@init {int n=1;}&lt;br /&gt; : ( {n&lt;=4}?=&gt; BYTE {n++;} )+&lt;br /&gt; ;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ahol az @init részben deklarálunk egy n nevű lokális változót deklarálunk. A BYTE alternatíva csak akkor látszódik, ha a kifejezés (n&lt;=4) értéke igaz.&lt;br /&gt;&lt;br /&gt;Az utolsó pedig a többértelműséget feloldó szemantikus predikátumok esete. A szintaxis megegyezik az ellenőrző predikátumok szintaxisával. A működésük is igen hasonló. A különbség mindösszesen annyi, hogy a többértelműséget feloldó predikátumok csak akkor jutnak szerephez, ha a szintaxis maga nem egyértelmű.&lt;br /&gt;&lt;br /&gt;Az ANTLR által generált LL(*) elemző (az LL(k) elemzők kiegészítése tetszőleges k értékkel) az alternatívák között egy véges automata (DFA) segítségével dönt. A többértelműséget feloldó predikátumok segítik a véges automatát a helyes döntés meghozatalában.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Felhasznált irodalom:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Bach Iván: Formális nyelvek (Typotex Kiadó, 2001)&lt;/li&gt;&lt;li&gt;Terence Parr: The Definitive ANTLR Reference: Building Domain-Specific Languages (Pragmatic Bookshelf, 2007)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-1106726922456512722?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/1106726922456512722/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=1106726922456512722' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1106726922456512722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1106726922456512722'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/03/formalis-nyelvek-es-az-antlr.html' title='Formális nyelvek és az ANTLR'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-8788501593260839886</id><published>2009-03-23T09:37:00.005+01:00</published><updated>2009-03-23T10:40:26.850+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='omwb'/><category scheme='http://www.blogger.com/atom/ns#' term='diploma'/><category scheme='http://www.blogger.com/atom/ns#' term='stringtemplate'/><category scheme='http://www.blogger.com/atom/ns#' term='antlr'/><title type='text'>ANTLR + StringTemplate</title><content type='html'>&lt;div style="text-align: justify;"&gt;A hétvégén tovább folytattam az ANTLR-el való ismerkedést. Az ANTLR egy parser-generátor, ami egy nyelvtan alapján generál egy rekurzív leszálló (&lt;span style="font-style: italic;"&gt;recursive descent&lt;/span&gt;) szintaktikai elemzőt.&lt;br /&gt;&lt;br /&gt;Egy elemző alapesetben nem csinál mást, minthogy eldönti, hogy egy adott mondat része-e a nyelvnek, szintaktikailag értelmes-e. Az ANTLR segítségével viszont könnyedén készíthetünk olyan nyelvtanokat, amikből a generált parser egy bemenő mondatból kimenetként egy &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;absztrakt szintaxis fát&lt;/a&gt; (AST) állít elő. Ezt a fát bejárva akár kiértékelhetjük a bemenetet (utasításokat), akár transzformációkat végezve átfordíthatjuk egy másik nyelvre.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.usfca.edu/%7Eparrt/"&gt;Terence Parr&lt;/a&gt; a &lt;a href="http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference"&gt;könyvében&lt;/a&gt; azt javasolja, hogy AST-k bejárásához is használjunk nyelvtanokat, pontosabban egy nyelvtan leírásából generált parsert, aminek a bemeneti mondatai az AST-k, kimenete meg mondjuk egy &lt;a href="http://www.stringtemplate.org/"&gt;StringTemplate&lt;/a&gt; sablon megfelelő kitöltése.&lt;br /&gt;&lt;br /&gt;Ezt a folyamatot szemlélteti - szintén Parr könyvéből származó - ábra:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jutas.eet.bme.hu/%7Ewirving/ANTLR/translation.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 527px; height: 193px;" src="http://jutas.eet.bme.hu/%7Ewirving/ANTLR/translation.png" alt="" border="0" /&gt;&lt;/a&gt;A Code Generation honlapján 2005-ben megjelent egy cikk, "&lt;a href="http://codegen.software-acumen.com/tiki-read_article.php?articleId=77"&gt;Language Translation Using ANTLR and StringTemplate&lt;/a&gt;" címmel, amiben Terence Parr bemutatja, hogyan lehet egy fordítót készíteni, ami egy C-szerű nyelvből Java, Python, vagy Java bytecode kódot állít elő. A példa nyelvtanok sajnos még az ANTLR 2-es verziójával készültek, amit azóta több szempontból is felülmúlt a legújabb, 3-as verzió. A hétvégén ezt alakítottam át, hogy működjön a 3-as verzióval, és először egy AST-t generáljon, majd az AST-t bejárva töltse ki a sablonokat.&lt;br /&gt;&lt;br /&gt;A nyelvtanok itt találhatóak:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://jutas.eet.bme.hu/%7Ewirving/ANTLR/CMinus.g"&gt;CMinus parser nyelvtan&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jutas.eet.bme.hu/%7Ewirving/ANTLR/CMinusTree.g"&gt;CMinusTree treewalker nyelvtan&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;A tesztelést megvalósító Java kód:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://jutas.eet.bme.hu/%7Ewirving/ANTLR/Test.java"&gt;Test.java&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Működése pedig:&lt;br /&gt;&lt;br /&gt;A teszt bemenet legyen a honlapon is fentlevő kódrészlet:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; char c;&lt;br /&gt; int x;&lt;br /&gt; int foo(int y, char d) {&lt;br /&gt;   int i;&lt;br /&gt;   for (i=0; i&amp;lt;3; i=i+1) {&lt;br /&gt;     x=3;&lt;br /&gt;     y=5;&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ezt Python-ra fordítva az alábbi kimenetet kapjuk:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;kelda@psycho:~/ANTLR/cminus$ cat input.txt | java Test&lt;br /&gt;(GLOBALS (VAR char c)) (GLOBALS (VAR int x)) (FUNCTIONS&lt;br /&gt;(FUNCTION int foo (PARAMS (PARAM int y) (PARAM char d))&lt;br /&gt;(BLOCK (LOCALS (VAR int i)) (STATEMENTS (FOR (INIT (= i&lt;br /&gt;0)) (COND (&amp;lt; i 3)) (STMT (= i (+ i 1))) (BLOCK LOCALS&lt;br /&gt;(STATEMENTS (= x 3) (= y 5))))))))&lt;br /&gt;&lt;br /&gt;def foo(y, d):&lt;br /&gt;  i = 0&lt;br /&gt;  while ( i &amp;lt; 3 ):&lt;br /&gt;      x = 3&lt;br /&gt;      y = 5&lt;br /&gt;      i = i + 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Az elején az AST látható (gyökér levél1 levél2 ... levéln) formában, utána pedig a kimenet.&lt;br /&gt;&lt;br /&gt;Ez a bejegyzés igazából nem akart másról szólni, minthogy illusztrálja az ANTLR és a StringTemplate erejét, a részletek bemutatása nélkül. Később részletesen is bemutatom majd a működését, a nyelvtanok felépítését, és hogy az egész hogyan is illeszkedik a blogomba :)&lt;br /&gt;&lt;br /&gt;Egy kis segítségként annyit elárulhatok, hogy az SQL Developer egyik könyvtárában van egy &lt;span style="font-style: italic;"&gt;oracle.sqldeveloper.migration.translation.sqlserver.jar&lt;/span&gt; file, aminek a belsejében található egy &lt;span style="font-style: italic;"&gt;generic.stg&lt;/span&gt; és egy &lt;span style="font-style: italic;"&gt;tsql.stg&lt;/span&gt; StringTemplate sablon. Azaz az SQL Developer Migration Workbench is az ANTLR és a StringTemplate segítségével végzi a nyelvi fordítást.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-8788501593260839886?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/8788501593260839886/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=8788501593260839886' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/8788501593260839886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/8788501593260839886'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/03/antlr-stringtemplate.html' title='ANTLR + StringTemplate'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-4583128951912858961</id><published>2009-03-16T18:49:00.004+01:00</published><updated>2009-03-16T19:13:06.111+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='omwb'/><category scheme='http://www.blogger.com/atom/ns#' term='diploma'/><title type='text'>Diplomaterv</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ebben a félévben főleg a diplomatervem elkészítésével fogok foglalkozni, melynek címe:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Adatbázis migráció Microsoft SQL Server adatbázisról Oracle adatbázis-kezelőre&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;azaz az előző féléves önálló labor témámat folytatom. A diplomaterv kiírásom pontjai:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Ismertesse az adatbázisok migrációinak általános problémáit a hazai és nemzetközi szakirodalom alapján!&lt;/li&gt;&lt;li&gt;Mutassa be a Microsoft SQL Server 2005 és Oracle 10g közötti migrációs eljárások és megoldások lehetőségeit és korlátait!&lt;/li&gt;&lt;li&gt;Készítsen funkcionális tervet a T-SQL nyelven írt üzleti logika szemantikailag helyes PL/SQL nyelvre fordítására a nyelvek kifejezőerejéből adódó korlátok között!&lt;/li&gt;&lt;li&gt;Implementálja és értékelje az elkészített rendszer egyes komponenseit, különös tekintettel&lt;/li&gt;&lt;ul&gt;&lt;li&gt;a PL/SQL kód olvashatóságára,&lt;/li&gt;&lt;li&gt;a PL/SQL kód szintaktikai helyességére,&lt;/li&gt;&lt;li&gt;a fordítási hibák jellegére és arányára.&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Az első pont egy kicsit trükkös, ugyanis eddig igen kevés releváns szakirodalmat sikerült találnom. Amit találtam, azok is főleg az adatok migrációjával foglalkozik. Ezek közül kiemelendő Erik Peter Bansleben &lt;a href="http://hdl.handle.net/1901/122"&gt;diplomamunkája&lt;/a&gt; az esettanulmány hasonlósága miatt:&lt;br /&gt;&lt;blockquote&gt;The source systems consisted of a combination of Microsoft SQL Server and Access databases, while the target platform was an Oracle 9i server which was to serve as the backend database for the new system.&lt;/blockquote&gt;Ha esetleg tud valaki a témába vágó irodalomról, megköszönném, ha jelezné akár hozzászólásban, akár e-mailben: orveny kukac gmail pont com. Nagy segítség lenne :)&lt;br /&gt;&lt;br /&gt;Az előző félévben gyakorlatilag a második ponttal foglalkoztam, így úgy érzem, ez nem fog különösebb kihívást jelenteni.&lt;br /&gt;&lt;br /&gt;Ami érdekesebb, az a 3. és 4. pont: gyakorlatilag egy Transact-SQL -&gt; PL/SQL fordítót kell készítenem. Szerencsére rátaláltam az ANTLR framework-re, aminek segítségével egy nyelvtanból viszonylag könnyedén lehet szintaktikus elemzőket, fordítókat készíteni.&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://antlr.org/"&gt;honlapján&lt;/a&gt; megtalálható &lt;a href="http://dermotoneill.blogspot.com/"&gt;Dermott O'Neill&lt;/a&gt;-től, az SQL Developer egyik fejlesztőjétől egy idézet:&lt;br /&gt;&lt;blockquote&gt;The decision to use Antlr and StringTemplate for Oracles next generation Migration and SQL Developer features was easy due to the fantastic support on the forums, extensive documentation and great tools. In particular, the ability to parse trees and define target languages using StringTemplate, provided the end to end language translation technology we required. Other parser generators left us high and dry with only half the solution.&lt;/blockquote&gt;Egyelőre még csak az irodalom feldolgozás fázisában tartok, de mindenesetre igen bíztató, hogy egy olyan eszköz használatát tanulom, amivel az SQL Developer Migration Workbench is működik :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-4583128951912858961?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/4583128951912858961/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=4583128951912858961' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4583128951912858961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4583128951912858961'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2009/03/diplomaterv.html' title='Diplomaterv'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-3807717574811332362</id><published>2008-12-12T19:06:00.005+01:00</published><updated>2008-12-12T19:42:01.858+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle szeminárium'/><category scheme='http://www.blogger.com/atom/ns#' term='önálló labor'/><category scheme='http://www.blogger.com/atom/ns#' term='dimenzionális modellezés'/><title type='text'>Összefoglalás</title><content type='html'>Ma este lezárult egy szakasz: teljesítettem az önálló laborokat. A dokumentumokat feltöltöttem a netre:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;8. félév: &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/dw.pdf"&gt;Adattárházak tervezése&lt;/a&gt;&lt;/li&gt;&lt;li&gt;9. félév: &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/migracio_doksi.pdf"&gt;Migráció&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Természetesen bármiféle hozzászólást, kritikát szívesen fogadok!&lt;br /&gt;&lt;br /&gt;A héten megérkezett az idei Oracle Szeminárium vizsga eredménye is: 74,15%-ot értem el. Bevallom, jobbra számítottam, de hát ez van.&lt;br /&gt;&lt;br /&gt;A blog írását folytatni fogom, az önálló labortól függetlenül is, és hát a diplomatervezés még hátra van..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-3807717574811332362?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/3807717574811332362/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=3807717574811332362' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/3807717574811332362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/3807717574811332362'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/12/sszefoglals.html' title='Összefoglalás'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5916877512272068908</id><published>2008-11-30T19:37:00.003+01:00</published><updated>2008-11-30T19:52:19.521+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle szeminárium'/><category scheme='http://www.blogger.com/atom/ns#' term='önálló labor'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle BI fórum'/><title type='text'>Mentegetőzések</title><content type='html'>&lt;div style="text-align: justify;"&gt;Több mint egy hónap telt el az utolsó blogbejegyzés óta. Ezt a hosszú szünetet nem üdüléssel töltöttem, hanem készült mindkét önálló labor doksim (migráció és adattárházak), meg persze egyéb házi feladatok, zh-k, előadások, munka, stb. Tehát csak a szokásos.&lt;br /&gt;&lt;br /&gt;Menjünk időrendben: részt vettem az Oracle BI Fórumán, ahol több igen érdekes, és pár kevésbé érdekes előadást hallgattam meg. Sajnos, amit leginkább vártam, az FHB adattárház megvalósításáról szóló előadás sikeredett szerintem a leggyengébbre. Az előadás témája nagyon jó volt, csak maguk az előadók lehettek volna picit "meggyőzőbbek". Nekem valahogy úgy jött le az egész, hogy vagy álmosak, vagy nem akarják elmondani a "tutit" :) Egy hónap távlatából összesen annyira emlékszek, hogy több rendszerrel egy időben történt az adatbázis bevezetése, kialakítása, és nagyon nagyon összetett és bonyolult és komplex.&lt;br /&gt;&lt;br /&gt;Az Essbase-es előadások viszont felkeltették a figyelmem. Szerintem majd "szabadidőmben" utána fogok olvasni, mi is az az essbase :)&lt;br /&gt;&lt;br /&gt;Készülnek az önálló labor dokumentumaim is. Pontosabban a migrációról szóló már &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/migracio_doksi.pdf"&gt;kész van&lt;/a&gt;, az adattárházak tervezéséről szóló pedig folyamatban van. Amint befejezem (abbahagyom?), felrakom azt is az internetre.&lt;br /&gt;&lt;br /&gt;Ezen a héten volt az &lt;a href="http://atria.aspnet.hu/EventDetail.aspx?EventID=7"&gt;Oracle Szeminárium&lt;/a&gt; záró eseménye: a vizsga. Szerintem nem volt nehéz, de a jellege miatt (teszt, több helyes válasz is lehet, rossz válasz mínusz pont) akár igen gyengén is sikerülhetett.. Mindenesetre várom az eredményt :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5916877512272068908?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5916877512272068908/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5916877512272068908' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5916877512272068908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5916877512272068908'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/11/mentegetzsek.html' title='Mentegetőzések'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5595329611581701544</id><published>2008-10-26T16:52:00.004+01:00</published><updated>2008-10-26T17:04:53.736+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger dinner'/><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><title type='text'>Oracle Blogger Dinner - 2008. ősz</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_B53I7cvI5sc/SQSULBIys8I/AAAAAAAAAFM/dQiWXFuDYz0/s1600-h/beer.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 133px; height: 200px;" src="http://1.bp.blogspot.com/_B53I7cvI5sc/SQSULBIys8I/AAAAAAAAAFM/dQiWXFuDYz0/s200/beer.jpg" alt="" id="BLOGGER_PHOTO_ID_5261493181680366530" border="0" /&gt;&lt;/a&gt;Holnap délután 17 órakor az Oracle irodaházban kerül megrendezésre a harmadik Oracle Blogger Dinner, ahol magyar bloggerek beszélgetnek, esznek, isznak, jót mulatnak, de elsősorban a migrációról szóló előadásomat hallgatják :)&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;A &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/migr_20081027.rar"&gt;slide-okat&lt;/a&gt; most is feltöltöttem a netre, a jelszó a szokásos (titok), a szokásos okból.&lt;br /&gt;&lt;br /&gt;Habár a téma nem a legegyszerűbb, és én is belemegyek majd technikai részletekbe, remélem a sok T-SQL és PL/SQL kód között azért majd lesz idő egy koccintásra is :) És nagyon remélem, hogy ezúttal látszódni fognak a screenshot-jaim a projektoron, nem úgy, mint az egyetemi önálló labor előadáson..&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5595329611581701544?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5595329611581701544/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5595329611581701544' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5595329611581701544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5595329611581701544'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/10/oracle-blogger-dinner-2008-sz.html' title='Oracle Blogger Dinner - 2008. ősz'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_B53I7cvI5sc/SQSULBIys8I/AAAAAAAAAFM/dQiWXFuDYz0/s72-c/beer.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-295202543722110390</id><published>2008-10-26T12:39:00.004+01:00</published><updated>2008-10-26T12:45:18.034+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><title type='text'>Migráció V.</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Oracle Relational Migration Maps&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Az &lt;a href="http://www.oracle.com/technology/tech/migration/maps/index.html"&gt;Oracle Relational Migration Maps&lt;/a&gt; (röviden: Migration Maps) az Oracle által használt módszertan egy meglévő adatbázis Oracle adatbáziskezelőre migrálásához.&lt;br /&gt;&lt;br /&gt;Nem tudom, hogy ez mennyire aktuális, ugyanis a honlapja jól láthatóan egy régebbi design-ba illeszkedik, viszont az &lt;a href="http://www.oracle.com/technology/tech/migration/index.html"&gt;OTN-ről&lt;/a&gt; jelenleg is elérhető, ezért én úgy veszem, hogy az ott leírtak még ma is tükrözik az Oracle álláspontját :) De igazából nem is a konkrét részletek az érdekesek, hanem az eddig leírt részletes technikai problémák és megoldási javaslatok helyett három lépést hátralépve madártávlatból is megnézzük egy migráció folyamatát.&lt;br /&gt;&lt;br /&gt;A folyamatban négy fő szerepkör lett definiálva:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ügyfél&lt;/li&gt;&lt;li&gt;Migrációs projekt menedzser&lt;/li&gt;&lt;li&gt;Adatbázis migrációs mérnök&lt;/li&gt;&lt;li&gt;Alkalmazás migrációs mérnök&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Az ügyfél feladata, hogy technikai segítséget nyújtson a migráció során az alkalmazással kapcsolatban felmerülő kérdésekben, ugyanis ebben a módszertanban a migrációt alapvetően az Oracle szakemberei végzik az ügyfél aktív közreműködésével. Ezen kívül a projekt elején ki kell tölteni egy úgynevezett &lt;a href="http://www.oracle.com/technology/tech/migration/maps/assessment_questionnaire.doc"&gt;Assessment Questionnaire-t&lt;/a&gt;, aminek célja az alapvető követelmények meghatározása, a szükséges erőforrások felbecsülése, a jelenlegi alkalmazás bemutatása. A kérdőívben olyan kérdések szerepelnek, mint például: &lt;span style="font-style: italic;"&gt;"What business problems does your application system so&lt;/span&gt;&lt;span style="font-style: italic;"&gt;lve?"&lt;/span&gt; vagy &lt;span style="font-style: italic;"&gt;"What is the timeframe for your current migration project?"&lt;/span&gt;. Talán a &lt;span style="font-style: italic;"&gt;"Select all of the technologies and languages used in your application system."&lt;/span&gt; kérdésre adható válaszlehetőségekből is látszik, hogy ezt a kérdőívet bizony nem ma írták, ugyanis a listában nem szerepel a C# .NET, sőt, a .NET egyedül ASP.NET kontextusban merül fel.&lt;br /&gt;&lt;br /&gt;Az általános kérdések közé becsempésztek pár igen komoly - technológiai különbségekre utaló - kérdést is, ezek:&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;"Does your database or application system require any precision past seconds in the DATETIME column?"&lt;/span&gt;: ez azért érdekes, mert az Oracle DATETIME adattípusa csak másodperc pontossággal képes az időt tárolni, míg SQL Serverben ez 3.33 ms.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;"Does your database or application system evaluat&lt;/span&gt;&lt;span style="font-style: italic;"&gt;e empty strings ('') and NULLs as the same?"&lt;/span&gt;: ugyanis Oracle alatt az üres string az NULL.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A kitöltött kérdőíven felül el kell küldenie az alkalmazás forráskódját is a migrációs projekt menedzsernek.&lt;br /&gt;&lt;br /&gt;Igazából ezek egyszerű igen/nem kérdéseknek tűnnek, de ha mondjuk nekem kéne megválaszolnom őket, nem tudom, hány napig tartana a helyes válasz kiderítése.. Persze, ha valakinek olyan rendszerrel van dolga, ahol a legutolsó kis részlet is végletekig dokumentálva van, akkor más a helyzet.&lt;br /&gt;&lt;br /&gt;A migrációs projekt menedzser áll a középpontban, ő biztosítja a magas minőségű munkát az Oracle részéről, illetve kezeli az ügyfél igényeit. Rajta keresztül zajlik a kommunikáció, ő tervezi meg a feladatokat, illetve azok időzítését. Magyarul ő a projekt menedzser, ennek minden feladatával és felelősségével együtt :)&lt;br /&gt;&lt;br /&gt;Az adatbázis migrációs mérnök az Oracle Migration Workbench segítségével (akkor, amikor ezt a módszertant készítették, a Migration Workbench még egy különálló alkalmazás volt, most már az SQL Developer-be integrálták) migrálja a forrás adatbázist, és teszteli, hogy valóban úgy működik, mint az eredeti verzió.&lt;br /&gt;&lt;br /&gt;Ehhez hasonlóan, az alkalmazás migrációs mérnök az alkalmazás megfelelő módosításaiért felelős.&lt;br /&gt;&lt;br /&gt;A migráció 6 fő lépésből áll, melyeket az alábbi ábra szemléltet:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_B53I7cvI5sc/SQRX3bIEDrI/AAAAAAAAAE8/QnWfDQuZA5Y/s1600-h/migr_phases.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 154px;" src="http://4.bp.blogspot.com/_B53I7cvI5sc/SQRX3bIEDrI/AAAAAAAAAE8/QnWfDQuZA5Y/s320/migr_phases.gif" alt="" id="BLOGGER_PHOTO_ID_5261426874361581234" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;Forrás: &lt;a href="http://www.oracle.com/technology/tech/migration/maps/index.html"&gt;http://www.oracle.com/technology/tech/migration/maps/index.html&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;A definíciós fázisban kell elvégezni a meglévő rendszer részletes vizsgálatát, felmérni a feladat komplexitását, hogy meg lehessen becsülni a migrációs feladatokat, azok időtartamát.&lt;br /&gt;&lt;br /&gt;Az analízis fázisban kezdődik az igazi munka. Egyeztetni kell az ügyféllel a definíciós fázisban felderített kérdéseket, problémákat, javaslatokat. Egy migráció során nem triviális, hogy az ügyfél mennyire ismeri a célrendszert, annak sajátosságait, a forrásrendszerrel szembeni különbségeit, ezért fontos feladat az oktatás. Az analízis fázisban kell meghatározni, hogy az ügyfélnek milyen témákban van szüksége oktatásra.&lt;br /&gt;&lt;br /&gt;Ezen felül szükséges még az adatbázis biztonsági, adminisztrációs követelményeinek illetve biztonsági mentések és visszaállítások stratégiájának vizsgálata.&lt;br /&gt;&lt;br /&gt;A tervezési fázis arról szól, hogy a definíciós és analízis fázis során szerzett ismeretek alapján megtervezzük a felmerült feladatok, problémák megoldását, azaz elkészítjük az oktatási tervet, a célrendszer hardver, hálózati és szoftver architektúráját, a felmerült architektúrális problémákra a megoldási terveket (például: ideiglenes táblák, séma-objektum nevekben történő változások, stb.), az adatok migrációjának a stratégiáját, átállási stratégiát, stb.&lt;br /&gt;&lt;br /&gt;A migrációs fázis célja, hogy tömör, megbízható script-ek és riportok álljanak az ügyfél rendelkezésére, amikből felépítheti a célrendszer alatt az adatbázis sémát. Ebben a fázisban történik a tesztelés is.&lt;br /&gt;&lt;br /&gt;Az átállás fázis - mint ahogy a nevéből is következik - az átállást hivatott megvalósítani, azaz a migrált rendszer feltelepítését, ügyfél általi tesztelését, adatkonverziót illetve élesbe állást.&lt;br /&gt;&lt;br /&gt;Az utolsó, üzemeltetési fázisban szükség lehet, hogy a már feltelepített, éles rendszerben kell támogatást nyújtani az ügyfélnek.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-295202543722110390?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/295202543722110390/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=295202543722110390' title='3 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/295202543722110390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/295202543722110390'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/10/migrci-v.html' title='Migráció V.'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_B53I7cvI5sc/SQRX3bIEDrI/AAAAAAAAAE8/QnWfDQuZA5Y/s72-c/migr_phases.gif' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-7056160999282796988</id><published>2008-10-25T16:43:00.004+02:00</published><updated>2008-10-26T12:55:46.491+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='omwb'/><category scheme='http://www.blogger.com/atom/ns#' term='tranzakciók'/><title type='text'>Migráció IV.</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Tranzakciókezelés&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Microsoft SQL Server 2000 alatt három féle módon lehet tranzakciót kezdeni:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;explicit módon: egy BEGIN TRANSACTION utasítás kiadásával&lt;/li&gt;&lt;li&gt;implicit módon: amennyiben a SET IMPLICIT_TRANSACTIONS ON utasítással bekapcsoltuk ezt a módot, akkor az ezt követő utasítás automatikusan egy tranzakciót fog nyitni. Amikor az befejeződik, akkor a következő utasítás egy új tranzakciót kezd, és így tovább.&lt;/li&gt;&lt;li&gt;autocommit: ez az alapértelmezett mód az SQL Server-ben: minden egyes T-SQL utasítás vagy véglegesítésre kerül (&lt;span style="font-style: italic;"&gt;commit&lt;/span&gt;), vagy visszagörgetődik (&lt;span style="font-style: italic;"&gt;rollback&lt;/span&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Explicit tranzakciók esetén a programozó határozza meg a tranzakció elejét és végét is, Transact-SQL scriptek esetén BEGIN TRANSACTION / COMMIT / ROLLBACK utasításokkal, ADO.NET esetén pedig az SqlConnection objektum BeginTransaction() illetve Commit() / Rollback() metódusaival.&lt;br /&gt;&lt;br /&gt;A BEGIN TRANSACTION utasítás 1-el növeli a @@TRANCOUNT változó értékét (alapesetben a változó 0), a COMMIT 1-el csökkenti, míg a ROLLBACK 0-ra állítja. Ez azért van így, mert SQL Server alatt úgy lehet tranzakciókat egymásba ágyazni, hogy a beágyazott tranzakciók esetében az adatbázis a COMMIT utasításokat figyelmen kívül hagyja, csak a legkülső COMMIT &lt;a href="http://msdn.microsoft.com/en-us/library/ms189336.aspx"&gt;után lesznek a módosítások véglegesítve&lt;/a&gt;. A ROLLBACK utasítás viszont minden aktív tranzakciót visszagörget.&lt;br /&gt;&lt;br /&gt;Ezzel szemben Oracle adatbáziskezelő alatt egy tranzakció az első végrehajtható SQL utasítással kezdődik, és vagy akkor ér véget, amikor explicit módon kiadunk egy COMMIT illetve ROLLBACK utasítást, vagy implicit módon, pl.: egy DDL utasítás végrehajtásával, vagy az adatbázisból történő kilépéskor (disconnect).&lt;br /&gt;&lt;br /&gt;Léteznek még úgynevezett autonóm tranzakciók (&lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/transact.htm#i7733"&gt;autonomous transactions&lt;/a&gt;), amik teljesen függetlenek a "hívó" tranzakciótól. Például, ha egy tárolt eljárás az AUTONOMOUS_TRANSACTION direktívával lett lefordítva, akkor, amikor meghívódik egy külső tranzakcióból, nem látja annak a még nem véglegesített adatait, illetve tőle függetlenül lesz véglegesítve vagy visszagörgetve. Ez például naplózást megvalósító eljárások esetén lehet hasznos.&lt;br /&gt;&lt;br /&gt;Az Oracle Migration Workbench a BEGIN TRANSACTION utasításokat a SET TRANSACTION READ WRITE utasítássá fordítja át, ami az aktuális tranzakciót úgy állítja át, hogy utasítás szintű konzisztenciát biztosítson (statement-level read consistency).&lt;br /&gt;&lt;br /&gt;Ez annyiban nem szerencsés, hogy míg a BEGIN TRANSACTION tetszőleges helyen szerepelhet egy T-SQL blokkban, addig Oracle alatt a tranzakció tulajdonságait csak az első utasításban lehet beállítani. Azaz például, ha egy INSERT szerepel a BEGIN TRANSACTION előtt (az explicit tranzakción kívül, alapértelmezetten autocommit módban), akkor ezt a Migration Workbench segítségével PL/SQL-re fordítva valami ilyesmit kapunk:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE OR REPLACE PROCEDURE sp_something&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   INSERT INTO proba&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     VALUES ( 1, SYSDATE );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   SET TRANSACTION READ WRITE;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   INSERT INTO proba&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     VALUES ( 2, SYSDATE );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   ROLLBACK;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;END;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ami - habár szintaktikailag helyes, azaz le fog fordulni - futáskor hibát fog adni:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ORA-01453: SET TRANSACTION must be first statement of transaction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gond van még a @@TRANCOUNT változóval is, mert a dokumentáció szerint hiába támogatja a Migration Workbench a globális változók migrációját, nekem összesen annyit sikerült elérnem, hogy a @@TRANCOUNT-ot v_transcount-ra cserélte. A &lt;a href="http://www.swissql.com/"&gt;SwisSQL&lt;/a&gt; (a Migration Workbench konkurrenciája) ezt a kérdést úgy oldja meg, hogy egy package-ben deklarál egy változót, amit minden egyes tranzakciókezelő utasításkor növel/csökkent, azaz BEGIN TRANSACTION helyett növeli eggyel, COMMIT után csökkenti eggyel, és ROLLBACK után pedig 0-ra állítja.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-7056160999282796988?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/7056160999282796988/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=7056160999282796988' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/7056160999282796988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/7056160999282796988'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/10/migrci-iv.html' title='Migráció IV.'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-279772538505695212</id><published>2008-10-15T18:36:00.003+02:00</published><updated>2008-10-15T18:44:22.520+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='önálló labor'/><title type='text'>Önálló labor beszámoló</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ma délután kértek fel arra, hogy holnap tartsak egy előadást az önálló labor témámról (migráció), mivel többen visszamondták a sajátjukat. Gyorsan összedobtam egy pár slide-ból álló &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/migr_20081016.rar"&gt;prezentációt&lt;/a&gt;, aztán majd lesz, ami lesz :) Elvégre benne vagyok a témában, tehát olyan nagy meglepetés nem érhet..&lt;br /&gt;&lt;br /&gt;A .rar archívumhoz a jelszó: titok, csak azért védtem így le, mert benne van az email-címem, aztán a csúnya spam-robotok nehogy megszeressenek.&lt;br /&gt;&lt;br /&gt;Október 27-én egy Oracle Blogger Dinner keretén belül egy másik előadást is fogok tartani, szintén migráció témában, de az picit nagyobb lélegzetvételű lesz: kb. 1 óra a mostani 10-15 perc helyett. Ha elkészül majd - terveim szerint a jövő heti hosszú hétvége alatt - akkor azt is közzé fogom tenni.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-279772538505695212?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/279772538505695212/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=279772538505695212' title='2 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/279772538505695212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/279772538505695212'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/10/nll-labor-beszmol.html' title='Önálló labor beszámoló'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5339293684582260143</id><published>2008-10-13T18:20:00.004+02:00</published><updated>2008-10-13T18:31:37.991+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle BI fórum'/><title type='text'>Oracle Business Intelligence Fórum</title><content type='html'>&lt;div style="text-align: justify;"&gt;November 6-án, csütörtökön 9 órától lesz az &lt;a href="http://www.oracle.com/webapps/events/EventsDetail.jsp?p_eventId=81758&amp;amp;src=6652299&amp;amp;src=6652299&amp;amp;Act=36"&gt;Oracle Business Intelligence Fóruma&lt;/a&gt;, ahol bemutatják az Oracle üzleti intelligencia és adattárház megoldását, annak újdonságait és terveit.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Előzetes napirend:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;9:00-9:30: Regisztráció&lt;/li&gt;&lt;li&gt;09:30–10:00: Az Oracle üzleti intelligencia és adattárház megoldástérképe&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Joerg Fuchslueger, regionális üzletfejlesztési igazgató - Oracle&lt;/span&gt;&lt;/li&gt;&lt;li&gt;10:00–10:30: Adatbiztonság, skálázhatóság az adattárházban, adattárház újdonságok&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Sárecz Lajos - Oracle , Radnai Szabolcs - Oracle&lt;/span&gt;&lt;/li&gt;&lt;li&gt;10:30–10:50: Banki adattárház megoldás a gyakorlatban&lt;/li&gt;&lt;li&gt;10:50–11:10: HP Oracle Database Machine és Oracle Exadata Storage Server&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Győr Ferenc – Hewlett Packard, Radnai Szabolcs – Oracle&lt;/span&gt;&lt;/li&gt;&lt;li&gt;11:10–11:30: Szünet&lt;/li&gt;&lt;li&gt;11:30–12:00: Oracle BI csomagok és BI Alkalmazások&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Fekete Zoltán - Oracle&lt;/span&gt;&lt;/li&gt;&lt;li&gt;12:00–12:30: Hangbányászati alkalmazás és az Oracle Business Intelligence&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Bódogh Attila – Nextent&lt;/span&gt;&lt;/li&gt;&lt;li&gt;12:30–13:00: Oracle Essbase – kézenfekvő megoldás a kontrolling számára&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Oliver Gratzl – Oracle&lt;/span&gt;&lt;/li&gt;&lt;li&gt;13:00–13:30: A KSH új generációs adattárháza Oracle Essbase alapokon&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Antoni S. Soma – KSH , Szente István DSS&lt;/span&gt;&lt;/li&gt;&lt;li&gt;13:30: Beszélgetés, Ebéd &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;A rendezvény ingyenes, regisztrációhoz kötött. Én megpróbálok ott lenni, mindenesetre már regisztráltam :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5339293684582260143?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5339293684582260143/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5339293684582260143' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5339293684582260143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5339293684582260143'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/10/oracle-business-intelligence-frum.html' title='Oracle Business Intelligence Fórum'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-3131642196354886090</id><published>2008-10-12T16:39:00.006+02:00</published><updated>2008-10-13T09:58:34.592+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitmap indexek'/><category scheme='http://www.blogger.com/atom/ns#' term='dimenzionális modellezés'/><category scheme='http://www.blogger.com/atom/ns#' term='csillag séma'/><title type='text'>Dimenzionális modellezés - bitmap indexek</title><content type='html'>&lt;div style="text-align: justify;"&gt;Az előző dimenzionális modellezésről szóló &lt;a href="http://orabusiness.blogspot.com/2008/08/dimenzionlis-modellezs-csillag-sma.html"&gt;bejegyzésben megemlítettem&lt;/a&gt;, hogy a csillag sémának az egyik előnye a jó lekérdezési teljesítmény. Akkor ezt hagytam lógni a levegőben, nem indokoltam meg, hogy miért. Ez a bejegyzés viszont arról szólna, hogy csillag séma esetén milyen technikák léteznek a lekérdezések optimalizálására.&lt;br /&gt;&lt;br /&gt;Az indexek a lekérdezésekben szereplő szelekciós feltételek kiértékelésénél használatosak (pl.: WHERE T.A = 1000). Általános esetben egy lekérdezés végrehajtási ideje az indexek feldolgozásának és az adatok kinyerésének ideje. Ha egy lekérdezés eredményhalmazának mérete jelentős a tábla teljes méretéhez viszonyítva, akkor az adatelérés ideje megközelítheti egy teljes "&lt;span style="font-style: italic;"&gt;table scan&lt;/span&gt;" (amikor a tábla minden során egyesével végigmegyünk) idejét. Ilyen esetekben az indexek használata épphogy lassítaná a lekérdezést.&lt;br /&gt;&lt;br /&gt;Erre a problémára az egyik elterjedt megoldás az ún. bitmap indexek, vagy magyarra fordítva bittérképes indexek használata. Bitmap indexekből is többféle létezik, a család legegyszerűbb tagja az egyszerű bitmap indexek (&lt;span style="font-style: italic;"&gt;simple bitmap indexes&lt;/span&gt;). Például, ha az indexelni kívánt attribútum a nemek (ami tipikusan két értéket vehet fel: Férfi, Nő), akkor az index egy két bitből álló vektor lenne, az egyik bit a férfiak esetén lenne 1-es, a másik pedig nők esetében:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;gender='M'     gender='F'&lt;br /&gt;&lt;br /&gt;cust_id 70     0    1&lt;br /&gt;cust_id 80     0    1&lt;br /&gt;cust_id 90     1    0&lt;br /&gt;cust_id 100    0    1&lt;br /&gt;cust_id 110    0    1&lt;br /&gt;cust_id 120    1    0&lt;br /&gt;cust_id 130    1    0&lt;br /&gt;cust_id 140    1    0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A fenti táblázat minden sora az Ügyfél (Customer) tábla egyik rekordjához tartozik. Az egyszerű bitmap indexek mérete az indexelendő attribútum kardinalitásának és a tábla méretének lineáris függvénye, és az index feldolgozás ideje az index méretének lineáris függvénye. Emiatt rögtön látszódik az egyszerű bitmap indexek egyik hátrányos tulajdonsága: ha az indexelendő attribútum sokféle értéket vehet fel, akkor a táblázat igen ritka lesz (sparsity problem), egy sorhoz tipikusan csak egy darab 1-es fog tartozni, a többi bit értéke 0 lesz. Ez pedig nem nevezhető hatékony tárhely-kihasználásnak. Erre megoldás lehet a bittérképek tömörítése (pl.: futáshossz kódolással), de így elveszítenénk a bitmap indexek egy igen kellemes tulajdonságát: ha több feltétel egyszerre történő teljesülését akarjuk vizsgálni, akkor a bittérképek adott oszlopainak logikai ÉS kapcsolatát kell csak kiszámolnunk:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        gender='M'  region='central'&lt;br /&gt;&lt;br /&gt;cust_id 70     0          1           0&lt;br /&gt;cust_id 80     1          1           1&lt;br /&gt;cust_id 90     1    AND   0    =      0&lt;br /&gt;cust_id 100    0          0           0&lt;br /&gt;cust_id 110    1          1           1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;azaz a 80-as és a 110-es ügyfél tartozik a központi régióban levő férfiak közé. &lt;a href="http://www.dvs.tu-darmstadt.de/staff/wu/"&gt;Ming-Chuan Wu&lt;/a&gt; a Query Optimization for Selections using Bitmaps című munkájában két olyan bitmap indexet is javasol, amik megőrzik a fent bemutatott előnyöket és mégis hatékonyabb tárhelykihasználtságot tesznek lehetővé.&lt;br /&gt;&lt;br /&gt;&lt;u style="font-weight: bold;"&gt;Bit-sliced indexing&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Az első az ún. bit-sliced indexelés (ezt inkább nem próbálom meg magyarra fordítani, úgyis csak valami zagyvaság lenne belőle:) ). Egy attribútum bit-sliced indexe az attribútum értékének bitenkénti leképezése. Például, ha egy A attribútum egy 16-bites egész szám, és értékei 100 és 900 közötti értékeket vehetnek fel, akkor a hozzá tartozó index így nézhet ki:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;A        b15...b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0&lt;br /&gt;201         0...0    0  0  1  1  0  0  1  0  0  1&lt;br /&gt;100         0...0    0  0  0  1  1  0  0  1  0  0&lt;br /&gt;900         0...0    1  1  1  0  0  0  0  1  0  0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A bitvektorok száma megegyezik az attribútum típusának méretével, a vektorok hossza pedig az indexelt tábla kardinalitásával.&lt;br /&gt;&lt;br /&gt;Egy bit-sliced indexnek nem feltétlen kell bináris alapúnak lennie, elképzelhető például decimális alapú bit-sliced index is. Az előző példában szereplő A attribútum tizes alapú indexe három komponensből állna, a helyiértékeknek megfelelően.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;A     b9 b8 b7 b6 b5 b4 b3 b2 b1 b0    b9 b8 b7 b6 b5 b4 b3 b2 b1 b0    b9 b8 b7 b6 b5 b4 b3 b2 b1 b0&lt;br /&gt;124     0  0  0  0  0  0  0  0  1  0     0  0  0  0  0  0  0  1  0  0     0  0  0  0  0  1  0  0  0  0&lt;br /&gt;      harmadik komponens                  második komponens               első komponens&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ilyen típusú indexek esetén a kiválasztás a megfelelő bitvektorok kiolvasásával és össze-ÉS-eléssükkel történik. Például az A=124 szűrőfeltétel esetén a b1 b2 b4 vektorokat olvassuk ki rendre a harmadik, második illetve első komponensekből, és logikai ÉS kapcsolatba hozzuk őket. Az eredmény pedig azon sorokat tartalmazza, ahol az A értéke 124.&lt;br /&gt;&lt;br /&gt;Az alap kiválasztása a tárhelykövetelményeket és a feldolgozási sebességet befolyásolja. A fenti példában a bináris alapú index 16 bitvektorból áll, míg a tizes alapú 30-ból. Egy szűrő feltétel kiértékelése (pl.: A=124) bináris alapon 16 bitvektor végigpásztázását jelenti, decimális alapon viszont csak háromét.&lt;br /&gt;&lt;br /&gt;&lt;u style="font-weight: bold;"&gt;Encoded Bitmap Indexing&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Egy másik bitmap indexelést kódolt bitmap indexelésnek neveznek (encoded bitmap indexing, EBI). Az EBI az attribútum értelmezési tartományát leképezi egy kódoló függvény segítségével, és a kódolt értékeken felépít egy bináris alapú bit-sliced bittérképet. A bináris alap és kódolás segítségével hatékony tárhelykihasználtságot tesz lehetővé, ugyanakkor viszont megtartja a lekérdezés-optimalizálás lehetőségét jóldefiniált kódolás segítségével (well-defined encoding). Például, ha egy B attribútum értelmezési tartománya {a, b, c, d, e, f, t, u, v, w}, akkor egy M függvényt az alábbi módon definiálhatunk:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;B      M(B)&lt;br /&gt;void    0000&lt;br /&gt;NULL    0001&lt;br /&gt;a      0010&lt;br /&gt;b      0011&lt;br /&gt;c      0100&lt;br /&gt;d      0101&lt;br /&gt;e      0110&lt;br /&gt;f      0111&lt;br /&gt;t      1000&lt;br /&gt;u      1001&lt;br /&gt;v      1010&lt;br /&gt;w      1011&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;a void az adatbázisból törölt, a NULL pedig a NULL értékeket reprezentálja. A fenti táblázathoz tartozó minterm-ek:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;f_void=/b3/b2/b1/b0    f_b = /b3/b2b1b0&lt;br /&gt;f_null=/b3/b2/b1b0     f_c = /b3b2/b1/b0&lt;br /&gt;f_a   =/b3/b2b1/b0     f_d = /b3b2/b1b0&lt;br /&gt;&lt;br /&gt;f_e = /b3b2b1/b0       f_u = b3/b2/b1b0&lt;br /&gt;f_f = /b3b2b1b0        f_v = b3/b2b1/b0&lt;br /&gt;f_t = b3/b2/b1/b0      f_w = b3/b2b1b0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;EBI segítségével egy szűrés az alábbi módon hajtható végre:&lt;br /&gt;szűrőfeltétel: B eleme {a, b, e, f}&lt;br /&gt;Ezekhez az elemekhez tartozó minterm-ek egy Boole függvényt alkotnak: f_a + f_b + f_e + f_f, amit tovább lehet egyszerűsíteni /b3b1-re. Azaz, azon értékek elégítik ki a szűrőfeltételt, amik b3 bitjét negálva majd b1 bitjükhöz ÉS-elve 1-et kapunk.&lt;br /&gt;&lt;br /&gt;Az EBI valójában nem más, mint egy bináris alapú bit-sliced bitmap index egy attribútum kódolt értelmezési tartományán. Az EBI-knek két előnyük van a bit-sliced indexek felett:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a bitvektorok száma nem több, mint a bit-sliced esetében, hiszen a szükséges bitvektorok száma az adott attribútum számosságának kettes alapú logaritmusa (+2 a törölt és NULL értékek miatt, és ennek a felsőegészrésze).&lt;/li&gt;&lt;li&gt;EBI esetében több optimalizálási lehetőség van "megfelelő" kódoló függvény kiválasztása esetén. Ilyen függvényeket Wu: &lt;a href="http://www.dvs.tu-darmstadt.de/staff/wu/ieee_ebi.html"&gt;Encoded Bitmap Indexing for Data Warehouses&lt;/a&gt; című írásában mutat be.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;u style="font-weight: bold;"&gt;Csillag transzformáció bitmap indexekkel&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Ezen kitekintő után térjünk vissza a csillag sémánkhoz. Például, egy szokásos értékesítési adatokat tartalmazó "sales" tény-tábla esetén dimenziók lehetnek: idő, ügyfél, termék, értékesítési csatorna.&lt;br /&gt;&lt;br /&gt;Tekintsük az alábbi lekérdezést:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SELECT ch.channel_class, c.cust_city, t.calendar_quarter_desc,&lt;br /&gt;SUM(s.amount_sold) sales_amount&lt;br /&gt;FROM sales s, times t, customers c, channels ch&lt;br /&gt;WHERE s.time_id = t.time_id&lt;br /&gt;AND   s.cust_id = c.cust_id&lt;br /&gt;AND   s.channel_id = ch.channel_id&lt;br /&gt;AND   c.cust_state_province = 'CA'&lt;br /&gt;AND   ch.channel_desc in ('Internet','Catalog')&lt;br /&gt;AND   t.calendar_quarter_desc IN ('1999-Q1','1999-Q2')&lt;br /&gt;GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Oracle adatbáziskezelő alatt a csillag transzformáció feltétele, hogy minden illesztéshez használt oszlopon definiálva legyen egy bitmap index, ebben az esetben cust_id, time_id, channel_id. A lekérdezést két menetben hajtja végre az adatbáziskezelő motor. Az alábbi lekérdezés végrehajtásával csak azokat a sorokat gyűjti ki a tény táblából, amik valóban szükségesek:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SELECT ... FROM sales&lt;br /&gt;WHERE time_id IN&lt;br /&gt;(SELECT time_id FROM times&lt;br /&gt;WHERE calendar_quarter_desc IN('1999-Q1','1999-Q2'))&lt;br /&gt;AND cust_id IN&lt;br /&gt;(SELECT cust_id FROM customers WHERE cust_state_province='CA')&lt;br /&gt;AND channel_id IN&lt;br /&gt;(SELECT channel_id FROM channels WHERE channel_desc IN('Internet','Catalog'));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ebben a lekérdezésben a tény táblán a time_id-re definiált bitmap index segítségével kiválasztjuk azokat a sorokat, amik 1999. első negyedévére vonatkoznak. Ez valójában annyit jelent, hogy azokat a sorokat választjuk ki, amiknél a bittérképben az 1999-Q1 bit értéke 1-es értékű. Hasonlóan történik a második negyedév adatainak kiválasztása. A kettő bitenkénti VAGY kapcsolatba hozásával kapjuk meg a kívánt időszakot.&lt;br /&gt;&lt;br /&gt;Ugyanilyen módon történik az ügyfelekre és értékesítési csatornákra történő szűrőfeltételek kiértékelése. A kapott három bittérképet majd logikai ÉS kapcsolatba hozva csupán azon sorok esetén kapunk 1-es értéket, amik az összes feltételt kielégítik.&lt;br /&gt;&lt;br /&gt;A második lépésben történik meg a tény tábla kiválasztott sorainak a dimenzió táblákhoz történő illesztése. Mivel a dimenzió táblák relatíve kis méretűek a tény táblákhoz viszonyítva, az Oracle általában teljes "table scan"-t használ az elérésükhöz.&lt;br /&gt;&lt;br /&gt;Források:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Wu, Ming-Chuan: &lt;a href="http://www.dvs1.informatik.tu-darmstadt.de/staff/wu/query.a4.ps.gz"&gt;Query Optimization for Selections using Bitmaps (1999)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28313/schemas.htm#CIHGHEFB"&gt;&lt;span style="font-family:courier new;"&gt;Oracle® Database Data Warehousing Guide 11g Release 1 (11.1) Part Number B28313-02: Optimizing Star Queries&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-3131642196354886090?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/3131642196354886090/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=3131642196354886090' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/3131642196354886090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/3131642196354886090'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/10/dimenzionlis-modellezs-bitmap-indexek.html' title='Dimenzionális modellezés - bitmap indexek'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-4308222951177383765</id><published>2008-10-11T18:08:00.002+02:00</published><updated>2008-10-11T18:15:48.144+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visszatérési érték'/><category scheme='http://www.blogger.com/atom/ns#' term='t-sql'/><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='pl/sql'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Migráció III.</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Visszatérési értékek&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A visszatérési értékek okozzák a legizgalmasabb problémákat a migráció során. SQL Server alatt egy tárolt eljárás háromféle módon képes adatokat visszaadni a hívója felé:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;kimenő paraméterekkel: &lt;span style="font-family:courier new;"&gt;CREATE PROCED&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;URE sp_demo (@something int OUT)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;visszatérési értékkel: &lt;span style="font-family:courier new;"&gt;return @someValue&lt;/span&gt;&lt;/li&gt;&lt;li&gt;úgynevezett eredményhalmazokkal (&lt;span style="font-style: italic;"&gt;result set&lt;/span&gt;-ekkel): egy T-SQL tárolt eljárás képes visszaadni egy tetszőleges &lt;span style="font-family:courier new;"&gt;SELECT &lt;/span&gt;utasítás által visszaadott eredményhalmazt&lt;/li&gt;&lt;/ul&gt;Kimenő paraméterekből és visszaadott eredményhalmazokból - ha jól tudom - tetszőleges számú lehet, persze elképzelhető, hogy van valami igen magas felső korlát.&lt;br /&gt;&lt;br /&gt;Egy példa ezen módok bemutatására:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    CREATE PROCEDURE sp_demo (@something int out)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      set @something = 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      select 7&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      return 9&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Az eljárást futtatva az alábbi eredményt kapjuk:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_B53I7cvI5sc/SPDP4BYIL7I/AAAAAAAAAEs/JKpam37lV_w/s1600-h/returnval.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_B53I7cvI5sc/SPDP4BYIL7I/AAAAAAAAAEs/JKpam37lV_w/s320/returnval.png" alt="" id="BLOGGER_PHOTO_ID_5255929326490628018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Az első eredményhalmazt a tárolt eljárás adta vissza (&lt;span style="font-family:courier new;"&gt;SELECT 7&lt;/span&gt;), a második pedig az @i, @j változók tartalmát mutatja.&lt;br /&gt;&lt;br /&gt;Mint azt már egy korábbi, migrációról szóló &lt;a href="http://orabusiness.blogspot.com/2008/09/migrci-i.html"&gt;bejegyzésben írtam&lt;/a&gt;, a migráció egyik célja az lenne, hogy a .NET-es vastag kliens lényegében kizárólag tárolt eljárás hívásokkal kommunikál az adatbázissal. Mind a módosító, mind a lekérdező funkciókat tárolt eljárások valósítják meg: az eljárás által visszaadott eredményhalmazt a kliens valahogy feldolgozza (pl.: megjeleníti táblázatos formában). De természetesen vannak olyan eljárások is, amik nem adnak vissza semmit sem, hanem csak az adatbázisban módosítanak valamit.&lt;br /&gt;&lt;br /&gt;Oracle adatbáziskezelő alatt viszont egy tárolt eljárás csak kimenő paraméterekkel képes adatokat visszaadni. Nincs sem visszatérési érték, sem eredményhalmaz. Eredményhalmazokat kurzor referenciákkal (&lt;a href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/static.htm#i7106"&gt;REF CURSOR&lt;/a&gt;) lehet emulálni. Az Oracle Migration Workbench is ezt a módszert követi: ha egy T-SQL tárolt eljárás eredményhalmazokat adna vissza, azt úgy fordítja át PL/SQL-re, hogy felvesz annyi darab kurzor referencia kimenő paramétert, ahány eredményhalmazt az eljárás visszaad. Például, a fenti sp_demo eljárás PL/SQL-es változata így nézne ki:&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;CREATE OR REPLACE FUNCTION sp_demo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      v_something OUT NUMBER,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      cv_1 IN OUT SYS_REFCURSOR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    RETURN NUMBER&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       v_something := 5;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       OPEN cv_1 FOR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          SELECT 7&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            FROM DUAL ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       RETURN 9;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    END;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hoppá! Az OMWB függvényt csinált az eljárásunkból! Ez azért van, mert visszatérési értéke csak és kizárólag függvényeknek lehet PL/SQL-ben. Viszont egy függvény és egy tárolt eljárás között számos lényegi különbség van, amik miatt nem szerencsés csak úgy egyikből a másikat csinálni. Egy függvény &lt;a href="http://ora-14551.ora-code.com/"&gt;nem végezhet&lt;/a&gt; adatmódosító (DML) utasításokat SQL utasításokban. Csupán azért alakította a migráló eszköz függvénnyé, mert csak azoknak lehet visszatérési értéke.&lt;br /&gt;&lt;br /&gt;Tehát annyit már most is kijelenthetünk, hogy ha vannak olyan T-SQL tárolt eljárásaink, amiknek van visszatérési értékük, akkor célszerű elgondolkozni azon, hogy hogyan alakítsuk át őket. Például felvehetünk kimenő paramétereket, vagy, ha eddig valójában függvényként használtuk az eljárást, akkor alakítsuk is át függvénnyé.&lt;br /&gt;&lt;br /&gt;Az eredményhalmazok kérdése viszont trükkösebb. Ugyanis a kimenő paramétereket az eljárás hívásakor explicit fel kell venni. Ha egy eljárás hív egy másikat, akkor a hívó eljárásban is deklarálni kell egy kurzor változót, amit paraméterül adunk a másik eljárásnak. Ha viszont .NET alól szeretnénk ilyen eljárásokat meghívni, akkor a paraméterlistába kell felvenni a kimenő kurzor típusú paramétert:&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;cmd.Parameters.Add("cv_1", OracleType.Cursor).Direction =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                        ParameterDirection.Output;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ha ezt elmulasztjuk, akkor a hívás exception-t fog dobni, PLS-00306 hibaüzenettel: &lt;span style="font-style: italic;"&gt;"wrong number or types of arguments in call to '*spname*'"&lt;/span&gt;. Ugyanez igaz fordítva is, azaz ha olyan eljárásnál próbálnánk hozzáadni, aminek valójában nincs ilyen paramétere.&lt;br /&gt;&lt;br /&gt;És ezzel eljutottunk egy igen kemény problémához: a migráció célja ugye az, hogy ugyanaz a kliens legyen használható SQL Server és Oracle adatbáziskezelő esetén is. SQL Servernek nem kell explicit megmondani, hogy a tárolt eljárás fog-e visszaadni eredményhalmazt, Oracle-nek viszont igen. Egy T-SQL tárolt eljárás tetszőleges számú eredményhalmazt is visszaadhat, egy PL/SQL-es viszont pontosan annyit, ahány kimenő kurzor változó paramétere van.&lt;br /&gt;&lt;br /&gt;Mivel a migráció során úgyis hozzá kell nyúlni minden egyes tárolt eljárás kódjához (ha másért nem, akkor azért, hogy megnézzük, úgy működik-e, ahogy szeretnénk), ezért arra a kompromisszumos megoldásra jutottunk, hogy:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  minden tárolt eljárásnak kötelezően van egy &lt;span style="font-family:courier new;"&gt;cv_1&lt;/span&gt; nevű kimenő paramétere, a paraméterlista első helyén, attól függetlenül, hogy visszaad-e eredményhalmazt, vagy sem&lt;/li&gt;&lt;li&gt;  azon tárolt eljárások esetében, amik több eredményhalmazt is visszaadnának, újragondoljuk a funkciójukat, és szükség esetén feldaraboljuk több eljárássá, azaz eljárásonként pontosan egy visszaadott eredményhalmaz.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Az eljárások egymást is hívják, ezért a kódot ilyen esetekben is módosítani kell. Mit nyerünk ezzel? Azt, hogy a kliens kód megtarthatja az univerzális jellegét, és nem kell kliens oldalon is minden egyes eljáráshíváshoz hozzányúlni. (Pl.: ott is megmondhatnánk explicit módon, hogy a hívott eljárás vissza fog-e adni eredményhalmazt, vagy sem, és ennek hatására SQL Server esetén nem történne semmi, Oracle esetén viszont felkerülne a paraméterlistába a kimenő kurzor változó.)&lt;br /&gt;&lt;br /&gt;Az MSDN-en szerepel egy viszonylag részletes &lt;a href="http://msdn.microsoft.com/en-us/library/ms971506.aspx"&gt;leírás&lt;/a&gt; arról, hogy hogyan kell .NET alatt PL/SQL tárolt eljárásokat hívni, illetve érdekes olvasmány még Vadim Tropashko kurzorokról szóló &lt;a href="http://vadimtropashko.wordpress.com/cursors/"&gt;blogbejegyzése&lt;/a&gt;. Ennek a cikknek a végén szerepel egy kemény kijelentés:&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;It seem that the genesis of “a better cursor demand” is a stream of programmers from SQL Server world, where a procedure which doesn’t even bother to declare its outputs as a cursor like this&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family: courier new;"&gt;CREATE OR REPLACE PROCEDURE TESTSPROC2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   select * from test_table order by id_no;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;   GO&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-family: arial;"&gt;Its a pity that TSQL designers give an impression of not understanding the difference between a procedure and a query.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hát, ez kicsit úgy hangzik, mintha az Oracle megoldása lenne az egyetlen járható út.&lt;br /&gt;&lt;br /&gt;Készítettem egy buta kis Windows-os alkalmazást, ami azt próbálja demonstrálni, hogy a kliens oldalon milyen változtatások szükségesek ha SQL Server helyett Oracle adatbáziskezelőt akarunk használni. Az egyedüli különbség (a használt osztályokat leszámítva) a kurzor paraméter deklarációja. A kód letölthető &lt;a href="http://wirving.beats.hu/demo_app.zip"&gt;innen&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-4308222951177383765?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/4308222951177383765/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=4308222951177383765' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4308222951177383765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4308222951177383765'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/10/migrci-iii.html' title='Migráció III.'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_B53I7cvI5sc/SPDP4BYIL7I/AAAAAAAAAEs/JKpam37lV_w/s72-c/returnval.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-1871671674084517151</id><published>2008-09-21T16:30:00.003+02:00</published><updated>2008-09-21T16:38:54.150+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='kulcsszavak'/><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='omwb'/><category scheme='http://www.blogger.com/atom/ns#' term='szekvencia'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Migráció II.</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Identity/Szekvencia&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Microsoft SQL Server alatt az automatikus azonosító generálásra az IDENTITY típusú oszlopok szolgálnak. A típus megadására a CREATE TABLE illetve ALTER TABLE utasításokkal van lehetőség:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;    &lt;span style="font-family:courier new;"&gt;CREATE TABLE new_employees&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     id_num int IDENTITY(&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;seed&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;,&lt;/span&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;increment&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     fname varchar (20),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     minit char(1),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     lname varchar(30)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Forrás: &lt;a href="http://msdn.microsoft.com/en-us/library/aa933196%28SQL.80%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa933196(SQL.80).aspx&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;ahol a seed a legelső táblába beszúrt értéket, az increment pedig a növekményt jelöli. Az IDENTITY típusú oszlopokhoz kapcsolódnak a &lt;a href="http://msdn.microsoft.com/en-us/library/ms187342.aspx"&gt;@@IDENTITY&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/ms175098.aspx"&gt;IDENT_CURRENT()&lt;/a&gt; illetve &lt;a href="http://msdn.microsoft.com/en-us/library/ms190315.aspx"&gt;SCOPE_IDENTITY()&lt;/a&gt; függvények. Az IDENT_CURRENT() egy adott táblára mondja meg, hogy mi volt az utolsó IDENTITY érték, a SCOPE_IDENTITY az adott hatáskörben teszi meg ugyanezt, az @@IDENTITY pedig hatáskörtől függetlenül a legutolsó értéket adja vissza. A hatáskör lehet tárolt eljárás, trigger, függvény vagy batch.&lt;br /&gt;&lt;br /&gt;Például ha van két tábla IDENTITY mezőkkel, T1 és T2, és a T1-be történő beszúrás hatására lefut egy trigger, ami a T2 táblába szúr be egy sort, akkor az INSERT utáni @@IDENTITY és SCOPE_IDENTITY() más értékeket fog visszaadni: az @@IDENTITY a legutolsó beszúrás eredményét, tehát a T2-be beszúrt identity értéket, a SCOPE_IDENTITY() pedig a T1-be beszúrtat.&lt;br /&gt;&lt;br /&gt;Oracle alatt az IDENTITY oszlopok helyett &lt;a href="http://68.142.116.68/docs/cd/B28359_01/server.111/b28286/pseudocolumns002.htm"&gt;szekvenciák&lt;/a&gt; vannak. A szekvenciák önálló séma objektumok, amik automatikusan generálnak egyedi értékeket. Az IDENTITY-hez hasonló működést szekvenciák és triggerek segítségével lehet elérni. Erről &lt;a href="http://bblog.notice.hu/"&gt;Pém Gábor&lt;/a&gt;  is írt egy &lt;a href="http://bblog.notice.hu/?postid=19"&gt;bejegyzést&lt;/a&gt;  a blogjában. Viszont az @@IDENTITY, SCOPE_IDENTITY(), IDENT_CURRENT() függvényekkel ekvivalens nincs Oracle alatt, ezeket a szekvenciákhoz tartozó CURRVAL, NEXTVAL pszeudo-oszlopokkal lehet emulálni.&lt;br /&gt;&lt;br /&gt;Az SQL Developer Migration Workbenchje az IDENTITY oszlopokat úgy fordítja át, hogy meggenerálja a hozzájuk tartozó triggereket és szekvenciákat, valamint beállítja az sqlserver_utilities PL/SQL package identity nevű változóját, amivel a @@IDENTITY működését próbálja szimulálni. Ha a T-SQL kódban használjuk a SCOPE_IDENTITY() vagy az IDENT_CURRENT() függvényeket, akkor minden esetben manuálisan kell átírni a logikát PL/SQL-re.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Azonosító nevek, fenntartott kulcsszavak&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A kulcsszavak és fenntartott szavak (&lt;a href="http://68.142.116.68/docs/cd/B28359_01/appdev.111/b31231/appb.htm#CJHIIICD"&gt;keywords and reserved words&lt;/a&gt;) problémájáról már írtam egy &lt;a href="http://orabusiness.blogspot.com/2008/08/kulcsszavak-mint-oszlopnevek-oracle.html"&gt;bejegyzést&lt;/a&gt;, amit valahogy úgy lehetne összefoglalni, hogy ne használj kulcs- és fenntartott szavakat adatbázis objektumok nevekként.&lt;br /&gt;&lt;br /&gt;Ha az ember a nulláról indul egy adatbázis megtervezésekor, akkor természetesen ez az ajánlott út. Viszont ha már van egy kész séma, többszáz táblával, amikre többezer hivatkozás is van, akkor bizony kénytelenek leszünk kompromisszumokat kötni. Egy fontos szabály, amit nem lehet áthágni: azonosító név maximum 30 karakter (30 byte) hosszú lehet (kivéve adatbázis név - 8 byte, adatbázis-link név - 128 byte). Ha van olyan táblánk, oszlopnevünk, T-SQL változónk, függvényünk, stb., ami 30 karakternél hosszabb, akkor azt át kell nevezni (a Migration Workbench egyszerűen levágja a végét, ha névütközés van, akkor sorszámmal látja el az azonos neveket, pl: myverylongtable_1, myverylongtable_2, stb.).&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://68.142.116.68/docs/cd/B28359_01/server.111/b28286/sql_elements008.htm#i27570"&gt;dokumentáció szerint&lt;/a&gt; "-k között szereplő fenntartott szavak lehetnek azonosító nevek, pl.: "DATE", de - mint már írtam - ebből lehetnek még problémák. Feltehetően egy &lt;a href="http://orabusiness.blogspot.com/2008/08/omwb-kt-jabb-idegest-bug.html"&gt;bug miatt&lt;/a&gt; ha még SQL Server oldalon átnevezzük a fenntartott szavakat úgy, hogy egy _ postfixet teszünk a végükre, pl.: Type_, akkor a Migration Workbench "visszanevezi" őket, azaz leveszi a postfixünket. Ezt eddig csak a Type-nál vettem észre.&lt;br /&gt;&lt;br /&gt;A kívánatos út szerintem az, ha még migráció előtt SQL Server oldalon átnevezünk minden 30-nál hosszabb illetve fenntartott azonosító nevet, illetve az azokra történő hivatkozást. Nagy adatbázis esetén nagy munka, de megkímélhetjük magunkat későbbi kellemetlen meglepetésektől. Például, ha van egy tárolt eljárásunk, ami visszaad valamilyen recordsetet, ahol bizonyos oszlopnevek vagy alias-ok 30 karakternél hosszabbak, akkor a kliens oldalon külön kell kezelni, hogy az eredményt T-SQL eljárás adta-e vissza (30+ hosszú is lehet egy oszlopnév ill. alias), vagy PL/SQL (max 30 karakter) ha szerepelnek a kliens-kódban oszlopnévre történő hivatkozások. Ez nem járható út.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-1871671674084517151?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/1871671674084517151/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=1871671674084517151' title='1 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1871671674084517151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1871671674084517151'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/09/migrci-ii.html' title='Migráció II.'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-4175307080213445377</id><published>2008-09-21T12:29:00.002+02:00</published><updated>2008-09-21T12:48:38.509+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><title type='text'>Még pár szó a konverziókról</title><content type='html'>&lt;div style="text-align: justify;"&gt;A migrációval kapcsolatos előző bejegyzésben az implicit és explicit konverziókról is írtam pár gondolatot. Azóta észrevettem egy furcsaságot, &lt;a href="http://forums.oracle.com/forums/thread.jspa?threadID=703513&amp;amp;tstart=0"&gt;amit fel is vetettem&lt;/a&gt; az OTN fórumban, de azóta nem kaptam rá választ.&lt;br /&gt;&lt;br /&gt;Röviden összefoglalva: az SQL Developer SQL Serverről történő migrációkor automatikusan generál egy sqlserver_utilities nevű PL/SQL package-et, ami számos T-SQL függvény implementációját tartalmazza, köztük a CONVERT() függvényét is.&lt;br /&gt;&lt;br /&gt;Az 1.5.1-es SQL Developerben a függvény deklarációja így néz ki:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: courier new;"&gt;FUNCTION convert_(p_dataType IN VARCHAR2, p_expr IN VARCHAR2, p_style IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Az első paraméter szöveges módon tartalmazza az adattípust, hogy mire konvertálunk, például 'varchar'. A második paraméter maga a kifejezés, amit konvertálni szeretnénk, az utolsó pedig egy opcionális stílus paraméter, ami  a különböző dátum, szám illetve egyéb formátumokat határozza meg, attól függően, hogy a konvertálandó kifejezés milyen típusú.&lt;br /&gt;&lt;br /&gt;És itt jön elő az implicit konverzió kérdése, ugyanis ha egy dátum típusú kifejezést szeretnénk yyyy/mm/dd formátumú varchar-á konvertálni, ami T-SQL-ben így néz ki:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;declare @mydate datetime &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; select convert(varchar, @mydate,111)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;azt az sqlserver_utilities.convert_() függvény segítségével - elvileg - így tehetnénk meg:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;DECLARE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  cv_1 SYS_REFCURSOR&lt;/span&gt;;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  v_mydate DATE; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; BEGIN &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  OPEN cv_1 FOR &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     SELECT sqlserver_utilities.convert_('VARCHAR2(4000)', v_mydate, 111);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ebben az esetben viszont a v_mydate először implicit módon varchar-á konvertálódik, méghozzá az alapértelmezett formátumnak megfelelően:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt; &lt;span style="font-family: courier new;"&gt;select value from v$NLS_PARAMETERS where parameter = 'NLS_DATE_FORMAT'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ez nálam azzal jár, hogy elveszik minden idő jellemző (óra, perc, másodperc). Például a 108-as stílus (hh:mi:ss) a convert_() függvénnyel használhatatlan.&lt;br /&gt;&lt;br /&gt;Ezek után már csak egy költői kérdés maradt hátra, hogy a függvény kódjában a 108-as stílushoz miért a HH12-as formátum tartozik, amikor SQL Server alatt a hh 24 órás megjelenítést jelent.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-4175307080213445377?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/4175307080213445377/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=4175307080213445377' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4175307080213445377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4175307080213445377'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/09/mg-pr-sz-konverzikrl.html' title='Még pár szó a konverziókról'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5422807882995312334</id><published>2008-09-11T17:06:00.009+02:00</published><updated>2008-09-11T17:19:07.581+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oracle szeminárium'/><title type='text'>Oracle szeminárium - 2008 ősz</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_B53I7cvI5sc/SMk1AkG_YfI/AAAAAAAAADw/isPoCXIOBfc/s1600-h/oracle.jpg"&gt;&lt;img style="margin: 0pt 20px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_B53I7cvI5sc/SMk1AkG_YfI/AAAAAAAAADw/isPoCXIOBfc/s200/oracle.jpg" alt="" id="BLOGGER_PHOTO_ID_5244781524858921458" border="0" width="120"/&gt;&lt;/a&gt;&lt;div style="text-align: justify; "&gt;Idén ősszel is lesz ingyenesen látogatható Oracle szeminárium minden csütörtökön 18 órától a BME I. épületében. Az előadás témái:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Oracle adatbázis-kezelő architektúra&lt;/li&gt;&lt;li&gt;Fürtözött adatbázis&lt;/li&gt;&lt;li&gt;Adatbázis üzemeltetés&lt;/li&gt;&lt;li&gt;Adatreplikáció és katasztrófatűrő adatbázis&lt;/li&gt;&lt;li&gt;Adatbányászat&lt;/li&gt;&lt;li&gt;Térinformatika az adatbázisban&lt;/li&gt;&lt;li&gt;Adatbiztonság&lt;/li&gt;&lt;li&gt;XML adatok tárolása az adatbázisban&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Bővebb információ &lt;a href="http://atria.aspnet.hu/EventDetail.aspx?EventID=7"&gt;itt&lt;/a&gt;. Én már jelentkeztem :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5422807882995312334?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5422807882995312334/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5422807882995312334' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5422807882995312334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5422807882995312334'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/09/oracle-szeminrium-2008-sz.html' title='Oracle szeminárium - 2008 ősz'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_B53I7cvI5sc/SMk1AkG_YfI/AAAAAAAAADw/isPoCXIOBfc/s72-c/oracle.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2497807881053344307</id><published>2008-09-07T17:12:00.008+02:00</published><updated>2008-09-07T17:25:43.993+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Migráció I.</title><content type='html'>Lassan egy hónapja tart a migráció előkészítése, gyűjtjük a megoldásra váró problémákat, próbálunk egy átfogó képet szerezni az előttünk álló folyamatról. Ebben a bejegyzésben megpróbálom összefoglalni, hogy mire jutottunk eddig.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Jelenleg van egy .NET-es, C#-ban írt alkalmazás (kliens), ami Microsoft SQL Server-t használ adatbázisként. A kliens oldalon szinte kizárólag tárolt eljárás hívások szerepelnek. A cél az, hogy ugyanaz a kliens szoftver képes legyen SQL Server-t is és Oracle Database-t is használni adatbázisként, azaz egy klienshez lenne két külön adatbázis-oldali rész. Ezért a migrációnak csak minimális mértékben kéne visszahatnia a kliens oldali részre. Sajnos ez közel sem olyan egyszerű. Lássuk a problémás területeket!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Adattípusok&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Habár az Oracle és az SQL Server által támogatott adattípusok különböznek egymástól, szerencsére az esetek igen nagy százalékában megfeleltethetőek egymásnak. Egy Oracle white paper szerint is: "Microsoft SQL Server and Oracle9i Database data types differ. However these differences are usually small enough to have little or no impact on your applications."&lt;br /&gt;&lt;br /&gt;Az SQL Developerbe integrált Migration Workbench (OMWB) a konvertáláskor &lt;a href="http://download.oracle.com/docs/cd/E12151_01/doc.150/e12156/ss_oracle_compared.htm#i1026427"&gt;automatikusan leképezi&lt;/a&gt; az SQL Server adattípusokat Oracle adattípusokra. Számunkra lényeges eltérés a (N)VARCHAR típus maximális hosszában van: míg SQL Server alatt maximum 8000 karaktert képes tartalmazni, addig Oracle alatt ez a szám 4000. De szerencsére az OMWB a 4000-nél hosszabb (N)VARCHAR típusokat automatikusan (N)CLOB-okká konvertálja.&lt;br /&gt;&lt;br /&gt;Különböznek még a dátum típusok pontosságai: míg SQL Server alatt a DATETIME 3.33 mikroszekundum pontosságú, addig Oracle alatt másodperc pontosságú a DATETIME-nak megfelelő DATE típus. Ahol ez nem elég, ott érdemes a TIMESTAMP típust használni, ami viszont már 1 mikroszekundum pontosságú. Persze kérdés az, hogy az adatbázisunkban kismillió helyen használt DATETIME-ok közül hol elég a másodperces felbontás, és hol nem. Ebből még lehetnek bonyodalmak..&lt;br /&gt;&lt;br /&gt;Az adattípusok konvertálásáról bővebben lehet még olvasni az SQL Developer &lt;a href="http://download.oracle.com/docs/cd/E12151_01/doc.150/e12156/ss_oracle_compared.htm#i1026427"&gt;dokumentációjában&lt;/a&gt; és a &lt;a href="http://www.oracle.com/technology/tech/migration/ama/docs/ama_wp.pdf"&gt;Migrating Applications from Microsoft SQL Server to Oracle9i Database&lt;/a&gt; című white paper-ben.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Implicit/explicit konverzió&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Az adattípusokhoz erősen kapcsolódó téma a típusok közötti implicit vagy explicit konverziók kérdése.&lt;br /&gt;&lt;br /&gt;SQL Server alatt az explicit típuskonverziót a CAST és CONVERT függvények valósítják meg:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt; &lt;span style="font-family:courier new;"&gt;CAST ( expression AS data_type [ (length ) ])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; CONVERT ( data_type [ ( length ) ] , expression [ , style ] )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt; Forrás: &lt;a href="http://msdn.microsoft.com/en-us/library/ms187928.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms187928.aspx&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;A CONVERT függvény SQL Server specifikus, és nagyobb rugalmasságot biztosít dátumok és tört számok konvertálásakor. A CAST pedig inkább ANSI-szerű, ezért többé-kevésbé ugyanolyan szintaxissal lehet használni a különböző adatbázis szerverek alatt.&lt;br /&gt;&lt;br /&gt;Implicit konverzió például akkor történik, amikor két különböző típusú adatot hasonlítunk össze, vagy ha egy tábla adott oszlopába szúrunk be egy attól különböző típusú értéket. Az implicit konverzió a felhasználó elől rejtve marad.&lt;br /&gt;&lt;br /&gt;SQL Server alatt a lehetséges implicit és explicit típuskonverziók mátrixát az alábbi kép tartalmazza:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_B53I7cvI5sc/SMPwTtBo65I/AAAAAAAAADI/nDfQJt9YtTs/s1600-h/sqlserver_conversion.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_B53I7cvI5sc/SMPwTtBo65I/AAAAAAAAADI/nDfQJt9YtTs/s320/sqlserver_conversion.gif" alt="" id="BLOGGER_PHOTO_ID_5243298612484041618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:78%;"&gt;Forrás: &lt;a href="http://msdn.microsoft.com/en-us/library/ms187928.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms187928.aspx&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ugyanez az ábra Oracle alatt picit máshogy néz ki, implicit konverziók:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_B53I7cvI5sc/SMPwu5ZK2OI/AAAAAAAAADQ/1yCW-wwOtsU/s1600-h/oracle_conversion.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_B53I7cvI5sc/SMPwu5ZK2OI/AAAAAAAAADQ/1yCW-wwOtsU/s320/oracle_conversion.gif" alt="" id="BLOGGER_PHOTO_ID_5243299079660427490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:78%;"&gt;Forrás: &lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements002.htm#i46862"&gt;http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements002.htm#i46862&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;explicit konverziók:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_B53I7cvI5sc/SMPxCmulTkI/AAAAAAAAADY/EMI4hfcU4ZQ/s1600-h/oracle_explicit_conversion.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_B53I7cvI5sc/SMPxCmulTkI/AAAAAAAAADY/EMI4hfcU4ZQ/s320/oracle_explicit_conversion.gif" alt="" id="BLOGGER_PHOTO_ID_5243299418247351874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:78%;"&gt;Forrás: &lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements002.htm#i46862"&gt;http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/sql_elements002.htm#i46862&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Habár implicit típuskonverzió alkalmazása több okból is helytelen (a kód nehezebben értelmezhető, nem feltétlen optimális az utasítások végrehajtása performancia szempontból, a különböző verziók során változhatnak a konverziós szabályok, stb.) mi mégis több helyen alkalmazzuk, egész egyszerűen azért, mert kényelmes. Például SQL Server a képen látható módon többféle dátumformátumot is képes kezelni:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_B53I7cvI5sc/SMPxP2D1xpI/AAAAAAAAADg/kB0pp86rues/s1600-h/sqlserver_impl_date_conversion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_B53I7cvI5sc/SMPxP2D1xpI/AAAAAAAAADg/kB0pp86rues/s320/sqlserver_impl_date_conversion.png" alt="" id="BLOGGER_PHOTO_ID_5243299645701342866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Kavarodás itt is történhet (ÉV-HÓNAP-NAP, NAP-HÓNAP-ÉV, stb.), de ha az ember ragaszkodik valami megszokott formátumhoz, nem érheti baj. Kivéve, ha a kódot más adatbázis szerver alatt is szeretné használni :)&lt;br /&gt;&lt;br /&gt;Oracle alatt az alapértelmezett formátumot az NLS_DATE_FORMAT paraméter tartalmazza, ami az én szerveremen:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT Value FROM v$nls_parameters WHERE parameter = 'NLS_DATE_FORMAT'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;VALUE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-----&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;RR-MON-DD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Azaz a '2008-01-01' például csak explicit módon konvertálható át DATE típusúvá. Ilyen esetekben célszerűbb a &lt;a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions187.htm#i1003589"&gt;TO_DATE függvény&lt;/a&gt; használata. A mi esetünkben tehát minden ilyen esetben kézzel át kell írni minden implicit konverziót tartalmazó kódot explicit konverzióvá.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;u&gt;Ideiglenes táblák, táblaváltozók&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ideiglenes táblák SQL Server és Oracle alatt is léteznek, a különbség annyi, hogy míg SQL Server alatt a táblában tárolt adatok és maga a struktúra is ideiglenes, addig Oracle alatt a struktúra (séma) állandó.&lt;br /&gt;&lt;br /&gt;A Migration Workbench kiszedi a tárolt eljárások kódjából az ideiglenes táblákat létrehozó DDL utasításokat, és külön hozza létre őket:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;/* Translation Extracted DDL For Required Objects */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;CREATE GLOBAL TEMPORARY TABLE tt_foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Az ideiglenes táblákat törlő DROP utasításokból pedig ez lesz:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;EXECUTE IMMEDIATE ' TRUNCATE TABLE tt_foo ';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Azaz csak a tartalmát törli a táblának, magát a táblát nem.&lt;br /&gt;&lt;br /&gt;Egyelőre úgy tűnik, hogy számunkra ez tökéletesen megfelelő. Egyedül az zavaró, hogy (hanyagságból) rengeteg #temp nevű táblát használunk SQL Server oldalon, és mivel Oracle alatt a séma nem ideiglenes, ezért ahány helyen #temp táblát használunk, annyi darab TT_TEMP_n jön létre Oracle oldalon. Az n jelenleg olyan 30 körüli (TT_TEMP_1, TT_TEMP_2, ... TT_TEMP_30, ..).&lt;br /&gt;&lt;br /&gt;Táblaváltozók viszont nincsenek Oracle alatt, ezek kiváltására vagy ideiglenes táblákat, vagy &lt;a href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/collections.htm#CIHIEBJC"&gt;PL/SQL collection&lt;/a&gt;-öket kell majd használnunk. Azaz itt is marad a kézi átírás.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2497807881053344307?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2497807881053344307/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2497807881053344307' title='1 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2497807881053344307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2497807881053344307'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/09/migrci-i.html' title='Migráció I.'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_B53I7cvI5sc/SMPwTtBo65I/AAAAAAAAADI/nDfQJt9YtTs/s72-c/sqlserver_conversion.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-1355024206045264901</id><published>2008-08-17T19:44:00.004+02:00</published><updated>2008-08-17T19:51:49.026+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dimenzionális modellezés'/><category scheme='http://www.blogger.com/atom/ns#' term='csillag séma'/><title type='text'>Dimenzionális modellezés - a csillag séma</title><content type='html'>&lt;div style="text-align: justify;"&gt;A csillag séma a tény tábla és a dimenzió táblák csillag szerű összekapcsolásából áll. A középen álló tény tábla tartalmazza a számszerű (lehetőleg összeadható) mértékeket, valamint a csillag-szerűen kapcsolódó dimenzió táblákra való hivatkozásokat (távoli kulcsokat). A dimenzió táblák pedig - mint már említettem - a lehető legtöbb leíró tulajdonságot tartalmazza.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_B53I7cvI5sc/SKhkd7iTMII/AAAAAAAAADA/E1g5LQtzZVM/s1600-h/800px-Star-schema.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_B53I7cvI5sc/SKhkd7iTMII/AAAAAAAAADA/E1g5LQtzZVM/s320/800px-Star-schema.png" alt="" id="BLOGGER_PHOTO_ID_5235545032178741378" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Forrás: Wikipedia&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;A legkézenfekvőbb tulajdonságai a csillag sémának az egyszerűség, és a szimmetria. Talán már ránézésre is érthetővé válik, hogy milyen üzleti folyamatot reprezentál a modell, még egy informatikában kevésbé jártas üzleti felhasználó számára is.&lt;br /&gt;&lt;br /&gt;Az egyszerűség másik jelentős következménye a jó lekérdezési teljesítmény. Az adatbázis motor sokkal kevesebb &lt;span style="font-style: italic;"&gt;join&lt;/span&gt; segítségével tudja végrehajtani a lekérdezéseket.&lt;br /&gt;&lt;br /&gt;A szimmetriának köszönhetően minden dimenzió teljesen ekvivalens, mindegy melyik dimenzió felhasználásával indít lekérdezéseket a felhasználó, nincs különbség. Nincsenek a modellbe épített feltételezések a leendő lekérdezéseket illetően.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rittmanmead.com/author/mark-rittman/"&gt;Mark Rittman&lt;/a&gt; írt egy &lt;a href="http://www.rittmanmead.com/2007/09/16/obiee-dimension-data-modeling-redux/"&gt;bejegyzést&lt;/a&gt; a blogjába arról, hogy hogyan lehet egy normalizált modellből az Oracle BIEE segítségével dimenzionális modellt építeni.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-1355024206045264901?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/1355024206045264901/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=1355024206045264901' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1355024206045264901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1355024206045264901'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/08/dimenzionlis-modellezs-csillag-sma.html' title='Dimenzionális modellezés - a csillag séma'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_B53I7cvI5sc/SKhkd7iTMII/AAAAAAAAADA/E1g5LQtzZVM/s72-c/800px-Star-schema.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2635041762963437214</id><published>2008-08-14T16:51:00.003+02:00</published><updated>2008-08-18T14:04:17.015+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='omwb'/><category scheme='http://www.blogger.com/atom/ns#' term='pl/sql'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><title type='text'>OMWB - két újabb idegesítő bug?</title><content type='html'>&lt;div style="text-align: justify;"&gt;Folytatódik a munkahelyemen a migráció előkészítése: nézegetjük, hogy egyrészt mire képes a Migration Workbench, másrészt mik azok a lehetséges buktatók, amikre még nem gondoltunk.&lt;br /&gt;&lt;br /&gt;Eközben találtam egy újabb bug-gyanús - igen idegesítő - hibát az OMWB-ben:&lt;br /&gt;&lt;br /&gt;Ha valamilyen Oracle kulcsszó szerepel azonosítóként az SQL Server oldali kódban, azt okosan átalakítja, például:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select @something = date&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from MyTable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ez a kód teljesen jó SQL Server alatt, ha a MyTable táblának van date nevű oszlopa. Ezt az alábbi kódra alakítja át:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT date_&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  INTO v_something&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  FROM MyTable ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A konvertálás előtt egy kollégám elkészített egy olyan sémát, ahol az összes oracle-s kulcsszó mögé egy _-t szúrt. Tehát már SQL Server oldalon az összes date-ből date_ lett, a type-okból type_, és így tovább. Viszont konvertálás után az összes type_ azonosítóra való hivatkozásból újra type lett. Ami SQL Server alatt:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select @something = type_&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from MyTable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;az konvertálás után:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT type&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  INTO v_something&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  FROM MyTable ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ami természetesen hibás. Ugyanez más kulcsszó esetén nem jött elő, tehát a date_-ek megmaradtak :)&lt;br /&gt;&lt;br /&gt;A másik bug a következő: amit már egy korábbi bejegyzésben írtam is, az SQL Server megengedi, hogy egy tárolt eljárás bemenő paraméterét mezei változóként kezeljük, azaz állhat értékadás bal oldalán. Ezt az OMWB kezeli is, egy belső, rendesen deklarált változó segítségével. Ha a paraméterre való hivatkozás mindenhol pontosan ugyanaz, case sensitive-en:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create procedure foo (@bar int)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;as&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; select @Bar=5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;itt ugye a hivatkozás megegyezik, leszámítva a kis/nagy B betűt. Az OMWB emiatt megzavarodik picit:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE OR REPLACE PROCEDURE foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  v_bar IN NUMBER DEFAULT NULL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   v_Bar := 5;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;END;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sajnos ezek igen idegesítő hibák, remélem valahogy meg lehet majd őket kerülni, vagy ha nem, akkor hamar kijavítják.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: visszaigazolt bug: 7332018: FORUMS: PROCEDURE ARGUMENTS NEED TO MATCH VARIABLE NAMES IN CASE.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2635041762963437214?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2635041762963437214/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2635041762963437214' title='3 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2635041762963437214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2635041762963437214'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/08/omwb-kt-jabb-idegest-bug.html' title='OMWB - két újabb idegesítő bug?'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-6728339801416708729</id><published>2008-08-12T14:55:00.004+02:00</published><updated>2008-08-18T14:06:24.644+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='pl/sql'/><title type='text'>OMWB - Probléma a nagy 'L' betűkkel</title><content type='html'>&lt;div style="text-align: justify;"&gt;Találtam egy &lt;a href="http://dermotoneill.blogspot.com/"&gt;remek blogot&lt;/a&gt; a Migration Workbench-ről, ahol csomó ismert problémán kívül szerepel egy &lt;a href="http://dermotoneill.blogspot.com/2008/06/sql-developer-migration-workbench-151_11.html"&gt;rövid leírás&lt;/a&gt;, hogy milyen lépések mentén célszerű a migrációt elvégezni. Ezt végignyomkodtam, csak próbaképp, hogy lássam, mennyire működőképes.&lt;br /&gt;&lt;br /&gt;Miután lefutott (kb. 2-3 óra alatt) meglepődve tapasztaltam, hogy az összes nagy 'L' betűt, ami valamilyen azonosítóban (táblanév, oszlopnév, stb) szerepelt, eltűntette. Tehát pl.: az FX_Leg táblából FX_eg lett, a LoginCount oszlopnévből oginCount..&lt;br /&gt;&lt;br /&gt;Erről nyitottam is egy &lt;a href="http://forums.oracle.com/forums/thread.jspa?threadID=693457&amp;amp;tstart=0"&gt;fórum-topicot&lt;/a&gt; az OTN-en, de közben elkezdtem én is nézni, hogy mi lehet a gond.&lt;br /&gt;&lt;br /&gt;A migráció elején, amikor létrehozzuk a repository-t (Associate Migration Repository), létrejön egy &lt;span style="font-family:courier new;"&gt;MIGRATION_TRANSFORMER&lt;/span&gt; nevű PL/SQL package, aminek az elején szerepel egy konstans:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;C_DISALLOWED_CHARS   CONSTANT NVARCHAR2(100) := ' #.@`!"%^&amp;amp;*()-+=[]{};:,.&lt;&gt;?/~''L';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hogy miért került a felsorolás végére a nagy L betű, nem tudom. Mindenesetre, ha kiszedem onnan, és újrafordítom a csomagot, már működik :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: visszaigazolt hiba: We saw the English pound symbol problem, we now define the character as:&lt;br /&gt;&lt;br /&gt;C_DISALLOWED_CHARS CONSTANT NVARCHAR2(100) := ' #.@`!"%^&amp;amp;*()-+=[]{};:,.&lt;&gt;?/~'''||UNISTR('\00A3');&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-6728339801416708729?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/6728339801416708729/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=6728339801416708729' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/6728339801416708729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/6728339801416708729'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/08/omwb-problma-nagy-l-betkkel.html' title='OMWB - Probléma a nagy &apos;L&apos; betűkkel'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-1258877702492237821</id><published>2008-08-06T19:28:00.006+02:00</published><updated>2008-09-21T16:41:24.636+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='t-sql'/><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='pl/sql'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='insert into...exec'/><title type='text'>Oracle SQL Developer Migration Workbench</title><content type='html'>&lt;div style="text-align: justify;"&gt;Egyik előző bejegyzésben már írtam, hogy a migrációhoz igen nagy segítséget jelent az SQL Developer Migration Workbench része (dokumentáció &lt;a href="http://download.oracle.com/docs/cd/E12151_01/doc.150/e12156/toc.htm"&gt;itt&lt;/a&gt;). Van egy ún. Translation Scratch Editor része, ami két panelből áll, egyikbe beírja az ember a Transact-SQL kódot, és egy gombnyomásra megjelenik a másik oldalon a PL/SQL változata. Meglepő, de a generált kód igen nagy százalékban működik, és helyes! :)&lt;br /&gt;&lt;br /&gt;Eddig két tipikus esetet találtunk, amikor valami bug miatt mégsem jó kódot generál. Az egyik paraméterkezeléssel kapcsolatos, a másik a T-SQL-ben létező &lt;span style="font-family:courier new;"&gt;INSERT INTO ... EXEC&lt;/span&gt; szerkezet átalakításával.&lt;br /&gt;&lt;br /&gt;Az SQL Server megengedi, hogy a bemenő paramétereket mezei változóként használjunk, azaz a lenti kód helyes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE PROCEDURE foo (@dummy int = null)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  select @dummy = 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PL/SQL-ben viszont bemenő paraméter nem szerepelhet értékadás bal oldalán. A konvertáló ezt a kódot helyesen az alábbira alakítja át:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE OR REPLACE PROCEDURE foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;iv_dummy IN NUMBER DEFAULT NULL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; v_dummy NUMBER(10,0) := iv_dummy;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; v_dummy := 5;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;END;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Azaz létrehoz egy változót is, aminek kezdeti értékül a paraméter értékét adja. Ez teljesen jó.&lt;br /&gt;&lt;br /&gt;Viszont abban az esetben, ha az értékadást nem SELECT, hanem a SET operátorral végezzük:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE PROCEDURE foo (@dummy int = null)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  set @dummy = 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;már nem veszi észre, hogy valójában egy paraméterről van szó, és egy az egyben átfordítja:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE OR REPLACE PROCEDURE foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  v_dummy IN NUMBER DEFAULT NULL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   v_dummy := 5;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;END;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ez a kód természetesen nem fordul le.&lt;br /&gt;&lt;br /&gt;A másik hiba akkor fordul elő, ha T-SQL-ben meglévő INSERT INTO...EXEC struktúrát próbálja átalakítani. T-SQL-ben lehetőség van arra, hogy egy táblába szúrjuk bele egy tárolt eljárás által visszaadott eredményhalmazt (ugyanis T-SQL tárolt eljárás képes eredményhalmazokkal is visszatérni, nem úgy, mint a PL/SQL eljárások). Az alábbi T-SQL kódot:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE PROCEDURE foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  insert into sometable (foobar)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    exec sp_something&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;erre fordítja át:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE OR REPLACE PROCEDURE foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   v_temp SOMETABLE%ROWTYPE;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   sp_something();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   LOOP&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      FETCH cv_1 INTO v_temp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      EXIT WHEN cv_1%NOTFOUND;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      INSERT INTO sometable VALUES v_temp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   END LOOP;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   CLOSE cv_1;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;END;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maga a logika teljesen jó lenne: a tárolt eljárás egy kurzorváltozóval tér vissza, amin végigmenve egyesével beszúrjuk a sorokat a táblába. A bökkenő csak az, hogy nem deklarálja a cv_1 kurzorváltozót, így a fenti kód szintén nem fordul.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: visszaigazolt bug No: 7335256 FORUMS: INSERT INTO .. EXEC PROCEDURE HAS UNDECLARED VARIABLES.&lt;br /&gt;&lt;br /&gt;Ezek a hibák természetesen nem vészesek akkor, ha valaki csak pár eljárást szeretne átkonvertálni. Viszont akkor, ha több ezerről lenne szó, akkor már bosszantóak, ugyanis így nehézkes automatizálni.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-1258877702492237821?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/1258877702492237821/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=1258877702492237821' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1258877702492237821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1258877702492237821'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/08/oracle-sql-developer-migration.html' title='Oracle SQL Developer Migration Workbench'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-4670336500111108118</id><published>2008-08-06T10:27:00.004+02:00</published><updated>2008-08-06T10:37:10.280+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migráció'/><category scheme='http://www.blogger.com/atom/ns#' term='kulcsszavak'/><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Kulcsszavak mint oszlopnevek Oracle alatt</title><content type='html'>&lt;div style="text-align: justify;"&gt;A migráció kapcsán rögtön belefutottunk egy érdekes problémába: SQL Server oldalon több olyan oszlopnevet is használunk, ami Oracle alatt kulcsszó vagy fenntartott szó: name, text, comment, date, number, stb.&lt;br /&gt;&lt;br /&gt;Úgy gondoltuk, hogy ha ezeket az oszlopneveket nagybetűsen és ""-k között hozzuk létre (és így is hivatkozunk rájuk) akkor működhet. A táblák létre is jöttek, viszont több esetben egyéb gondok léptek fel. Pl.:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE TABLE asdf (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  "DATE" date&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Select * from asdf;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ez tökéletesen lefut, viszont:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  v_temp number;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; select 1 into v_temp from dual where exists (select 1 from asdf); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ez már nem:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ORA-06550: line 5, column 61:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PL/SQL: ORA-06552: PL/SQL: Compilation unit analysis terminated&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ORA-06550: line 5, column 2:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gondoltuk, hogy baj van, akkor át kell nevezni az oszlopokat. Elkezdtem próbálkozni, hogy milyen kulcsszavakkal van még gond, és nem az összes reserved word-del van baja:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE TABLE asdf (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  "AUDIT" date&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Elvileg az audit is &lt;a href="http://download.oracle.com/docs/cd/B28359_01/appdev.111/b31231/appb.htm"&gt;reserved word&lt;/a&gt; mégsem fut hibára a fenti kódrészlet.&lt;br /&gt;&lt;br /&gt;A következő gondolat az volt, hogy a típusnevekkel van csak gondja, de ez sem teljesen igaz, ugyanis a lenti esetben:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE TABLE asdf (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  "DATE" int&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Szintén hiba nélkül lefut a PL/SQL kód, ellenben, ha "NUMBER" int van (tehát nem "NUMBER" number), akkor megint csak az említett hibára fut.&lt;br /&gt;&lt;br /&gt;Maradt még egy utolsó kombináció, méghozzá a kulcsszavak kisbetűsen, ""-k között:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE TABLE asdf (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  "number" number&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Így jelenleg minden (date, number, stb.) működik. Egyelőre. Már csak az a költői kérdés maradt hátra, hogy ebben így mi a logika?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-4670336500111108118?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/4670336500111108118/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=4670336500111108118' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4670336500111108118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/4670336500111108118'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/08/kulcsszavak-mint-oszlopnevek-oracle.html' title='Kulcsszavak mint oszlopnevek Oracle alatt'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-1786775880943219276</id><published>2008-08-03T21:23:00.003+02:00</published><updated>2008-08-06T10:20:47.585+02:00</updated><title type='text'>Migráció Microsoft SQL Serverről Oracle adatbázisra</title><content type='html'>&lt;div style="text-align: justify;"&gt;Munkahelyemen elkezdődött a puhatolózás, hogy miből állna egy migráció SQL Serverről Oracle adatbázisra. Ebben nagy segítség az &lt;a href="http://www.oracle.com/technology/products/database/sql_developer/index.html"&gt;Oracle SQL Developer&lt;/a&gt; &lt;a href="http://www.oracle.com/technology/tech/migration/workbench/index_sqldev_omwb.html"&gt;Migration Workbench&lt;/a&gt;-je, valamint a &lt;a href="http://www.oracle.com/technology/tech/migration/ama/docs/ama_wp.pdf"&gt;Migrating Applications from Microsoft SQL Server to Oracle9&lt;span style="font-style: italic;"&gt;i&lt;/span&gt; Database&lt;/a&gt; című white paper, amiben részletesen ki van fejtve jópár szintaktikai és szemléletmódbeli különbség is. &lt;a href="http://www.psoug.org/reference/sqlserver.html"&gt;Ezen&lt;/a&gt; az oldalon is fel van sorolva néhány :)&lt;br /&gt;&lt;br /&gt;Mivel az üzleti logika jelentős része Transact-SQL tárolt eljárások formájában van megvalósítva, ezért talán az egyik legnagyobb feladat ezek PL/SQL-re konvertálása lesz. A Migration Workbench része egy scratch editor, amiben kb. gombnyomásra lehet az egyszerűbb (és nem SQL Server specifikus) kódokat átkonvertálni, több kevesebb sikerrel. Sajnos vannak még hibái, de mindenesetre nagyon ígéretes! Szerintem nem fogunk unatkozni az elkövetkezendő hónapokban :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-1786775880943219276?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/1786775880943219276/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=1786775880943219276' title='2 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1786775880943219276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1786775880943219276'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/08/migrci-microsft-sql-serverrl-oracle.html' title='Migráció Microsoft SQL Serverről Oracle adatbázisra'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2499183084460459201</id><published>2008-08-03T21:19:00.002+02:00</published><updated>2008-08-03T21:23:08.946+02:00</updated><title type='text'>Új kinézet</title><content type='html'>&lt;div style="text-align: justify;"&gt;Lecseréltem a blog alatti template-et, hogy picit kultúráltabb legyen a kinézete :) Remélem úgy sikerült, hogy nem ment a funkcionalitás rovására.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2499183084460459201?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2499183084460459201/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2499183084460459201' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2499183084460459201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2499183084460459201'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/08/j-kinzet.html' title='Új kinézet'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5598882631228728645</id><published>2008-08-02T21:55:00.006+02:00</published><updated>2008-09-08T13:55:56.881+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dimenzionális modellezés'/><title type='text'>Dimenzionális modellezés - bevezetés</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;u style="font-weight: bold;"&gt;Tény táblák&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;A tény táblák (&lt;span style="font-style: italic;"&gt;fact tables&lt;/span&gt;) a dimenzionális modellezés központi elemei: ezek azok a táblák, ahol az adott üzleti folyamat számszerű mértékei szerepelnek. Például egy üzletlánc napi eladásait reprezentáló táblában ez a mérték lehet az eladott mennyiség, vagy az értük kapott pénzösszeg. Minden nap, bármelyik boltban bármelyik termék értékesítésre kerül, készül egy bejegyzés is. A dimenziók ezen listája határozza meg a tény tábla finomságát, felbontását.&lt;br /&gt;&lt;br /&gt;Egy adattárház szempontjából a leghasznosabb mértékek számszerűek és összeadhatóak, mivel igen ritka az az eset, amikor egyetlen sorra kiváncsi a felhasználó a tény táblából. Éppen ellenkezőleg, általában a sorok százezreinek az aggregált értékére kiváncsi (az elmúlt hónapban eladott termékek mennyisége, bevétel, stb.). A fenti példában az eladott mennyiség és a pénzösszeg is összeadható bármelyik dimenzió mentén.&lt;br /&gt;&lt;br /&gt;Nem minden tényadat összeadható, léteznek részlegesen összeadható (&lt;span style="font-style: italic;"&gt;semiadditive&lt;/span&gt;) mértékek, amelyeket csak bizonyos dimenziók mentén lehet összeadni, és nem összeadható mértékek is. Például egy raktárkészlet aktuális állapotát vagy számlák aktuális egyenlegét reprezentáló tény táblák tipikusan ilyen részlegesen összeadható adatokat tartalmaznak, ugyanis értelmes összeadni a számlaegyenlegeket például ügyfelek szerint, de értelmetlen az idő szerint. Ilyen esetekben a legcélszerűbb megközelítés az átlagolás: az adott periódusra szóló átlag-egyenleg, vagy átlagos raktárkészlet.&lt;br /&gt;&lt;br /&gt;&lt;u style="font-weight: bold;"&gt;Dimenziók&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;A dimenziók a tény táblák kísérői. Ezek a táblák tartalmazzák a szöveges leírásait az adott üzleti folyamatnak. Egy jól megtervezett dimenzionális modellben egy dimenzió táblának lehető legmagasabb számú oszlopa vagy másnéven attribútuma van, ugyanis ezek az attribútumok játszanak a lekérdezéseknél, elemzéseknél csoportosító, megszorító, vagy magyarázó szerepeket. Emiatt létfontosságú, hogy minél több jól definiált, értelmes dimenzió attribútum legyen, mert ezek határozzák meg az adattárház használhatóságát. A dimenziók jelentik az interfészt az adattárház és a felhasználó között.&lt;br /&gt;&lt;br /&gt;Míg a tény adatok főleg számszerűek és folytonos értékkészletűek, addig a dimenzió attribútumok általában szövegesek, és diszkrétek.&lt;br /&gt;&lt;br /&gt;A dimenziók sokszor hierarchikus kapcsolatot reprezentálnak. Például egy termék egy adott márkához tartozik, amiket kategóriákba sorolunk, és így tovább. A termék dimenzió táblában minden sorban (minden termékre) eltároljuk az adott termék márkáját és a kategória szöveges jellemzését is. Ez épp ellentétes egy normalizált adatbázissal, ugyanis rengeteg redundáns információt tartalmaz. A dimenzió táblák tipikusan denormalizáltak (kivéve &lt;a href="http://en.wikipedia.org/wiki/Snowflake_schema"&gt;snowflake séma&lt;/a&gt; esetében), a performancia és az egyszerűség, könnyen érthetőség érdekében feláldozzák a szükséges tárhely mennyiségét.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5598882631228728645?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5598882631228728645/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5598882631228728645' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5598882631228728645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5598882631228728645'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/08/dimenzionlis-modellezs-bevezets.html' title='Dimenzionális modellezés - bevezetés'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-6812525081315105018</id><published>2008-07-19T16:36:00.002+02:00</published><updated>2008-07-19T16:42:09.837+02:00</updated><title type='text'>Adattárház rendszerek összehasonlító elemzése</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ma a neten böngészgetve a &lt;a href="http://datamining.sztaki.hu/?q=hu-tagok"&gt;SZTAKI&lt;/a&gt; oldaláról eljutottam Sidló Csaba &lt;a href="http://scs.web.elte.hu/"&gt;honlapjáig&lt;/a&gt;, ahol fent van a &lt;a href="http://scs.web.elte.hu/Work/diplom/diploma.doc"&gt;diplomamunkája&lt;/a&gt; is, melynek témája az adattárházak összefoglaló jellegű, általános bemutatása, valamint az Oracle és &lt;span style="text-decoration: underline;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;az SAP adattárház megoldásainak összehasonlítása.&lt;br /&gt;&lt;br /&gt;A tartalomjegyzéket átfutva biztos vagyok benne, hogy hasznos olvasmány a téma iránt érdeklődők számára!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-6812525081315105018?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/6812525081315105018/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=6812525081315105018' title='2 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/6812525081315105018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/6812525081315105018'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/07/adattrhz-rendszerek-sszehasonlt-elemzse.html' title='Adattárház rendszerek összehasonlító elemzése'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-382148235714036772</id><published>2008-07-06T16:03:00.004+02:00</published><updated>2008-07-07T20:07:05.656+02:00</updated><title type='text'>BIC2G és MS SQL Server</title><content type='html'>Ma ismét nekifutottam, hogy rávegyem az Oracle BI Server-t, hogy ugyan csatlakozzon már az én kis Microsoft SQL Server 2000-emhez, ugyanis ezt eddig még sehogy sem sikerült elérnem. A legnagyobb gondom az volt, hogy nem találtam olyan ODBC driver-t, amivel csatlakozni is lehet, és még a BIEE is szereti. Egész egyszerűen azért nem találtam, mert azt sem tudtam, hogy hol keressem.. Van ugyanis egy &lt;span style="font-style: italic;"&gt;odbc.ini&lt;/span&gt; a &lt;span style="font-family: courier new;"&gt;/ora/biee/10.1.3.2/OracleBI/setup&lt;/span&gt; könyvtárban, de nem tudtam, hogy mit írjak a &lt;span style="font-family:courier new;"&gt;Driver=/ora/biee/10.1.3.2/OracleBI/server/Bin/libnqsodbc.so&lt;/span&gt; sor helyére.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Mivel tegnap sikerült az adatbázis szerverből csatlakozni a &lt;span style="font-style: italic;"&gt;hs&lt;/span&gt; segítségével, gondoltam kipróbálom a &lt;a href="http://www.freetds.org/"&gt;FreeTDS&lt;/a&gt; driverét:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[ODBC Data Sources]&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;AnalyticsWeb=Oracle BI Server&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Cluster=Oracle BI Server&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SSL_Sample=Oracle BI Server&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;InFoRex=InFoRex Source&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;[InFoRex]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Driver=/usr/local/lib/libtdsodbc.so&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Server=192.168.1.100&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Description=InFoRex Data Source&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;UID=sa&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;PWD=sa&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Database=InFoRex&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Port=1433&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;TDS_Version=8.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;És láss csodát:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_B53I7cvI5sc/SHDRDK2jdLI/AAAAAAAAACo/9AVL9Sk6NN0/s1600-h/dashboard.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_B53I7cvI5sc/SHDRDK2jdLI/AAAAAAAAACo/9AVL9Sk6NN0/s320/dashboard.png" alt="" id="BLOGGER_PHOTO_ID_5219901820505388210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nem csalás, nem ámítás, a Profiler-ből látszódik, valóban az SQL Server-ből szedte ki a nevemet :)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_B53I7cvI5sc/SHDRLME85mI/AAAAAAAAACw/MinwKKkHX4M/s1600-h/profiler.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_B53I7cvI5sc/SHDRLME85mI/AAAAAAAAACw/MinwKKkHX4M/s320/profiler.png" alt="" id="BLOGGER_PHOTO_ID_5219901958273164898" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-382148235714036772?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/382148235714036772/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=382148235714036772' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/382148235714036772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/382148235714036772'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/07/bic2g-s-ms-sql-server.html' title='BIC2G és MS SQL Server'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_B53I7cvI5sc/SHDRDK2jdLI/AAAAAAAAACo/9AVL9Sk6NN0/s72-c/dashboard.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2138458176578627167</id><published>2008-07-05T14:23:00.004+02:00</published><updated>2008-07-05T14:46:05.312+02:00</updated><title type='text'>Csatlakozás Oracle adatbázisból MS SQL Server-hez Linux alatt</title><content type='html'>&lt;div style="text-align: justify;"&gt;Előfordulhat, hogy valaki egy Oracle adatbázisból egy másik, külső adatbázis szerverhez szeretne csatlakozni. Például Oracle Warehouse Builder-ben szeretne adatforrásnak SQL Server-t használni. Ennek a megvalósítására számos (&lt;a href="http://www.filibeto.org/sun/lib/nonsun/oracle/11.1.0.6.0/B28359_01/owb.111/b31278/case_sqlserver.htm"&gt;1&lt;/a&gt; &lt;a href="http://oraclebizint.wordpress.com/2007/09/04/owb-10g11g-heterogeneous-data-sources-excel-mysql-and-sql-server/"&gt;2&lt;/a&gt; &lt;a href="http://www.orafaq.com/forum/t/58906/0/"&gt;3&lt;/a&gt;) leírás létezik, én viszont szerettem volna kicsit komplikálni a szituációt (csesszünk ki magunkkal mozgalom): az Oracle adatbázis Linux alatt fut (VMware image-ben), és ingyenes drivereket szeretnék használni.&lt;br /&gt;&lt;br /&gt;Oracle alól ODBC-vel (vagy JDBC-vel) lehet külső szerverekhez kapcsolódni a &lt;a href="http://download.oracle.com/docs/cd/B28359_01/gateways.111/b31053/c_gettingstarted.htm"&gt;heterogeneous services&lt;/a&gt; segítségével. Tehát először is szükség van egy linuxos ODBC megvalósításra, legyen ez a &lt;a href="http://www.unixodbc.org/"&gt;unixODBC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;unixODBC-vel SQL Server-hez többféle módon is lehet kapcsolódni: vagy használjuk az &lt;a href="http://www.easysoft.com/"&gt;EasySoft&lt;/a&gt; driver-ét (30 napos trial verzió, avagy 500 angol font), vagy &lt;a href="http://www.freetds.org/"&gt;FreeTDS&lt;/a&gt; segítségével, ami egy ingyenes &lt;a href="http://en.wikipedia.org/wiki/Tabular_Data_Stream"&gt;TDS&lt;/a&gt; (Tabular Data Stream) implementáció. Én mindkettőt kipróbáltam, az EasySoft driverével szinte minden ment azonnal, viszont kicsit drága. A unixODBC + FreeTDS kombó habár ingyenes, közel sem annyira triviális a beállítása.&lt;br /&gt;&lt;br /&gt;Első lépésben nem árt feltelepíteni mindkettőt:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# wget &lt;a href="http://www.unixodbc.org/unixODBC-2.2.12.tar.gz"&gt;http://www.unixodbc.org/unixODBC-2.2.12.tar.gz&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# tar zxvf unixODBC-2.2.12.tar.gz&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# cd unixODBC-2.2.12&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# ./configure –-enable-gui=no&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# make&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# make install&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# wget &lt;a href="http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz"&gt;http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# tar zxvf freetds-stable.tgz&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# cd freetds-0.82&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# ./configure --with-tdsver=8.0 --with-unixodbc=/usr/local&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# make&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ezek után már indulhat a móka, vi-re fel!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# cd /usr/local/etc/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# vi odbcinst.ini&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[FreeTDS]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Description                 = FreeTDS Driver&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Driver                  = /usr/local/lib/libtdsodbc.so&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;UsageCount                  = 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TDS_Version             = 8.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# vi odbc.ini&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[Northwind]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Driver          = /usr/local/lib/libtdsodbc.so&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Description     = Northwind DSN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Trace           = Yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# ide fogunk logolni&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TraceFile       = /tmp/sql.log&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ForceTrace      = Yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# az SQL Server IP cime ez&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Server          = 192.168.1.100&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Database        = Northwind&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Port            = 1433&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# SQL Server 2000-t hasznalunk&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TDS_Version     = 8.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# vi freetds.conf&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;…&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# A typical Microsoft server&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[TZ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        host = 192.168.1.100&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        port = 1433&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        tds version = 8.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Akkor teszteljük is le azt, amit eddig műveltünk. Jár a FreeTDS-hez egy tsql nevű utility, ami tökéletesen megfelel diagnosztikai célokra:&lt;br /&gt;&lt;/div&gt; &lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# tsql -S TZ -U sa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;locale is "en_US.UTF-8"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;locale charset is "UTF-8"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Password:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1&gt; select 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;2&gt; go&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(1 row affected)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1&gt; quit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Juhé, a FreeTDS-st sikeresen beállítottuk, nézzük mi a helyzet az ODBC-vel:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# isql -v Northwind sa sa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+---------------------------------------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| Connected!                            |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|                                       |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| sql-statement                         |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| help [tablename]                      |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| quit                                  |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|                                       |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+---------------------------------------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SQL&gt; select 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+------------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|            |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+------------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| 1          |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+------------+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SQLRowCount returns 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1 rows fetched&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SQL&gt; quit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ez eddig már fél siker! Most már „csak” az Oracle db-t kell rávenni, hogy csatlakozzon ő is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# cd $ORACLE_HOME/hs/admin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# vi tnsnames.ora&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;…&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;hsodbc =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(DESCRIPTION=&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(ADDRESS=(PROTOCOL=tcp)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(HOST=localhost)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(PORT=1521))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(CONNECT_DATA=(SID=hsodbc))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(HS=OK)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# vi listener.ora&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SID_LIST_LISTENER =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(SID_LIST =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(SID_DESC =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(SID_NAME = PLSExtProc)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(ORACLE_HOME = /ora/db/10.2.0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(PROGRAM = extproc)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;(SID_DESC=&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;(SID_NAME=hsodbc&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;(ORACLE_HOME=/ora/db/10.2.0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;(PROGRAM=hsodbc)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LISTENER =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(DESCRIPTION_LIST =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(DESCRIPTION =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;HSODBC =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;(DESCRIPTION_LIST =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;(DESCRIPTION =&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;(ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ezek után szükség van egy inicializáló fájlra is, aminek a neve init&lt;span style="font-style: italic;"&gt;&lt;sid_name&gt;&lt;/sid_name&gt;&lt;/span&gt;.ora kell, hogy legyen. Ebben a példában inithsodbc.ora:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# vi inithsodbc.ora&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# This is a sample agent init file that contains the HS parameters that are&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# needed for an ODBC Agent.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# HS init parameters&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;HS_FDS_CONNECT_INFO = "DSN=Northwind;UID=sa;PWD=sa"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;HS_FDS_SHAREABLE_NAME = /usr/lib/libodbc.so&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# ODBC specific environment variables&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# Environment variables required for the non-Oracle system&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#set &lt;envvar&gt;=&lt;value&gt;&lt;/value&gt;&lt;/envvar&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ennél a pontnál nem tudom pontosan, hogy újra kell-e indítani valamit vagy sem, mindenesetre én újraindítottam az egész gépet :)&lt;br /&gt;Jöjjön az utolsó ellenőrzés:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# cd $ORACLE_HOME/bin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# ./tnsping hsodbc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TNS Ping Utility for Linux: Version 10.2.0.3.0 - Production on 05-JUL-2008 07:48:23&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Copyright (c) 1997, 2006, Oracle.  All rights reserved.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Used parameter files:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Used TNSNAMES adapter to resolve the alias&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)) (CONNECT_DATA= (SID=hsodbc)) (HS=OK))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;OK (20 msec)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ez az OK mondja meg nekünk, hogy jók vagyunk! Akkor hozzuk létre az adatbázis linket, lépjünk be a kedvenc SQL konzolunkba:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# sqlplus tz@orcl&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SQL*Plus: Release 10.2.0.3.0 - Production on Sat Jul 5 07:52:29 2008&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Enter password:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Connected to:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SQL&gt; &lt;span style="font-weight: bold;"&gt;CREATE DATABASE LINK HSTEST CONNECT TO sa IDENTIFIED BY sa USING 'HSODBC';&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Database link created.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SQL&gt; &lt;span style="font-weight: bold;"&gt;SELECT COUNT(*) FROM Customers@hstest;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  COUNT(*)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;----------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        91&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ezzel meg is volnánk, mostantól használhatjuk az előbb elkészített linket akár Warehouse Builder-ben, akár máshol.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2138458176578627167?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2138458176578627167/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2138458176578627167' title='3 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2138458176578627167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2138458176578627167'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/07/csatlakozs-oracle-adatbzisbl-ms-sql.html' title='Csatlakozás Oracle adatbázisból MS SQL Server-hez Linux alatt'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-7981208823243695219</id><published>2008-05-31T09:01:00.002+02:00</published><updated>2008-05-31T09:07:32.600+02:00</updated><title type='text'>Oracle szeminárium</title><content type='html'>&lt;div style="text-align: justify;"&gt;Megjött az Oracle által szervezett "Nagy méretű adattárházak és BI rendszerek fejlesztése és üzemeltetése" című szeminárium sorozat vizsgaeredménye, miszerint sikeres, 70% feletti tesztet írtam. Je \o/&lt;br /&gt;Így most gondban vagyok..&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-7981208823243695219?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/7981208823243695219/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=7981208823243695219' title='6 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/7981208823243695219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/7981208823243695219'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/05/oracle-szeminrium.html' title='Oracle szeminárium'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-202385298349241472</id><published>2008-05-13T19:54:00.002+02:00</published><updated>2008-05-13T19:56:54.241+02:00</updated><title type='text'>7. féléves prezentáció</title><content type='html'>&lt;div style="text-align: justify;"&gt;Elkészítettem a 7. féléves önálló laborhoz tartozó &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/f966q8-tanczos.pdf"&gt;szóbeli prezentációt&lt;/a&gt;. Remélem bele fogok férni az 5 percbe..&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-202385298349241472?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/202385298349241472/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=202385298349241472' title='2 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/202385298349241472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/202385298349241472'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/05/7-flves-prezentci.html' title='7. féléves prezentáció'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5092475309480796087</id><published>2008-05-04T14:14:00.004+02:00</published><updated>2008-05-04T14:24:08.937+02:00</updated><title type='text'>Költöztetés</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_B53I7cvI5sc/SB2pHxrp9aI/AAAAAAAAABs/q0uUGgikLT8/s1600-h/bi.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_B53I7cvI5sc/SB2pHxrp9aI/AAAAAAAAABs/q0uUGgikLT8/s320/bi.png" alt="" id="BLOGGER_PHOTO_ID_5196495496116041122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mint már írtam, az Oracle termékei erőforrás-igényesek. Ezen a hosszú hétvégén "telt be a pohár", ugyanis a VMware-ben futó BIC2G (ami egy Oracle Enterprise Linux + Oracle DB + BIEE Server + sok egyéb..), az XP-n futó SQL Server és a Warehouse Builder olyannyira leterhelte szegény notebook-ot, hogy egy kattintás eredményére másodperceket kellett várni. Igen, 2 GB RAM és 2 magos Intel processzor az gyenge.&lt;br /&gt;&lt;br /&gt;Ezért a desktop PC-mre átraktam a VMware-t, és hálózaton keresztül csatlakozok hozzá a notebookról. A PC-n Ubuntu fut, és habár &lt;a href="http://ubuntuforums.org/showthread.php?t=613976"&gt;többeknek&lt;/a&gt; problémát okozott Hardy-n VMware telepítése, nekem pár apró trükk, patch után szépen elindult.&lt;br /&gt;&lt;br /&gt;Az egyetlen bosszantó apróság az volt, hogy lejárt az Easysoft ODBC driverem licensze, amivel az SQL Server-hez kapcsolódok, ezért igényeltem még egy 30 naposat, ugyanis az 500 fontos árat picit sokalltam.. :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5092475309480796087?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5092475309480796087/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5092475309480796087' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5092475309480796087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5092475309480796087'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/05/kltztets.html' title='Költöztetés'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_B53I7cvI5sc/SB2pHxrp9aI/AAAAAAAAABs/q0uUGgikLT8/s72-c/bi.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-8315672070300253850</id><published>2008-05-01T17:17:00.002+02:00</published><updated>2008-05-01T17:23:42.703+02:00</updated><title type='text'>7. féléves összefoglaló</title><content type='html'>&lt;div style="text-align: justify;"&gt;Mivel én ebben a félévben csinálom a 7. féléves (2 kredites) önálló labor tárgyat is, ezért el kellett készítenem a hozzá tartozó összefoglaló dokumentumot is, ami &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/f966q8_2kr.pdf"&gt;ezen&lt;/a&gt; a címen érhető el.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-8315672070300253850?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/8315672070300253850/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=8315672070300253850' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/8315672070300253850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/8315672070300253850'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/05/7-flves-sszefoglal.html' title='7. féléves összefoglaló'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2193625136830221345</id><published>2008-05-01T17:15:00.003+02:00</published><updated>2008-05-01T17:17:30.290+02:00</updated><title type='text'>A screenshot magyarázata</title><content type='html'>&lt;div style="text-align: justify;"&gt;Az előző screenshot lényege, hogy három különböző felületen is megjelenik ugyanaz a szám: 10502. Hogy ez miért érdekes? Az 10502 a megkötött ügyletek darabszámát jelenti.&lt;br /&gt;&lt;br /&gt;Az ábra jobb oldaláról haladva: legszélén egy Microsoft SQL Server Management Studio látható, amiben a forrásadatbázisnak intézet SQL lekérdezés eredménye a darabszám.&lt;br /&gt;&lt;br /&gt;Ezt követően Oracle Warehouse Builderrel egyszerűen átvittem az ügyleteknek két attribútumát: az azonosítót (ticket) és az ügyfélazonosítót (customer). Még nem végeztem semmiféle transzformációt, ellenőrzést (pl.: csak a már jóváhagyott de még nem törölt ügyletek az érdekesek). Így tehát a komplett tábla átkerült egy Oracle adatbázisba, amihez a screenshot közepén levő Oracle SQL Developerrel csatlakoztam. És láss csodát! Ott is megjelent az 10502 :)&lt;br /&gt;&lt;br /&gt;Ahhoz, hogy a Warehouse Builderrel ezt el tudjam végezni, rá kellett bírni az Oracle szervert, hogy csatlakozzon az SQL Server-hez. Mivel az Oracle adatbázis szerver Linux alatt fut nálam (Oracle Enterprise Linux), ezért ehhez az &lt;a href="http://www.easysoft.com/"&gt;Easysoft&lt;/a&gt; ODBC driver-ét telepítettem.&lt;br /&gt;&lt;br /&gt;Miután átkerültek az adatok az Oracle adatbázis szerverére, az Oracle BI Administration Tool segítségével összeállítottam egy igen egyszerű "üzleti" fogalmat a BIEE szerveren: ügyletek darabszáma (&lt;span style="font-style: italic;"&gt;# of deals&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Majd az Oracle Answers felületen összekattintgattam az ábra bal oldalán szereplő primitív Dashboard-ot.&lt;br /&gt;&lt;br /&gt;Az egésznek a lényege mindösszesen annyi volt, hogy megteremtettem egy "csővezetéket" egy forrás-adatbázis és a végfelhasználó előtti felület, az Oracle Dashboard között.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2193625136830221345?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2193625136830221345/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2193625136830221345' title='2 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2193625136830221345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2193625136830221345'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/05/screenshot-magyarzata.html' title='A screenshot magyarázata'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2549498886516151438</id><published>2008-04-20T13:03:00.005+02:00</published><updated>2008-04-20T13:37:41.597+02:00</updated><title type='text'>És igen!</title><content type='html'>Több napos próbálkozások után végre elértem ezt:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_B53I7cvI5sc/SAsq_O_TevI/AAAAAAAAABk/6hu2RbsND4M/s1600-h/wh.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_B53I7cvI5sc/SAsq_O_TevI/AAAAAAAAABk/6hu2RbsND4M/s400/wh.png" alt="" id="BLOGGER_PHOTO_ID_5191290261318367986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;a következő post-ban részletesen leírom majd, hogy ez miért nagy szám, illetve, hogy mi is ez:)&lt;br /&gt;&lt;br /&gt;(és igen, az Oracle szoftverei erőforrásigényesek. Nagyon.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2549498886516151438?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2549498886516151438/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2549498886516151438' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2549498886516151438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2549498886516151438'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/04/s-igen.html' title='És igen!'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_B53I7cvI5sc/SAsq_O_TevI/AAAAAAAAABk/6hu2RbsND4M/s72-c/wh.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-362588102779754720</id><published>2008-04-05T14:59:00.000+02:00</published><updated>2008-04-05T15:00:13.172+02:00</updated><title type='text'>CDC III. – szinkron vs. aszinkron módok</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }   H2 { margin-bottom: 0.21cm }   H2.western { font-family: "Helvetica"; font-size: 14pt; font-style: italic }   H2.cjk { font-family: "HG Mincho Light J"; font-size: 14pt; font-style: italic }   H2.ctl { font-size: 14pt; font-style: italic }   H3 { margin-bottom: 0.21cm }   H3.western { font-family: "Helvetica" }   H3.cjk { font-family: "HG Mincho Light J" }  --&gt;  &lt;/style&gt;  &lt;h2 class="western" align="justify"&gt;Szinkron CDC&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; Szinkron CDC-nél a forrás-táblákra elhelyezett DML triggerek segítségével lehet a változásokat nyomon követni. Emiatt a változások azonnal bekerülnek a &lt;i&gt;change table&lt;/i&gt;-be, amint a tranzakciók befejeződtek. Ennek megfelelően a CDC-ből adódó extra terhelés a forrás-adatbázist súlytja (triggerek végrehajtási ideje + a&lt;i&gt; change table&lt;/i&gt;-k is a forrás-adatbázisban helyezkednek el).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; Ennél a módnál csak egy előre definiált &lt;i&gt;change source&lt;/i&gt; létezik: &lt;span style="font-family:Courier 10 Pitch;"&gt;SYNC_SOURCE&lt;/span&gt;, ezt nem lehet megváltoztatni, vagy letörölni.&lt;/p&gt; &lt;h2 class="western" align="justify"&gt;Aszinkron CDC&lt;/h2&gt; &lt;p align="justify"&gt; Az aszinkron CDC a forrás-adatbázis redo log file-jaiból szerzi meg a megváltozott adatokat, ezért a loggolás miatti terhelés a forrás-adatbázist terheli.&lt;/p&gt; &lt;h3 class="western" align="justify"&gt;Aszinkron HotLog&lt;/h3&gt; &lt;p align="justify"&gt; Aszinkron HotLog módban az on-line redo log file-ból lehet a változásokat kigyűjteni, kis késéssel a tranzakciók jóváhagyása után. A &lt;i&gt;change table&lt;/i&gt;-k a forrás-adatbázisban kell, hogy elhelyezkedjenek.&lt;/p&gt; &lt;p align="justify"&gt; A loggoló processz (Logwriter process, LGWR) feljegyzéseit a CDC az &lt;a href="http://www.oracle.com/technology/products/dataint/htdocs/streams_fo.html"&gt;Oracle Streams&lt;/a&gt; technológia segítségével dolgozza fel.&lt;/p&gt; &lt;p align="justify"&gt; Ennél a módnál is csak egyetlen, előre definiált &lt;i&gt;change source&lt;/i&gt; létezik: &lt;span style="font-family:Courier 10 Pitch;"&gt;HOTLOG_SOURCE&lt;/span&gt;.&lt;/p&gt; &lt;h3 class="western" align="justify"&gt;Aszinkron Distributed HotLog&lt;/h3&gt; &lt;p align="justify"&gt; Elosztott HotLog módban a CDC tevékenységek fel lettek osztva a forrás-adatbázis és a &lt;i&gt;staging&lt;/i&gt; adatbázis között: a&lt;i&gt; change source&lt;/i&gt;-ok a forrás-adatbázisban definiáltak, míg a &lt;i&gt;change set&lt;/i&gt;-ek már a &lt;i&gt;staging&lt;/i&gt; adatbázisban, tehát a változásokat tartalmazó &lt;i&gt;change table&lt;/i&gt;-k így lehetnek akár más hardveren is, az adatbázis verziója sem kell, hogy megegyezzen. A két rendszer között a kommunikáció az Oracle Net protokollon keresztül zajlik.&lt;/p&gt; &lt;p align="justify"&gt; Ennél a módnál két publisher beállítása is szükséges: egy a forrás-adatbázison, egy pedig a staging-en.&lt;/p&gt; &lt;h3 class="western" align="justify"&gt;Aszinkron AutoLog&lt;/h3&gt; &lt;p align="justify"&gt; AutoLog módban a &lt;i&gt;Redo transport services&lt;/i&gt; által felügyelt redo log file-okból kerülnek kigyűjtésre a megváltozott adatok. Ez a szolgáltatás automatikusan átmásolja az on-line vagy archivált log fájlokat a forrás-adatbázisból a staging területre, ami lehet egy távoli gépen, viszont a futtatott operációs rendszer és adatbázis verzió meg kell, hogy egyezzen.&lt;/p&gt;  &lt;p align="justify"&gt;A megfelelő mód kiválasztásában az alábbi szempontok fontosak:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p align="justify"&gt;A staging terület távoli gépen  van-e (Async distr. hotlog, autolog online/archive) vagy sem (sync,  async hotlog).&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p align="justify"&gt;A megengedhető késés a  változások létrejötte és a &lt;i&gt;change  table&lt;/i&gt;-ben való megjelenésük között  (szinkrontól aszinkron autolog archive-ig folyamatosan nő)&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p align="justify"&gt;A forrás-adatbázisra eső extra  terhelés (szinkrontól aszinkron autolog archive-ig  folyamatosan csökken)&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p align="justify"&gt;Azonos hardveren/operációs  rendszeren fut-e a két adatbázis, azonos-e az Oracle  adatbázisok verziója.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-362588102779754720?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/362588102779754720/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=362588102779754720' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/362588102779754720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/362588102779754720'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/04/cdc-iii-szinkron-vs-aszinkron-mdok.html' title='CDC III. – szinkron vs. aszinkron módok'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5355880702629684937</id><published>2008-04-05T14:55:00.001+02:00</published><updated>2008-04-05T14:58:51.026+02:00</updated><title type='text'>CDC II. – termelő-fogyasztó modell</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt;Az Oracle is a termelő-fogyasztó modell szerint oldja meg a megváltozott adatok kezelését, adattárházba juttatását, PL/SQL csomagokkal megvalósítva: &lt;span style="font-family:Courier 10 Pitch;"&gt;DBMS_CDC_PUBLISH&lt;/span&gt; és &lt;span style="font-family:Courier 10 Pitch;"&gt;DBMS_CDC_SUBSCRIBE&lt;/span&gt;.  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; A termelő általában az adatbázis adminisztrátor (DBA), aki létrehozza és karbantartja a CDC-hez szükséges sémaobjektumokat. Egy módot leszámítva (Distributed HotLog) csak egy termelő van.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; Az Oracle az alábbi CDC fogalmakat definiálja:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;forrás-táblák  (&lt;i&gt;source tables&lt;/i&gt;): azok a forrás-adatbázisban  szereplő táblák, amiknél figyelni akarjuk a  változásokat.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;redo log file-ok:  aszinkron CDC esetén a változásokat a  tranzakciós redo log file-ok alapján gyűjti ki a  rendszer.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;i&gt;change source&lt;/i&gt;:  a forrás-adatbázis logikai reprezentációja&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;i&gt;change set&lt;/i&gt;: a  megváltozott adatoknak egy olyan részhalmaza, ami  garantáltan konzisztens. Egy vagy több &lt;i&gt;change  table&lt;/i&gt;-ből áll.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;i&gt;change table&lt;/i&gt;:  egy olyan tábla, ahová egy adott forrás-táblából  a változások kerülnek.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_B53I7cvI5sc/R_d3NcuN1KI/AAAAAAAAABE/92KcaM0Fqrs/s1600-h/dwhsg127.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_B53I7cvI5sc/R_d3NcuN1KI/AAAAAAAAABE/92KcaM0Fqrs/s400/dwhsg127.gif" alt="" id="BLOGGER_PHOTO_ID_5185744568872457378" border="0" /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;feliratkozás  (&lt;i&gt;subscription&lt;/i&gt;): egy feliratkozás felügyeli a  megváltozott adatokhoz való hozzáférést&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;feliratkozási  ablak (&lt;i&gt;subscription window&lt;/i&gt;): a feliratkozási ablak  határozza meg a sorok azon halmazát, amit a fogyasztó  egy feliratkozási nézetben láthat&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;feliratkozási  nézet (&lt;i&gt;subscription view&lt;/i&gt;): a fogyasztó csak  azokat az adatokat láthatja, amikre a termelő engedélyt  adott.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; A CDC az alábbi előnyöket nyújta:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Garantálja,  hogy minden fogyasztó értesül minden változásról.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Egyszerre több  fogyasztót képes kezelni, megosztott hozzáférést  nyújt a változásokhoz.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Automatikusan  eltávolítja a már nem szükséges  adatokat egy &lt;i&gt;change table&lt;/i&gt;-ből.&lt;/p&gt; &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5355880702629684937?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5355880702629684937/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5355880702629684937' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5355880702629684937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5355880702629684937'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/04/cdc-ii-termel-fogyaszt-modell.html' title='CDC II. – termelő-fogyasztó modell'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_B53I7cvI5sc/R_d3NcuN1KI/AAAAAAAAABE/92KcaM0Fqrs/s72-c/dwhsg127.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2740771804438714450</id><published>2008-04-03T09:57:00.002+02:00</published><updated>2008-04-03T10:03:20.721+02:00</updated><title type='text'>Labor prezentáció</title><content type='html'>A mai napon egy 15 perces bemutató előadást kell tartanom az önálló labor témámról. Az előadás vázlata &lt;a href="http://jutas.eet.bme.hu/%7Ewirving/onlab_prezi_1.pdf"&gt;itt&lt;/a&gt; érhető el.&lt;a href="http://jutas.eet.bme.hu/%7Ewirving/onlab_prezi_1.pdf"&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2740771804438714450?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2740771804438714450/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2740771804438714450' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2740771804438714450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2740771804438714450'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/04/labor-prezentci.html' title='Labor prezentáció'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-737889688413919687</id><published>2008-03-30T14:56:00.002+02:00</published><updated>2008-03-30T15:01:53.379+02:00</updated><title type='text'>Oracle Change Data Capture</title><content type='html'>&lt;style type="text/css"&gt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   H1 { margin-bottom: 0.11cm }   H1.western { font-family: "Arial", sans-serif; font-size: 16pt }   H1.cjk { font-family: "DejaVuSans"; font-size: 16pt }   H1.ctl { font-family: "Arial", sans-serif; font-size: 16pt }   H3 { margin-bottom: 0.11cm }   H3.western { font-family: "Arial", sans-serif; font-size: 13pt }   H3.cjk { font-family: "DejaVuSans"; font-size: 13pt }   H3.ctl { font-family: "Arial", sans-serif; font-size: 13pt }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;Az adattárházakba bizonyos időközönként (tipikusan éjszaka, amikor az OLTP rendszerekre kisebb, vagy épp semmi terhelés jut) be kell tölteni az újonnan keletkezett vagy módosult adatokat. Tehát fontos feladat az új/módosult adatok azonosítása a forrásadatbázisokban. Ennek a megoldásában nyújthat segítséget a CDC (Change Data Capture). &lt;p style="margin-bottom: 0cm;" align="justify"&gt; CDC nélkül két féle módon juthatunk hozzá a változott adatokhoz:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;b&gt;Különbségképzés&lt;/b&gt;  (table differencing): a forrásadatbázisból a  tábla teljes tartalmát a &lt;i&gt;staging adatbázis&lt;/i&gt;ba  másoljuk, ahol az SQL &lt;span style="font-family:Courier New,monospace;"&gt;MINUS&lt;/span&gt;  operátorával lekérdezhetjük az újonnan  be&lt;i&gt;insert&lt;/i&gt;-ált, illetve &lt;i&gt;update&lt;/i&gt;-elt sorokat:&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;p style="margin-left: 2.5cm; margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;SELECT * FROM &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;i&gt;new_version&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 2.5cm; margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;MINUS SELECT * FROM &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;i&gt;old_version&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 2.5cm; margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; Vagy, ha a kitörölt sorokra vagyunk kiváncsiak:&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-left: 2.5cm; margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;SELECT * FROM &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;i&gt;old _version&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 2.5cm; margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;MINUS SELECT * FROM &lt;/span&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;i&gt;new_version&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 2.5cm; margin-bottom: 0cm;" align="justify"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="justify"&gt; Ennek a megközelítésnek a problémái nyilvánvalóak:&lt;/p&gt; &lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Mivel a tábla   teljes tartalmát át kell másolni a két   adatbázis között, ez hatalmas overhead-del jár.&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Magának a   &lt;span style="font-family:Courier New,monospace;"&gt;MINUS&lt;/span&gt; operátor   elvégzésének a számítási   költsége is rendkívül nagy.&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Nem lehet   azonosítani a megváltoztatott, majd az eredeti   értékre visszaállított adatokat.&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Nem lehet   megállapítani, hogy milyen változtatások   történtek egy tranzakción belül.&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;&lt;i&gt;&lt;b&gt;Change-value  selection&lt;/b&gt;&lt;/i&gt;: egy, a forrástáblában levő  speciális oszlop segítségével csak az  előző betöltés óta megváltozott/újonnan  létrehozott sorokat választjuk ki. Egy ilyen oszlop  tipikusan valamilyen időpontot tárol, pl.: &lt;span style="font-family:Courier New,monospace;"&gt;LAST_UPDATE_DATE&lt;/span&gt;.   &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-left: 1.25cm; margin-bottom: 0cm;" align="justify"&gt;Ezzel a következő problémák vannak:&lt;/p&gt; &lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;A megváltozott   adatok azonosításával járó   overhead a forrásadatbázist terheli.&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Ezzel a módszerrel   sem lehet megállapítani, hogy milyen változtatások   történtek egy tranzakcióban.&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;A change-value   alapján történő felosztás finomsága   nem feltétlen megfelelő: például, ha   másodperc finomságú, és az előző   kinyerés mondjuk 10:15:33-kor történt, akkor a   következő kinyeréskor a 10:15:33 utáni   rekordokat fogjuk csak kiválasztani. Tehát ha   ugyanabban a másodpercben történt módosítás,   akkor az el fog veszni.&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt;Gyakorlati   szempontból talán a legnagyobb hátrány   az, hogy a kinyerő mechanizmust figyelembe véve kell   megtervezni a forrástáblákat is, amik   legtöbbször &lt;i&gt;3rd party&lt;/i&gt; adatbázisokban   szerepelnek.&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;h3 class="western"&gt;Megváltozott adatok kinyerése CDC-vel&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt; Az Oracle CDC másfajta megközelítést követ: az &lt;span style="font-family:Courier New,monospace;"&gt;INSERT&lt;/span&gt;, &lt;span style="font-family:Courier New,monospace;"&gt;UPDATE&lt;/span&gt;, és &lt;span style="font-family:Courier New,monospace;"&gt;DELETE&lt;/span&gt; utasítások következtében beállt változásokat rögzíti egy ún. &lt;i&gt;change-table&lt;/i&gt;-ben, amiket utána ellenőrzött módon bocsát az alkalmazások számára.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; A CDC-t két különböző módon lehet használni:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;Szinkron&lt;/b&gt;: a forrástáblákra  elhelyezett triggerek segítségével a DML  utasítások eredményét a módosítás  tranzakciójának részeként rögzíti.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;Aszinkron&lt;/b&gt;: az el&lt;i&gt;commit&lt;/i&gt;-ált  módosításokat tartalmazó &lt;i&gt;redo log&lt;/i&gt;  file alapján nyeri ki a módosult adatokat. Aszinkron  módon háromféleképpen lehet a CDC-t  megvalósítani: HotLog, Distributed HotLog, AutoLog.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-left: 0.64cm; margin-bottom: 0cm;"&gt;Ezekről a módokról a későbbiekben részletesen be fogok számolni.  &lt;/p&gt;  &lt;p style="margin-left: 0.64cm; margin-bottom: 0cm;" align="right"&gt;Forrás: Oracle Data Warehousing Guide&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="justify"&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-737889688413919687?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/737889688413919687/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=737889688413919687' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/737889688413919687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/737889688413919687'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/03/oracle-change-data-capture.html' title='Oracle Change Data Capture'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5061773285740580210</id><published>2008-03-18T20:13:00.007+01:00</published><updated>2008-05-01T17:49:36.430+02:00</updated><title type='text'>Adattárházak</title><content type='html'>"Az adattárház lekérdezésekre és analízisre optimalizált adatbázis." Ezt a tömör definíciót kifejtve az alábbiakat lehetne mondani:&lt;p&gt;&lt;/p&gt; &lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Egy vagy több  különböző, általában &lt;i&gt;OLTP&lt;/i&gt;  (on-line transaction processing)  rendszerben különböző  (általában tranzakciós) adatok keletkeznek,  ezek a rendszerek vagy egymástól függetlenül,  vagy integráltan működhetnek, egymás között  adatokat cserélhetnek.&lt;/li&gt;&lt;/ul&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Ezekből az  adatforrásokból ún. ETL  (Extraction-(Transportation)-Transformation-Loading)  folyamat segítségével egy adattárházat  táplálunk. Az Extraction folyamat során a  szükséges adatokat a forrásadatbázisokban  azonosítjuk, kinyerjük. A kinyert adatokat a  célrendszerbe vagy egy átmeneti rendszerbe (staging  area) szállítjuk (Transportation), ahol feldolgozzuk,  konzisztens formára hozzuk (Transformation). A Loading a  feldolgozott adatok adattárházba töltését  takarja. Fontos megérteni, hogy az ETL egy átfogó  folyamatot takar, nem pedig egy jól meghatározott  lépéssorozatot.&lt;/li&gt;&lt;/ul&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;A cél az,  hogy elsősorban &lt;b&gt;üzleti felhasználók &lt;/b&gt;számára  összesített, konszolidált formában  egységes képet tudjunk adni a rendszerekben található  adatok (a vállalat) &lt;b&gt;egészéről&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;     &lt;a style="color: rgb(0, 0, 0);" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_B53I7cvI5sc/R-AU9QZYWnI/AAAAAAAAAA8/EECklYnNv9k/s1600-h/dw_architecture.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 392px; height: 261px;" src="http://bp3.blogger.com/_B53I7cvI5sc/R-AU9QZYWnI/AAAAAAAAAA8/EECklYnNv9k/s400/dw_architecture.png" alt="" id="BLOGGER_PHOTO_ID_5179162614082067058" border="0" /&gt;&lt;/a&gt;&lt;p style="margin-left: 0.03cm; margin-bottom: 0cm; color: rgb(0, 0, 0);" align="justify"&gt;    Az ábrán egy lehetséges adattárház-architektúra szerepel: a forrásokból származó adatokat először egy ún. staging area-ba töltjük előfeldolgozás, tisztítás céljából (a staging area nem szükségszerűen része egy adattárháznak). Az adattárházaknak fontos részei az &lt;i&gt;összesítések &lt;/i&gt;&lt;span style="font-style: normal;"&gt;(Summaries), amiket az Oracle materializált nézeteknek hív. Az összesítések időigényes aggregálások, számítások előre letárolt eredményei. Végül az adatokat csoportosíthatjuk akár részlegek szerint is: specifikus adattárházakat (data marts) építhetünk a „fő” adattárházunkból.&lt;/span&gt;&lt;/p&gt; &lt;p style="text-indent: 1.27cm; margin-bottom: 0cm; color: rgb(0, 0, 0);" align="justify"&gt;Az adattárházaknak négy fontos tulajdonságuk van:&lt;/p&gt; &lt;ol style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;téma-orientált: egy vállalatot több szervezeti egységre oszthatunk, melyek döntéshozóinak más és más adatokra van szükségük az adott területet vagy a vállalat egészét érintő döntések meghozatalához&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Vállalati szinten integrált: az adattárházakba különböző heterogén forrásokból kerülnek be az adatok, melyeket ahhoz, hogy egyetlen, konzisztens képet tudjanak adni a vállalat egészéről transzformálni, konvertálni kell.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;El nem tűnő: szemben a tranzakciós rendszerekkel, ahol az adatok módosítása, törlése mindennapi művelet, az adattárházakban levő adatok a betöltés után csupán lekérdezhetőek.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: normal;"&gt;Időben változó: minden adattárházban szereplő adat az időnek egy adott pillanatában érvényes&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;        &lt;p style="margin-left: 0.03cm; margin-bottom: 0cm; color: rgb(0, 0, 0);" align="justify"&gt;     Fontos kihangsúlyozni, hogy végső soron az adattárházak felhasználói nem IT-s emberek, hanem általában controllerek, managerek, vezetők, ezért olyan technológiákra is szükség van, amik az adattárházakban levő információkat emészthető formában képesek „tálalni”, ad-hoc módon lekérdezhetővé teszik, azokból jelentéseket, riasztásokat képesek generálni, összefoglalva: az üzleti döntések meghozatalát támogatják.&lt;/p&gt;  &lt;p style="margin-bottom: 0cm; color: rgb(0, 0, 0);" align="right"&gt;Forrás: Oracle Data Warehousing Guide&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5061773285740580210?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5061773285740580210/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5061773285740580210' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5061773285740580210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5061773285740580210'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/03/adattrhzak.html' title='Adattárházak'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_B53I7cvI5sc/R-AU9QZYWnI/AAAAAAAAAA8/EECklYnNv9k/s72-c/dw_architecture.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5777925320797798531</id><published>2008-03-07T20:42:00.003+01:00</published><updated>2008-03-07T20:54:46.035+01:00</updated><title type='text'>Tavasz</title><content type='html'>Megkésve bár, de újult erővel én is ismét belevetem magam az Oracle technológiák gyönyöreibe :)&lt;br /&gt;&lt;br /&gt;Tavaly decemberben abban maradtam Kardkovács Zsolttal, hogy a 2 kredites önálló labor tárgyat akkor nem teljesítem, hanem ebben a félévben a 8 kredites rendszertervezés mellett fogom azt is.&lt;br /&gt;&lt;br /&gt;A rendszertervezés izgalmasnak ígérkezik, ugyanis mind a konzulensek, mind a kollégáim, és én is igen csak hajlok afelé, hogy összekössem a labortémámat a munkámmal: a cégnél fejlesztett szoftvert mint adatforrást felhasználva egy BI rendszert "fölé" tervezni, megvalósítani.&lt;br /&gt;&lt;br /&gt;A következő hét végéig terveim szerint körvonalazódni fog a megvalósítandó feladat, a cél, addig is megpróbálok minél több ismeretet összeszedni az Oracle Data Integratorról, és erről a blogon be is számolnék.&lt;br /&gt;&lt;br /&gt;Külön jó, hogy most tavasszal az &lt;a href="http://eestec.hu/oracle"&gt;Oracle Szemináriumsorozat&lt;/a&gt; témája is a nagyméretű adattárházak és BI rendszerek. Kíváncsian várom, hogy milyen lesz, habár a most csütörtöki számomra egy picit csalódás volt (nagyon semmitmondó volt az előadás).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5777925320797798531?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5777925320797798531/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5777925320797798531' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5777925320797798531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5777925320797798531'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2008/03/tavasz.html' title='Tavasz'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5529753666542234423</id><published>2007-12-06T12:22:00.000+01:00</published><updated>2007-12-06T12:27:56.507+01:00</updated><title type='text'>Összefoglalás</title><content type='html'>Elkészült a két szükséges dokumentáció, ami a féléves munkámat tartalmazza. Sajnos az időhiány nagy úr, egyéb elfoglaltságaim (lakásvásárlás, munka) miatt közel sem sikerült olyan részletességgel feldolgozni a témát, mint ahogy azt eredetileg terveztem.&lt;br /&gt;&lt;br /&gt;A tárgyfelelősnek készült dokumentum &lt;a href="http://users.kerekes.elte.hu/wirwing/orabi_tf.pdf"&gt;itt&lt;/a&gt;, a konzulenseknek készült pedig &lt;a href="http://users.kerekes.elte.hu/wirwing/orabi_1.pdf"&gt;itt&lt;/a&gt; található.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5529753666542234423?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5529753666542234423/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5529753666542234423' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5529753666542234423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5529753666542234423'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2007/12/sszefoglals.html' title='Összefoglalás'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-2275318885679908047</id><published>2007-12-02T18:45:00.000+01:00</published><updated>2007-12-02T18:55:07.905+01:00</updated><title type='text'>BI Publisher</title><content type='html'>Ebben a bejegyzésben az Oracle BI Publisher programjáról szerettem volna írni, de egy rejtélyes hiba ezt meghiúsította: egyszer már kipróbáltam (két kattintás erejéig) a Publisher-t, de mostanra a Microsoft Word-ből eltűnt a menüpontja.&lt;br /&gt;&lt;br /&gt;Az újratelepítés részben segített, a menüpont visszakerült a helyére, de a &lt;span style="font-style: italic;"&gt;Log On &lt;/span&gt;menüpontra kattintva az alábbi hibaüzenet fogad:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_B53I7cvI5sc/R1Lv4N0-xrI/AAAAAAAAAAs/qOZkGX9mHwI/s1600-R/runtime.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_B53I7cvI5sc/R1Lv4N0-xrI/AAAAAAAAAAs/A4ZagosI_64/s320/runtime.png" alt="" id="BLOGGER_PHOTO_ID_5139433873846748850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A Word súgója szerint ennek az lehet az oka, hogy egy szükséges DLL nincs regisztrálva. Az interneten rákeresve a hibaüzenetre, úgy tűnik, nem vagyok egyedül:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://forums.oracle.com/forums/thread.jspa?messageID=2195944"&gt;http://forums.oracle.com/forums/thread.jspa?messageID=2195944&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;ahol egy hozzászóló ad is megoldást: &lt;span style="font-style: italic;"&gt;Uninstalled everything including .net runtime, bip, word. &lt;/span&gt;Ehhez nekem most nincs időm/kedvem :)&lt;br /&gt;&lt;br /&gt;A BI Publisher amúgy egy olyan eszköz lenne, amivel rendkívül rugalmas módon, többféle formátumban, többféle adatforrást felhasználva lehet sablon alapú jelentéseket készíteni. A képernyőmentésen jól látható módon a Microsoft Word-be integráltan lehet&lt;span style="font-weight: bold;"&gt;ne&lt;/span&gt; használni, már amikor működik :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-2275318885679908047?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/2275318885679908047/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=2275318885679908047' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2275318885679908047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/2275318885679908047'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2007/12/bi-publisher.html' title='BI Publisher'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_B53I7cvI5sc/R1Lv4N0-xrI/AAAAAAAAAAs/A4ZagosI_64/s72-c/runtime.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-3294297455367210604</id><published>2007-11-18T17:54:00.000+01:00</published><updated>2007-11-18T17:59:22.982+01:00</updated><title type='text'>Oracle Delivers</title><content type='html'>Az Oracle Delivers egy olyan eszköz, aminek a segítségével bizonyos feltételek teljesülése esetén adott tartalmú üzeneteket lehet eljuttatni a címzetteknek.&lt;br /&gt;&lt;br /&gt;A feltétel lehet időbeli – minden héten hétfőn reggel 7:30-kor – vagy logikai jellegű. Az időbeli feltételeket a Scheduler kezeli, a megadott időpontokban elindítja az iBot-nak nevezett „programokat”. Segítségével be lehet állítani, hogy mikortól kezdve hány órakor, milyen gyakorisággal (egyszeri, napi, heti, havi) és meddig indítsa el az iBot-ot, azaz mi az iBot élettartama.&lt;br /&gt;&lt;br /&gt;Például lehet egy olyan – az Answers felületen összeállított – táblázatunk, amik az eladási statisztikák változásait mutatják havi bontásban. Valós igény lehet az, hogy bizonyos személyek e-mailben megkapják ezeket a táblázatokat, színkódokkal jelezve a kimagaslóan jó/rossz értékeket.&lt;br /&gt;&lt;br /&gt;Logikai jellegű feltételek esetén (Conditional iBot) az iBot-hoz egy filtert lehet csatolni. A filterek az Answers felületen összeállított request-ek találatait szűkítik. Egy conditional iBot akkor fut le (akkor tekinthető triggereltnek), ha a request legalább egy találatot ad vissza.&lt;br /&gt;&lt;br /&gt;Ennek a gyakorlati alkalmazására példa lehet a romló statisztikák esetén történő figyelmeztetés. Például minden hónap elején lehetőség van arra, hogy figyelmeztetést küldjünk az illetékes manager-eknek, ha valamilyen mutató (pl.: előző hónapban eladott mennyiség) egy adott érték alá csökken.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_B53I7cvI5sc/R0BvFZM5HCI/AAAAAAAAAAk/wcqDgsHLTLA/s1600-h/ibot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_B53I7cvI5sc/R0BvFZM5HCI/AAAAAAAAAAk/wcqDgsHLTLA/s320/ibot.png" alt="" id="BLOGGER_PHOTO_ID_5134225713657355298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Az eddig említett lehetőségeken felül arra is mód van, hogy egy iBot bemenő feltétele egy másik iBot futási eredménye legyen (chained iBot). Ezt úgy lehetne gyakorlatiasabban megfogalmazni, hogy ha az első iBot feltétele nem teljesül (a filterrel ellátott request nem ad vissza egyetlen sort sem), akkor nem történik semmi. Ha ez a feltétel teljesül, akkor lefut az első iBot (pl.: e-mail értesítést küld), majd elindít egy másik iBot-ot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-3294297455367210604?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/3294297455367210604/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=3294297455367210604' title='1 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/3294297455367210604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/3294297455367210604'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2007/11/oracle-delivers.html' title='Oracle Delivers'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_B53I7cvI5sc/R0BvFZM5HCI/AAAAAAAAAAk/wcqDgsHLTLA/s72-c/ibot.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-1700083859412451252</id><published>2007-10-22T20:02:00.000+02:00</published><updated>2007-10-22T20:20:51.186+02:00</updated><title type='text'>Adattárolás - megjelenítés</title><content type='html'>&lt;blockquote&gt;"Az Üzleti intelligencia megoldások magukban foglalják tehát az adattárolási, a valós idejű lekérdezési, analitikai, előrejelzési és adatbányászati eljárások modern formáit."&lt;/blockquote&gt;Ebben a bejegyzésben az adattárolás, adatokhoz való hozzáférés, és a megjelenítés lehetőségeit szeretném bemutatni Oracle Business Intelligence Challenge 2 Go Enterprise Edition (&lt;a href="http://bic2g.oracle.com/"&gt;BIC2G&lt;/a&gt;) környezetben.&lt;br /&gt;&lt;br /&gt;A BIC2G egy előre telepített, konfigurált üzleti intelligencia csomag, számos kulcsra kész példával, amik közül a Sales History-n (SH) keresztül a legegyszerűbb az alapok bemutatása.&lt;br /&gt;&lt;br /&gt;A Sales History adatbázis-séma - mint ahogy a neve is mutatja - értékesítési adatokat tartalmaz különféle termékekre vonatkozóan. A példában ezt egy Oracle 10g adatbázis-szerver tárolja, de tetszőleges ODBC vagy XML adatforrást is választhattunk volna. Az adatbázisban a termékeket a &lt;code&gt;PRODUCTS&lt;/code&gt; tábla tartalmazza, fontosabb mezők: &lt;code&gt;PROD_ID, PROD_NAME, PROD_CATEGORY, PROD_SUBCATEGORY, ...&lt;/code&gt;, az eladási információkat pedig a &lt;code&gt;SALES&lt;/code&gt; tábla: &lt;code&gt;PROD_ID, CUST_ID, TIME_ID, QUANTITY_SOLD, AMOUNT_SOLD&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_B53I7cvI5sc/RxzmNRoh3uI/AAAAAAAAAAM/qnU58j1jHz4/s1600-h/sh_db.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 197px;" src="http://bp0.blogger.com/_B53I7cvI5sc/RxzmNRoh3uI/AAAAAAAAAAM/qnU58j1jHz4/s320/sh_db.png" alt="" id="BLOGGER_PHOTO_ID_5124223591786864354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A fizikai adattárolás és a megjelenítés közötti kapcsolatot az Oracle BI Administration segédprogram segítségével teremthetjük meg:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_B53I7cvI5sc/RxzmoRoh3vI/AAAAAAAAAAU/dGoPlt62F1U/s1600-h/admin.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_B53I7cvI5sc/RxzmoRoh3vI/AAAAAAAAAAU/dGoPlt62F1U/s320/admin.png" alt="" id="BLOGGER_PHOTO_ID_5124224055643332338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Például érdekelhet minket az összes eladott termék darabszáma, vagy a különböző vásárlók száma. Ezeket a fogalmakat az Administration Tool segítségével képezhetjük le az adatbázis megfelelő relációira: &lt;code&gt;SUM(SALES.AMOUNT_SOLD)&lt;/code&gt; és &lt;code&gt;COUNT(DISTINCT SALES.CUST_ID)&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Vagy egy kicsit összetettebb példa lehet az eladott termékek számának százalékos változása az előző hónaphoz képest:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;case    when sum(SALES.AMOUNT_SOLD) &lt;&gt; 0&lt;br /&gt;and (sum(SALES Mago.AMOUNT_SOLD) = 0&lt;br /&gt;or sum(SALES Mago.AMOUNT_SOLD) is null)&lt;br /&gt;and not sum(SALES.AMOUNT_SOLD) is null&lt;br /&gt;then 100.0&lt;br /&gt;when (sum(SALES.AMOUNT_SOLD) = 0&lt;br /&gt;or sum(SALES.AMOUNT_SOLD) is null)&lt;br /&gt;and (sum(SALES Mago.AMOUNT_SOLD) = 0&lt;br /&gt;or sum(SALES Mago.AMOUNT_SOLD) is null)&lt;br /&gt;then 0.0&lt;br /&gt;when sum(SALES Mago.AMOUNT_SOLD) &lt;&gt; 0&lt;br /&gt;and not sum(SALES Mago.AMOUNT_SOLD) is null&lt;br /&gt;and sum(SALES.AMOUNT_SOLD) is null&lt;br /&gt;then -100.0&lt;br /&gt;else (sum(SALES.AMOUNT_SOLD) - sum(SALES Mago.AMOUNT_SOLD))&lt;br /&gt;  * 100.0 / nullif( sum(SALES Mago.AMOUNT_SOLD) , 0)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Az Oracle Answers segítségével reportokat készíthetünk, amiknek az eredményét az interaktív Dashboard felületen tekinthetjük meg: például lekérdezhetjük azon termékeket, amiknek a neve "Mini DV"-vel kezdődik:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_B53I7cvI5sc/RxznlRoh3wI/AAAAAAAAAAc/n5rnslWntfw/s1600-h/answers.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_B53I7cvI5sc/RxznlRoh3wI/AAAAAAAAAAc/n5rnslWntfw/s320/answers.png" alt="" id="BLOGGER_PHOTO_ID_5124225103615352578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wirving.beats.hu/bi/dashboard.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://wirving.beats.hu/bi/dashboard.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ennél egy fokkal hasznosabb példa lehet az egyes kategóriákban szereplő termékek eladási mennyiségeinek változását egy diagrammon megjeleníteni az elmúlt 12 hónapra vetítve. Ehhez szükségünk van az alábbi megjelenítési rétegbeli fogalmakra: termék kategória (Prod Category), hónap (Calendar Month Name a megjelenítéshez ill. Desc a rendezéshez), eladott mennyiség (Amount Sold), illetve egy szűrőre, ami azt mondja meg, hogy csak az utolsó 12 hónap adataira vagyunk kiváncsiak. Ezt úgy írhatjuk le SQL nyelven, hogy &lt;code&gt;Calendar."Calendar Month Id" between VALUEOF(maxMonthID)-11 and valueof(maxMonthID)&lt;/code&gt;, ahol a maxMonthID egy ún. Repository Variable, ami az értékét egy függvénytől (Repository Variable Init Block) kapja: &lt;code&gt;select TIME_ID, CALENDAR_YEAR, CALENDAR_MONTH_DESC, CALENDAR_MONTH_ID from TIMES WHERE TIME_ID = (select max(TIME_ID) from SALES)&lt;/code&gt;, azaz azon legutolsó hónap azonosítója, amire van értékesítési adat (a SALES táblában).&lt;br /&gt;&lt;br /&gt;Ezeket az elemeket az Answers felület Criteria részén pillanatok alatt össze tudjuk kattintani:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wirving.beats.hu/bi/answers_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://wirving.beats.hu/bi/answers_2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Megjelenítésnek egy vonalas Chart-ot választva szemléltethetjük a legjobban az eladási statisztikák alakulását:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wirving.beats.hu/bi/answers_3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://wirving.beats.hu/bi/answers_3.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A különféle chart-ok (Vertical/horizontal bar, bubble, line, pareto, pie, radar, scatter, area) helyett választhatunk akár szöveges táblázatokat is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-1700083859412451252?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/1700083859412451252/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=1700083859412451252' title='1 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1700083859412451252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1700083859412451252'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2007/10/az-zleti-intelligencia-megoldsok.html' title='Adattárolás - megjelenítés'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_B53I7cvI5sc/RxzmNRoh3uI/AAAAAAAAAAM/qnU58j1jHz4/s72-c/sh_db.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-1557128241446766750</id><published>2007-10-03T20:44:00.001+02:00</published><updated>2007-10-03T21:02:50.137+02:00</updated><title type='text'>Üzleti intelligencia</title><content type='html'>&lt;blockquote&gt;,,Az üzleti intelligencia a rend és a tisztánlátás megteremtésén keresztül a megértés és a tudás megszerzésének az eszköze egy vállalaton belül.''&lt;/blockquote&gt;Ezt a definíciót Sipos Ferenc, az IQSYS Informatikai Rt. igazgatója adta a Napi Gazdaság egyik interjújában. Ahhoz, hogy megérthessük ezt az igencsak jól hangzó mondatot, először tisztán kell látni, hogy mi is történik egy vállalaton belül, mik is azok az üzleti folyamatok.&lt;br /&gt;&lt;br /&gt;Már Magyarországon is bő 10-15 éve meghatározó szerepe van az informatikának a vállalatok - elsősorban a pénzintézetek - életében. Ma egy cég sem tud versenyképesen működni informatika nélkül, már 1-2 hetes rendszerleállás is komoly (fatális) veszteségeket okoz. Ennek köszönhetően egyre több gyártó készít "üzleti" (business) szoftvereket, amiknek a célja a vállalat folyamatainak irányítása, menedzselése. Vagy nem.&lt;br /&gt;&lt;br /&gt;Ugyanis - ahogy Alexander Ryan egy &lt;a href="http://www.visualocity.net/articles/whatIsABusinessProcess.jsp"&gt;publikációjában&lt;/a&gt; rámutat - az informatikában és az üzleti világban az "üzleti folyamat" (&lt;a href="http://en.wikipedia.org/wiki/Business_process"&gt;business process&lt;/a&gt;) mást jelent. Talán a legáltalánosabb tévedés az, amikor a "munkafolyamattal" (&lt;a href="http://en.wikipedia.org/wiki/Workflow"&gt;workflow&lt;/a&gt;) keverik össze, ami egy manuális folyamat automatizálása egy vagy több szoftver segítségével. Például egy pénzügyi rendszerben egy ügylet rögzítésekor, vagy könyveléskor számtalan folyamat indulhat meg a háttérben, amiket az adott program menedzsel.&lt;br /&gt;&lt;br /&gt;Ezzel szemben az üzleti folyamat egy adott üzleti cél elérésének érdekében tett összefüggő cselekvések rendezett sorozata. Az üzleti folyamatoknak három típusát különböztethetjük meg:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;irányító folyamatok (management processes): azok a folyamatok, amik a cég működését irányítják. Például: stratégiai tervezés, operatív irányítás, pénzügyi menedzsment&lt;/li&gt;&lt;li&gt;alapfolyamatok (operational processes): ezek azok a folyamatok, amik az elsődleges értéket (primary value) állítják elő egy cégen belül. Ilyenek például: beszerzés, termelés, marketing, sales.&lt;/li&gt;&lt;li&gt;támogató folyamatok (support processes): tipikusan az alapfolyamatokat támogatják. Például: IT-support, könyvelés, munkaerő toborzás.&lt;/li&gt;&lt;/ul&gt;Jelentős különbség a munkafolyamatokkal szemben az, hogy az üzleti folyamatok tipikusan egy magasabb absztrakciós szintet képviselnek.&lt;br /&gt;&lt;br /&gt;Itt jön a képbe az üzleti intelligencia (&lt;a href="http://en.wikipedia.org/wiki/Business_intelligence"&gt;business intelligence&lt;/a&gt;) fogalma: &lt;a href="http://www.controllingportal.hu/?doc=szerkrov&amp;amp;sz=5"&gt;Korcsmáros István&lt;/a&gt; szerint amikor egy vállalat az üzletmenetük automatizálásán (&lt;a href="http://en.wikipedia.org/wiki/Workflow"&gt;workflow&lt;/a&gt;) túl döntéshozatali eljárásaik (management processes) elősegítése céljából is igénybeveszi az informatikát, akkor már üzleti intelligenciáról beszélhetünk. Ez valójában csak egy része azon területeknek, amikről az üzleti intelligencia szól.&lt;br /&gt;&lt;br /&gt;Az ugyanis egy ún. ernyő-fogalom, ami csomó technológiát és megoldást foglal magába. A &lt;a href="http://www.controllingportal.hu/?doc=it_olap"&gt;Controlling Portál&lt;/a&gt; az alábbi definíciót adja: ,,olyan alkalmazások és technológiák, amik a szükséges adatokhoz való hozzáférés biztosításával, ezen adatok megfelelő tárolásával, valamint sokoldalú elemzési lehetőségekkel támogatják a vállalati döntéshozatalt. Az Üzleti intelligencia megoldások magukban foglalják tehát az adattárolási, a valós idejű lekérdezési, analitikai, előrejelzési és adatbányászati eljárások modern formáit.''&lt;br /&gt;&lt;br /&gt;Az elkövetkezendő félévben ezeket a megoldásokat fogom részletesebben megvizsgálni, elsősorban az Oracle által készített (vagy felvásárolt) termékekre koncentrálva.&lt;br /&gt;&lt;br /&gt;Kapcsolódó linkek:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.napi.hu/default.asp?cCenter=article.asp&amp;amp;nID=242582"&gt;http://www.napi.hu/default.asp?cCenter=article.asp&amp;amp;nID=242582&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.visualocity.net/articles/whatIsABusinessProcess.jsp"&gt;http://www.visualocity.net/articles/whatIsABusinessProcess.jsp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.fn.hu/cikk/00140000/145435/uzleti_intelligencia_mar_nem_titkos.php"&gt;http://www.fn.hu/cikk/00140000/145435/uzleti_intelligencia_mar_nem_titkos.php&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.controllingportal.hu/?doc=it_olap"&gt;http://www.controllingportal.hu/?doc=it_olap&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-1557128241446766750?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/1557128241446766750/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=1557128241446766750' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1557128241446766750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/1557128241446766750'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2007/10/zleti-intelligencia.html' title='Üzleti intelligencia'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2927635047077701915.post-5041766413231768304</id><published>2007-09-26T19:54:00.000+02:00</published><updated>2007-09-26T20:02:38.968+02:00</updated><title type='text'>Bemutatkozás</title><content type='html'>Ez a blog elsősorban abból a célból jött létre, hogy a BME-n tartott önálló labor című tárgy kapcsán lehetőség legyen az on-line kapcsolattartásra, információ-áramlásra a konzulensek (Kardkovács Zsolt (BME), Sárecz Lajos (Oracle) és Fekete Zoltán (Oracle)) és köztem.&lt;br /&gt;&lt;br /&gt;Ennek "mellékhatásaként" viszont remélhetőleg egy olyan magyar nyelvű forrás jöhet létre, amit más - a téma iránt érdeklődő - is hasznosnak találhat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2927635047077701915-5041766413231768304?l=orabusiness.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orabusiness.blogspot.com/feeds/5041766413231768304/comments/default' title='Megjegyzések küldése'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2927635047077701915&amp;postID=5041766413231768304' title='0 megjegyzés'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5041766413231768304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2927635047077701915/posts/default/5041766413231768304'/><link rel='alternate' type='text/html' href='http://orabusiness.blogspot.com/2007/09/bemutatkozs.html' title='Bemutatkozás'/><author><name>Zoltan Tanczos</name><uri>http://www.blogger.com/profile/03257428705248645207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
