Oracle OCI tablicy pobrać prostych typów danych?

głosy
1

Nie mogę zrozumieć w dokumentacji Oracle. :-(

Czy ktoś wie jak się pobrać wiele wierszy prostych danych Oracle za pośrednictwem OCI?

Obecnie używać OCIDefineByPosdo określenia pojedynczych zmiennych (tylko trzeba to zrobić w prosty całkowite - SQLT_INT/ 4-bajtowe ints), a następnie pobrać jeden wiersz w czasie z OCIStmtExecute/ OCIStmtFetch2.

To jest OK dla małych ilości danych, ale to trwa około .5ms w rzędzie, więc po przeczytaniu kilku dziesięć tysięcy wierszy to jest zbyt powolny.

Ja po prostu nie rozumiem w dokumentacji OCIBindArrayOfStruct. Jak mogę pobrać kilka tysięcy wierszy na raz?

Utwórz 19/09/2008 o 09:49
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
3

Pan spojrzał na przykładowy kod w $ ORACLE_HOME / OCI / próbek (jeśli nie zostały one zainstalowane, a następnie uruchom instalator Oracle i poinformować go zainstalować przykładowy kod). Istnieje kilka, które wykorzystują interfejsy masowych.

może warto poważnie rozważyć przy użyciu biblioteki zamiast. Mam zakodowane Pro * C (nienawidzę), prosto OCI i wykorzystywane bibliotek 3rd party. Ostatni jest najlepszy, z dużym marginesem. Składnia OCI jest bardzo owłosione i ma opcje będą prawdopodobnie nigdy nie używać. Jednocześnie jest to bardzo, bardzo sztywne i rozbije swój kod, jeśli robisz rzeczy nawet nieco źle.

Jeśli używasz C ++ to mogę polecić OTL ; Zrobiłem jakieś poważne testowanie wydajności i OTL jest tak samo szybko, jak kodowanie strony o ogólnym przypadku (można go pobić o 5-10%, jeśli wiesz na pewno, że nie masz żadnych wartości null w danych, a tym samym nie trzeba wskaźnik tablice). Uwaga - nie starają się zrozumieć kod OTL. Jest to dość ohydne. Ale to działa naprawdę dobrze.

Istnieją również liczne biblioteki C, które obecnie nie zawijać OCI i uczynić go bardziej użyteczny i mniej prawdopodobne, aby cię ugryźć, ale nie testowałem żadnej z nich.

Jeśli nic innego, zrobić sobie przysługę i napisać funkcji otoki kodu OCI, aby ułatwić. Zrobiłem to w moim scenariuszu wysokiej wydajności i to drastycznie zmniejszyć liczbę problemów miałem.

Odpowiedział 19/09/2008 o 13:09
źródło użytkownik

głosy
2

Można użyć OCIDefineArrayOfStructobsługuje pobierania tablic rekordów. Można to zrobić poprzez przepuszczenie podstawę do tablicy OCIDefineByPosi używać OCIDefineArrayOfStructpowiedzieć Oracle o wielkości zapisów (skip rozmiaru). Wierzę, że wtedy zadzwonić OCIFetchinformując go sprowadzić rozmiaru tablicy.

Alternatywą jest ustawiony atrybut oświadczeniem OCI_ATTR_PREFETCH_ROWS, zanim zostanie wykonany. Mówi Oracle ile wierszy pobrać na raz, to domyślnie do 1. Stosując to podejście, Oracle sprawia mniej wycieczki okrągłe i buforuje wiersze dla Ciebie.

OCIBindArrayOfStructjest używany z instrukcji DML. To działa w podobny sposób, aby OCIDefineArrayOfStructoprócz tego, że pracuje ze zmiennymi bind.

Można znaleźć przykładowy kod na stronie Oracle.

Odpowiedział 28/09/2008 o 20:31
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more