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 ;-)