Weblog @ rebex.cz

Weblogy na webu Rebexu
Welcome to Weblog @ rebex.cz Sign in | Help
in Search

Weblog @ Rebex.cz :: Martin Vobr

weblog o vývoji v dotnetu

Srovnání providerů pro přístup k Oraclovým databázím a poznámky k vývoji v .NETu nad Oraclem

Pokud chcete v .NETu přistupovat k Oraclovým databázím máte několik možností jak na to jít. Můžete přistupovat přes OLEDB provider, přes ODBC via OLEDB. V .NETu 1.1 přidal Microsoft speciální provider pro Oracle a konečně můžete využít ODP.NET - originální .NETový provider od Oraclu.

Poslední dvě možnosti srovnává článek nedávno vydaný na MSDN Comparing the Microsoft .NET Framework 1.1 Data Provider for Oracle and the Oracle Data Provider for .NET. Docela podrobné a dlouhé čtení.

Protože poslední půl rok se s přístupem k Oraclu přes ODP.NET potkávám prakticky denně dovolím si ještě pár poznámek. Třeba někomu pomůžou v začátcích.

  • S PL/SQL se pracuje fakt příjemně. Packages (“modul" nebo hromada uložených procedur v jednom balíčku který se nasazuje společně), outer join zapisovaný přes (+) za nullovatelným sloupcem přes který jsou tabulky svázané a používání rownum v selectech jsou tři věci které by se mi v MS SQL Serveru docela líbily.
  • Bez pořádného editoru pro psaní dotazů jako je třeba TOAD se těžko obejdete. Dodávaný SQL*Plus je pro mne nepoužitelná příšernost. Chápu, že na unixu se editace dělá v externím editoru, ale ta Windowsí verze je běs. Zlatý isqlw.exe z MS SQL.
  • Oracle je mocný a složitý. Složitost s sebou bohužel nese docela překvapivě docela dost chyb. Namátkou: ODP.NET při použití referenčních kurzorů začal při zátěži házet interní chybu driveru 3000 a pomohl jen restart procesu. Namátkou 2: Distribuované selecty do více databází uvnitř package spolu s určitou kompinací přístupových práv k tabulkách, vlastníka package a uživatele volajícím package způsobí opět interní chybu. Pokud ale uvnitř package použijete místo
      SELECT table1.a, table2.b from table1, table2
    raději
      SELECT * from ( SELECT table1.a, table2.b from table1, table2)
    tak to začne fungovat. Zvláštní. Nikdy jsem předtím s Oraclem intenzivně nedělal ale měl jsem dojem že má pověst něčeho stabilního jak skála. Jakto že během půl roku narazím při vývoji na dvě zdokumentované chyby? Za těch pár let co píšu nad SQL serverem se mi to stalo snad jednou. (Uznávám ale že takové psí kusy nad tak složitou infrastrukturou jako teď nad Oraclem jsem s MS SQL Serverem nedělal)
  • Pokud máte uloženou proceduru která má výstupní parametr typu referenční kurzor (REF CURSOR) musíte vrátit kurzor vždy - i kdyby byl prázdný. Takové procedury se dobře používají třeba pro plnění datasetů. Výše uvedený požadavek zní logicky, ale už jsem viděl pár procedur které byly napsané tak, že zkontrolovaly vstupní parametry a v případě že byly chybné tak žádný kurzor nevrátily. Místo prázdného datasetu se ale objeví exception.

    Prázdný referenční kurzor se dá vrátit například takto:
    OPEN P_REF CUR FOR
    SELECT NULL FROM DUAL;
  • To, že slovo Orákulum a Oracle zní hodně podobně není náhoda a zkušený věštec či databázový žrec se při hledání zdroje problému docela hodí. Mějte svého Oraclího gurua na dosah ;-)


Published 21. října 2004 16:58 by martinv

Comments

 

martinv said:

Jen par poznamek:
- PL/SQL je nesrovnatelne lepsi nez TSQL
- join pres (+) - to bych rekl, ze by byl krok zpet
- SQL*Plus neni jen "utilita" je to spise vlastni jazyk, bez ktereho se ale nelze obejit (napr. pro DML) zminovana utilita je pak jeho interpretem. TOAD je dobry nastroj, subjektivne bych rekl, ze PL/SQL Developer http://www.allroundautomations.com je pro vyvojare lepsi.
- Chyb v Oracle je hodne (staci se podivat na kazdy PatchSet a jima mne hruza, co vsechno to predtim delalo spatne a co jeste spatne delat bude). Nektere jsou naprosto nepochopitlne (napr. to, ze OLEDB provider zere vsechny CRLF a rovnez Mezery v dotazech).
- I preste ta stabilita se neda srovnavat. Oracle (na Linuxu) proste bezi a neni treba se o to starat. MSSQL na Windows proste po delsi dobe je treba restartovat i s celym pocitacem, nebot se to zacne hlasit divne chyby, bezi pomalu apod.
- Co mne na Oracle nejvic stve je NUTNOST optimalizace SQL dotazu. Oracle Optimizer je nazev naprosto nevhodny pro tu brzdu, kterou pro vyhodnocovani dotazu Oracle ma. Na druhou stranu na MSSQL kdyz neco bezi pomalu, tak se to optimalizovat neda, na Oracle to po tydnu "vedeckeho experimentovani metodou pokus omyl" rychle bude.
října 21, 2004 21:41
 

martinv said:

Dik za vyzivny komentar.

- "PL/SQL je nesrovnatelne lepsi nez T-SQL" - souhlasim.

- "join pres (+) krok zpet" - to mne zajima. Proc? Mne to prijde o dost prehlednejsi - zejmena kdyz mam tech outer joinu v jednom dotazu vice.

- "stabilita" - v tomhle bode mame zkusenosti ruzne. S MS SQL jsem zadne takove problemy nemel, ale je fakt ze ty scenare pouziti byly o dost jine nez ted s Oraclem.

- "nutnost hintovat" - to je dobra pripominka. Taky mne to prekvapilo. Ale zase sem si zavzpominal na doby kdy jsme psali aplikaci nad jakousi nonejmovou databazi optimalizovanou pro beh z CD. Strukturu databaze jsme dostali zadanou a zrovna optimalizovana na vykon nebyla. Napsal jsem select, ktery byl logicky spravne, ale po sesti hodinach nedobehl. I prisel k tomu kolega, sedl a po zhruba tydnu ladeni, nespocetnem mnozstvi cigaret a kafi se vratil ze sveho mentalniho exilu a prisel s funkcne ekvivalentnim selectem ktery uspesne skoncil za 20 sec. Dodnes nechapu jakou samanskou praktikou to dokazal.
října 21, 2004 21:58
 

martinv said:

Ad (+)

Dokumentace:
Oracle Corporation recommends that you use the ANSI OUTER JOIN syntax rather than the Oracle join operator. Outer join queries that use the Oracle join operator (+) are subject to the following rules and restrictions, which do not apply to the ANSI syntax:

You cannot specify the (+) operator in a query block that also contains ANSI JOIN syntax.

The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.

If A and B are joined by multiple join conditions, you must use the (+) operator in all of these conditions. If you do not, Oracle will return only the rows resulting from a simple join, but without a warning or error to advise you that you do not have the results of an outer join.

The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain a column marked with the (+) operator.

A condition containing the (+) operator cannot be combined with another condition using the OR logical operator.

A condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.

A condition cannot compare any column marked with the (+) operator with a subquery.

If the WHERE clause contains a condition that compares a column from table B with a constant, the (+) operator must be applied to the column so that Oracle returns the rows from table A for which it has generated NULLs for this column. Otherwise Oracle will return only the results of a simple join.

In a query that performs outer joins of more than two pairs of tables, a single table can be the null-generated table for only one other table. For this reason, you cannot apply the (+) operator to columns of B in the join condition for A and B and the join condition for B and C.

Praxe:
- je to kompatibilni s MSSQL a take s dalsimi databazovymi stroji
- je to omezene zejmena v nemoznosti spojovat pres konstatni vyrazy (napr ON E.SEX = "2x")
října 22, 2004 0:27
 

martinv said:

Zajimave, to jsem nevedel. Diky.
října 22, 2004 0:32
 

martinv said:

Jenom drobnost k te (+) syntaxi (doufam, ze to jiz nekdo neuvadel, cely thread jsem necetl). MSSql ma tuto syntaxi taky, *=*, hvezdicky muzou byt vlevo/vpravo/vsude s vyznamem stejnym jako u ora.

RH
října 22, 2004 21:12
New Comments to this post are disabled

This Blog

Syndication

News

Chcete koupit ojeté auto a chcete ho nechat prohlédnout někým kdo tomu rozumí a komu můžete věřit? Zkuste mého kamaráda Michala Ráže - Poradce při koupi ojetého vozu

ComponentForge (aka Safabyte) sells components stolen from Rebex and other .NET component vendors.

Uz jste vyzkoušeli naší komponentu pro práci s formátem ZIP s hromadou ukázek v jazycích C# a VB.NET?

Inspirace na výlet: Stubaiské Alpy - jak je zažili Honza a Mišák.

Powered by Community Server (Personal Edition), by Telligent Systems